Schnittpunkte im Koordinatensystem
-
Gleich vorn weg: ich geh in die Achte und hab mir all mein "Wissen" ΓΌber "fortgeschrittenere" Themen in der Mathematik angelesen (wir sind grad bei linearen Funktionen ). In sofern kann es sein, dass mir Grundlagenwissen fehlt. Da wird mir dann die Wikipedia hoffentlich wieder helfen. (Nur falls ich komische Fragen stellen werde...)
Das Problem ist folgendes:
Ich habe ein koordinatensystem (x,y,z - 3 Dimensionen). AuΓerdem einen Strahl, der durch einen normalisierten Richtungsvektor sowie einen Ausgansgspunkt definiert ist, sowie ein Polygon, das durch x Punkte Beschrieben wird, die alle auf einer Ebene liegen.
Nun stelle ich mir zwei Fragen:
1.: wie bekomme ich raus, ob der Strahl durch das Polygon verlΓ€uft
2.: wie bekomme ich die Schnittpunktkoordinate heraus
-
ich geh in die Achte und hab mir all mein "Wissen" ΓΌber "fortgeschrittenere" Themen in der Mathematik angelesen
Sehr gut, weiter so!
Und, um Dich weiter an die Mathematik zu fesseln nur ein Hinweis. Dein Problem kannst Du mit Baryzentrischen Koordinaten lΓΆsen.GruΓ
-
Ich hab mir das jetzt mal zusammengesucht:
#include <iostream> int main() { double Ax=0; double Ay=1; double Az=1; double Bx=2; double By=1; double Bz=1; double Cx=1; double Cy=3; double Cz=1; double Px=1; double Py=2; double Pz=1; double det=Ax*By*Cz+Cx*Ay*Bz+Bx*Cy*Az-Az*By*Cx-Ax*Cy*Bz-Bx*Ay*Cz; double a=(Px*By*Cz+Cx*Py*Bz+Bx*Cy*Pz-Pz*By*Cx-Px*Cy*Bz-Bx*Py*Cz)/det; double b=(Ax*Py*Cz+Cx*Ay*Pz+Px*Cy*Az-Az*Py*Cx-Ax*Cy*Pz-Px*Ay*Cz)/det; double c=(Ax*By*Pz+Px*Ay*Bz+Bx*Py*Az-Az*By*Px-Ax*Py*Bz-Bx*Ay*Pz)/det; std::cout<<"det="<<det<<std::endl<<"a="<<a<<std::endl<<"b="<<b<<std::endl<<"c="<<c<<std::endl<<"a+b+c="<<a+b+c; return 0; };
Bei diesem konstruierten Beispiel kommt eins raus. -> P liegt also im Dreieck
Setzt man fΓΌr Py 4 ein, kommt auch eins raus, aber a < 0 || b < 0 || c < 0 (|| c > 1 || b > 1 || a > 1) -> P liegt nicht im Dreieck.
Stimmt das jetzt erst mal so?
Wenn ja, hab ich die "low-level-berechnung".
Bleiben noch 2 Fragen: Soll ich besser jedes Polygon in Dreiecke aufteilen, oder mir zur Laufzeit die Formel fΓΌr die Determinante berechnen?
Wie komm ich an P? Gibt es eine gescheitere MΓΆglichkeit, als den Strahl in sehr keinen AbstΓ€nden zu verfolgen (ich hoffe mal...)?
-
*push*
-
sagen wir:
und
ness schrieb:
1.: wie bekomme ich raus, ob der Strahl durch das Polygon verlΓ€uft
es gibt grundlegend erstmal 3 mΓΆglichkeiten der lagebeziehung zwischen einer ebene und einer geraden:
die gerade und die ebene schneiden sich,
genau dann wenn linear unabhΓ€ngig.die gerade und die ebene sind echt parallel,
genau dann wenn linear abhΓ€ngig und linear unabhΓ€ngig.die gerade liegt in der ebene,
genau dann wenn linear abhΓ€ngig und linear abhΓ€ngig.ness schrieb:
2.: wie bekomme ich die Schnittpunktkoordinate heraus
wenn du herausgefunden hast das ebene und gerade sich schneiden,
musst du machen und die gleichung nach r auflΓΆsen. wenn du er hast liegt dein schnittpunkt beiedit: die dinger mit den pfeilen drΓΌber sind vektoren, also einfach eine koordinate (x,y,z). lineare abhΓ€ngigkeiten kannst du mithilfe von determinanten herausfinden, da scheinst du dich ja schon mit beschΓ€ftigt zu haben, wenn du da noch fragen zu hast, frag. die gleichung nach r auflΓΆsen tust du wohl am besten in dem du 3 gleichungssysteme draus machst und diese in einer matrix mit dem gauΓverfahren auflΓΆst (vielleicht gibts da verfahren die man mit dem computer besser beibringen kann, kA).
-
Γhm, ja, was?
borg schrieb:
sagen wir:
und
Was ist hier was?
Das mit den linearen AbhΓ€ngigkeiten krieg ich bestimmt hin, wenn ich mal lΓ€nger google bemΓΌhe. Γber das lΓΆsen von Gleichungssystemen denke ich sollte ich auch genug finden.
Aber warum ein System, ich seh hier nur eine lineare Gleichung. Oder sind da mehrere unbekannten? Halt warte, sind u,v,w vielleicht unbekannt? Deshalb 3 Gleichungssysteme? Aber wie finde ich dann heraus, ob die sich schneiden, wenn ich dafΓΌr u,v,w benΓΆtige?
Aber ich kapier das erst mal garnicht...
Und was ist mit den baryzentrischen Koordinaten? Auf welche LΓΆsung hat Kyon angespielt? Das fand ich noch einfach...
-
ness schrieb:
Und was ist mit den baryzentrischen Koordinaten? Auf welche LΓΆsung hat Kyon angespielt? Das fand ich noch einfach...
kenn ich leider nicht. aber wenn das damit gut geht, benutz es! :p
ness schrieb:
Aber warum ein System, ich seh hier nur eine lineare Gleichung. Oder sind da mehrere unbekannten? Halt warte, sind u,v,w vielleicht unbekannt? Deshalb 3 Gleichungssysteme? Aber wie finde ich dann heraus, ob die sich schneiden, wenn ich dafΓΌr u,v,w benΓΆtige?
sagen wir a1=(2,1,-1), v=(1,-1,-1), w=(-3,1,4), a2=(3,0,1), u=(4,-1,2)
und wir mΓΌssen lΓΆsen:
a1 + k*v + l*w = a2 + ru
dann kΓΆnnen wir daraus machen
k*v + l*w - ru = a2 - a1in unserem fall also:
k*(1,-1,-1) + l*(-3,1,4) + r*(-4,1,-2) = (1,-1,2)die 3 gleichungen sind
k -3l -4r = 1
-k +1 +r = -1
-k +4l -2r = 2diese machen wir in eine matrix
k l r | --------------- 1 -3 -4 | 2 -1 1 1 | -1 -1 4 -2 | 2
das lΓΆsen wir auf nach
k l r | ---------------- 1 0 0 | 6/5 <-- k 0 1 0 | 3/5 <-- l 0 0 1 | -2/5 <-- r
wir mΓΌssen also berechnen
s = (3,0,1) -2/5*(4,-1,2) = (7/5, 2/5, 1/5)also S(7/5|2/5|1/5) <- schnittpunkt
sind bestimmt fehler in der rechnung, hab auch leider atm keine zeit fΓΌr latex. aber so schwer ist es nicht, das kriegst du hin
-
vielleicht wΓ€rs als zwischenschritt mal gut, das LGS zu fuΓ zu lΓΆsen- ohne matrix.
-
Setzt man fΓΌr Py 4 ein, kommt auch eins raus,
Per Definition ist die Summe der Baryzentrischen Koordinaten (in Deinem Fall also a+b+c) eines Punktes immer 1; ist also richtig.
Stimmt das jetzt erst mal so?
Ja, sieht gut aus. Die Berechnung der Determinanten bin ich nicht im einzelnen durchgegangen, aber ich denke ΓΌber 3x3 Determinanten brauchen wir uns hier nicht zu unterhalten...
Bleiben noch 2 Fragen: Soll ich besser jedes Polygon in Dreiecke aufteilen, oder mir zur Laufzeit die Formel fΓΌr die Determinante berechnen?
Wie Du erkennst, ist der Test, ob ein Punkt in einem Polygon liegt, zur Lauftzeit nur durch die drei Vergleiche (a,b oder c < 0) mΓΆglich. Das ist natΓΌrlich sehr schnell und wenn Du die Triangulierung vorher machst, bleibt es zur Laufzeit auch schnell...
Zum zerlegen der Polygone in Dreiecke gibts einige Verfahren. Delaunay-Triangulierung kommt aber in jeder Computergrafik Vorlesung vor.Wie komm ich an P? Gibt es eine gescheitere MΓΆglichkeit, als den Strahl in sehr keinen AbstΓ€nden zu verfolgen (ich hoffe mal...)?
Das ist die andere Sache. Um eine Schnittpunktberechnung, des Strahls mit der Ebene des Polygons, kommst Du nicht herum. (borg zeigt, wie es geht. E ist ΓΌbrigens die Ebene, G die Gerade(klingt logisch); beide in Punkt-Richtungs-Form)
Damit kannst Du allerdings nur entscheiden, ob die Gerade(Strahl) durch die Ebene geht. Ob der Punkt dann auch in dem Polygon liegt, berechnest Du -schnell- mit den Baryzentrischen Koordinaten.\\Edit
Da fΓ€llt mir noch ein: Wenn Du die Ebene in Normalenform hast, kannst Du Dir das LΓΆsen eines Gleichungssystems sparen, dann reicht ein Skalarprodukt....GruΓ
Michael
-
Ich glaube, so langsam kapier ich das...
Also k,l,r sind unbekannt, alles konzentriert sich darauf, diese zu finden.
Aber was ist:
Die dΓΌrften ja alle gegeben sein, oder?Kyon schrieb:
Da fΓ€llt mir noch ein: Wenn Du die Ebene in Normalenform hast, kannst Du Dir das LΓΆsen eines Gleichungssystems sparen, dann reicht ein Skalarprodukt....
Das wΓ€re gut, das sollte viel schneller sein. Was meinst du mit der Ebene in Normalenform? Ich weiΓ wie ich einen Vektor normalisiere, aber die Ebene wird ja dur 3 Vektoren (klar, also 2 davon normalisieren, oder?) und 2 Koeffizienten beschrieben.
/edit: so? http://de.wikipedia.org/wiki/Parameterdarstellung
/edit: normalenform? http://de.wikipedia.org/wiki/Normalgleichung
/edit: ja, ich habe mindestens einen Punkt in der Ebene und einen Normalenvektor...
/edit: ich glaub ich habs:
und sind das selbe, nur anders dargestellt (Ich komme an beides leicht ran.).
Nun ΓΌberprΓΌfe ich, ob u,v,w linear unabhΓ€ngig sind, wie muss ich noch rausfinden...
Wenn das der Fall ist, kommt die 2. Definition der Ebene zum Zug:
\vec{a\_2}\*m\vec{w}=\vec{a\_1}\*\vec{n}
Aber wie lΓΆs ich das auf?
-
ness schrieb:
Wenn das der Fall ist, kommt die 2. Definition der Ebene zum Zug:
Aber wie lΓΆs ich das auf?wenn du es auf diese form gebracht hast, bist du ja quasi fertig. du hast jetzt, wenn du so mΓΆchtest, 3 gleichungen mit je einer unbekannten. das ist durch einfaches umstellen zu lΓΆsen. wie du es mit der anderen form findest hab ich oben beschrieben, das sollte klar sein oder?
-
Moment!
Da stimmt jetzt was nicht.ness schrieb:
Ich glaube, so langsam kapier ich das...
Also k,l,r sind unbekannt, alles konzentriert sich darauf, diese zu finden.
Aber was ist:
Die dΓΌrften ja alle gegeben sein, oder?Nehmen wir mal als Beispiel die Gerade
Was soll diese Gleichung?
Du kannst mit ihr jeden Punkt auf der Geraden G eindeutig darstellen, indem Du zu einem beliebigen (gegebenen) Punkt der Geraden den Vector hinzuaddierst. Mit dem Faktor kannst Du die LΓ€nge des Vektors u beliebig variieren, damit Du auch jeden Punkt der Geraden erreichen kannst. Der Punkt a nennt sich Aufpunkt, Startpunkt oder Ausgangspunkt(etc.) der Geraden. Der Vektor u ist der, wie Du ihn bezeichnest 'normalisierte Richtungsvektor'. D.h. alle Werte der Geraden sind gegeben, bis auf den Skalierungsfaktor u.Was meinst du mit der Ebene in Normalenform? Ich weiΓ wie ich einen Vektor normalisiere, aber die Ebene wird ja dur 3 Vektoren (klar, also 2 davon normalisieren, oder?) und 2 Koeffizienten beschrieben.
-> http://de.wikipedia.org/wiki/NormalgleichungGenau.
Nicht ganz..
Die Normalenform der Ebene lautet
ist das Skalarprodukt.
Mit dieser Gleichung kannst Du jeden beliebigen Punkt in der Ebene darstellen. ist ein Vektor, der in der Ebene 'liegt'. Nach der Definition des Skalarproduktes muss die Gleichung oben 0 sein, da der Normalenvektor senkrecht auf der Ebene steht und damit auch auf jedem Vektor, der in der Ebene 'liegt'.
FΓΌr die Gerade gilt:
Nun ΓΌberprΓΌfe ich, ob u,v,w linear unabhΓ€ngig sind, wie muss ich noch rausfinden...
Wenn das der Fall ist, kommt die 2. Definition der Ebene zum Zug:
Aber wie lΓΆs ich das auf?Ich schlage Dir mal 'nen anderen Weg vor. Versuche es mal so:
Du setzt die Geradengleichung in E ein, das ergibt
Damit hast Du nur eine Unbekannte und eine Gleichung, die Du nach m auflΓΆsen kannst. m setzt Du dann wieder in G ein und schon hast Du die Koordinaten des Schnittpunktes.
(Nebenbei, die Normalenform der Ebene kannst Du auch als schreiben, das erleichtert etwas das auflΓΆsen nach w)
Jetzt brauchst du nur noch 'nen Punkt der Ebene -> einer der Polygonpunkte, und eine Normale -> senkrechter Vektor auf eine beliebige Kante des Polygons (Stichwort:Skalarprodukt) und dann wars das.....\\Edit: da fΓ€llt mir ein: 'Senkrechter Vektor auf eine Kante des Polygons' ist im nicht eindeutig. Musst Du also 2 Kanten nehmen und Dir das Kreuzprodukt mal anschaun(z.B Wikipedia)...
So langsam machts mir auch wieder SpaΓ; die gute alte Lineare Algebra...
GruΓ
-
Kyon schrieb:
Ich mach mal weiter:
Ist das skalarprodukt ΓΌberhaupt so komutativ? Und wenn ja, wie dann weiter?
Es gibt doch keine umkehroperation dazu?
-
Du musst das Skalarprodukt erst auflΓΆsen.
Stell' Dir die Klammer als einen Vektor mit drei Komponenten vor.
Also
Dann kannst Du mit[1]
eine Gleichung machen, die du nach m auflΓΆsen kannst.
Darum auch die zweite Formel; ist dann wohl etwas einfacher...GruΓ
-
Ja, ich glaube jetzt wirds grΓΌen...
Ich rechne das mal durch, melde mich fals es Probleme gibt...
/edit: ich glaub, jetzt hab ichs wirklich:
Kann das mal jemand durchsehen? Ich habs auch schon an nem minimalbeispiel durchgerechnet, hab auch schon ein beispiel probiert, dass sich nicht schneidet: beim divisor kam null raus. Das muss ja eigentlich der Fall sein, denn es die Gleichung *muss* ja dann unlΓΆsbar sein. Trotzdem kommt mir das wenig wasserdicht vor...
Sind meine SchlΓΌsse richtig?
Ich rechne das heute nachmittag mal an einem etwas grΓΆΓerem Beispiel durch (pen+paper - ich bin in norwgen und hab keinen compiler zur hand), nicht das es nur zufΓ€llig funktioniert hat, weil so viele Werte mit 0 belegt waren...