janina schrieb:
> Hallo,
> nimmste die Formel für lineare Funktion:
> y=m*x+h
Nope. Nicht.
(Ich weiss, der Thread ist schon alt. Aber da eine Frage dazu
aufgetaucht ist).
Das ist die schlechteste Möglichkeit, wie du in der Geometrie eine
Gerade ausdrücken kannst. Du wandels von einem Sonderfall zum nächsten.
Und Tangens, Sinus, Cosinus braucht dazu kein Mensch.
Das Zauberwort heißt Vektorarithmetik und als Geradengleichung nimmt man
eine Vektorgleichung (hört sich schlimmer an als es ist)
gegeben 2 Punkte P0 und P1
Die Gerade durch diese Punkte erfüllt die Gleichung
G = P0 + t * (P1 - P0)
(wobei t eine Laufvariable ist)
(Das Ding heißt Vektor Gleichung, weil die Punkte G, P0 und P1 Vektoren
mit [in diesem Fall] 2 Komponenten x und y sind. Es gibt daher in
Wirklichkeit eigentlich 2 Gleichungen, für jede Komponente eine
G.X = P0.X + t * (P1.X - P0.X)
G.Y = P0.Y + t * (P1.Y - P0.Y)
da die beiden Gleichungen aber im Prinzip gleich sind, muss man sie
nicht nach Komponenten aufschlüsseln, sondern kann ganz einfach mit den
Punkten als Vektoren arbeiten)
Die Parallele zur Geraden P1->P0 erhält man am einfachsten, indem man
die beiden Punkte mit dem gewünschten Abstand veschiebt und eine neue
Gerade konstruiert.
dP = | P1 - P0 | # Einheitsvektor von P0 nach P1 bestimmen
dN.X = dP.Y # den Vektor um 90° drehen
dN.Y = -dP.X #
P3 = P0 + dist * dN # und die beiden Punkte bestimmen
P4 = P1 + dist * dN
Die parallele Gerade hat dann die Form
Gp = P3 + t * (P4 - P3)
für den Ausdruck P4 - P3 schreibe ich in weitere Folge dP
Die Kreisgleichung ist ok
x^2 + y^2 + r^2 = 0
für r wird der um dist vergrößerte Radius eingesetzt.
Im Schnittpunkt GpS muss es daher ein ts geben, sodass der Punkt GpS
sowohl auf der Geraden als auch auf dem Kreis liegt.
Der Punnkt GpS hat also die Koordinaten
GpS = P3 + ts * dP
diesen Punkt in die Kreisgleichung eingesetzt (denn der Punkt GpS muss
ja nicht nur auf der Geraden liegen sondern auch auf dem Kreis - er muss
die Kreisgleichung erfüllen. Auf der Geraden liegt er sowieso - er wurde
ja so konstruiert, das er drauf liegt)
GpS.X^2 + GpS.Y^2 + (r + dist)^2 = 0
GpS in seine Definition aufdröseln
(P3.X + ts*dP.X )^2 + (P3.Y + ts*dP.Y)^2 + (r + dist)^2 = 0
nach ts umformen und man kriegt eine quadratische Gleichung, die die
beiden Lösungen für ts angeben.
Die beiden Werte für ts werden jetzt numerisch bestimmt. Danach
einsetzen in
Gp = P3 + ts*dP
und wir haben numerisch die Koordinaten der gesuchten Punkte (es gibt 2)
Man nimmt dann diejenige Lösung, die näher um ursprünglichen Endpunkt
der Geraden liegt.
Einen Fall gilt es noch zu berücksichtigen.
Wir haben bis jetzt so getan, als ob der Kreis mit seinem Mittelpunkt Km
im 0-Punkt liegen würde. Das wird er natürlich nicht tun.
Das 'Problem' lösen wir, indem wir die Problemstellung aus der
allgemeinen Lage in die 0-Lage (Km == 0) verlagern.
Die ursprünglichen Geradenpunkt Ps und Pe ergeben dann die Punkte P0 und
P1 durch
P0 = Ps - Km
P1 = Pe - Km
.... danach berechnen wir den Lösungspunkt und transformieren die Lösung
wieder zurück
PL = GpS + Km
(und keine Sorge. Beim ersten mal sieht das alles mathematisch furchtbar
wild aus. Ist es aber nicht. Wenn man da das erste mal durch ist, ist es
eigentlich sogar ziemlich einfach. Das einzig 'wilde' ist das Lösen
einer quadratischen Gleichung. Aber diese Lösungs-Formel sollte man ja
sowieso intus haben (so wie den Phythagoros - braucht man auch dauernd).
Im Endeffekt bleibt nichts anderes als ein paar Grundrechnungsarten und
eine Wurzel übrig)
Im Code gibt es 2 geometrische Sonderfälle:
* ganz am Anfang, wenn dP eine 0-Länge hat. Die geometrische Bedeutung
ist: es liegt gar keine Gerade vor
* der Ausdruck unter der Wurzel beim Berechnen der quadratischen
Gleichung ist kleiner 0.
Die geometrische Bedeutung ist: Die Gerade schneidet den Kreis
überhaupt nicht. Achtung: Ein Wert von 0 ist ok. In dem Fall ist
die Gerade eine Tangente zum Kreis. Die beiden Lösungen der Gleichung
sind identisch.
Ein wenig Sorgfalt muss man noch in Konventionen legen. Denn in
Wirklichkeit gibt es 8 Punkte, die die geforderte Bedingung, Abstand zur
Geraden und Abstand zu Kreis) erfüllen. Je nachdem auf welche Seite man
die jeweilige 'Parallele' konstruiert, erhält man andere Punkte. Diese
Dinge wird man durch Konvention lösen
* beim Kreis gelten die Punkte, die ausserhalb des Kreises liegen
* bei der Geraden muss man sich entscheiden ob man die Parallele links
oder rechts von der Geraden konstruiert. Je nachdem wird dann der
Normalvektor entweder rechts rum oder links rum um 90° gedreht um
die 'parallelen' Punkte zu bestimmen.
> nimmste die Formel für lineare Funktion:
> y=m*x+h
Die Formel ist deswegen scheisse, weil man sich für senkrechte Gerade
einen Sonderfall mit m gleich unendlich einbaut. Ausserdem wird die
Genauigkeit immer schlechter je weiter sich die Gerade der Senkrechten
annähert. All das sind Sonderfälle und Problemchen, die die
Parameterdarstellung einer Geraden nicht hat.
Ähnlich funktioniert auch die Schnittpunktsberechnung 2-er Geraden. Wenn
da was wesentlich Komplizierteres rauskommt als eine Handvoll
Subtraktionen, Multiplikationen und 1 Division, dann hat man was falsch
gemacht :-)
Man hat 2 Geraden
GA = P0A + tA * dPA
GB = P0B + tB * dPB
die sich irgendwo schneiden. Es gibt also einen Punkt GS, so dass
GS = P0A + tAS * dPA
GS = P0B + tBS * dPB
da links derselbe Punkt ist (logisch, der Schnittpunkt GS liegt ja auf
beiden Geraden), kann man die Gleichungen gleichsetzen
P0A + tAS * dPA = P0B + tBS * dPB
jetzt hat man 2 Gleichungen (ist ja eine Vektorgleichung in X und Y) mit
2 Unbekannten tAS und tBS, und das kann man lösen.
Wieder: Die Lösung ansehen und nach mathematischen Sonderfällen
untersuchen. Da kommt eine Division vor und durch 0 kann man nicht
dividieren. Wenn der Nenner aber zu 0 wird, dann ist die geometrische
Bedeutung davon: die beiden Geraden sind parallel und daher ist es auch
logisch, dass kein Schnittpunkt existiert.