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:
    E:xβƒ—=a1βƒ—+kvβƒ—+lwβƒ—,k,l∈RE: \vec{x} = \vec{a_1} + k \vec{v} + l \vec{w}, k, l \in \mathbb{R}
    und
    G:xβƒ—=a2βƒ—+ruβƒ—,r∈RG: \vec{x} = \vec{a_2} + r \vec{u}, r \in \mathbb{R}

    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 u⃗,v⃗,w⃗\vec{u}, \vec{v}, \vec{w} linear unabhÀngig.

    die gerade und die ebene sind echt parallel,
    genau dann wenn uβƒ—,vβƒ—,wβƒ—\vec{u}, \vec{v}, \vec{w} linear abhΓ€ngig und a_2βƒ—βˆ’a_1βƒ—,vβƒ—,wβƒ—\vec{a\_2} - \vec{a\_1}, \vec{v}, \vec{w} linear unabhΓ€ngig.

    die gerade liegt in der ebene,
    genau dann wenn uβƒ—,vβƒ—,wβƒ—\vec{u}, \vec{v}, \vec{w} linear abhΓ€ngig und a_2βƒ—βˆ’a_1βƒ—,vβƒ—,wβƒ—\vec{a\_2} - \vec{a\_1}, \vec{v}, \vec{w} linear abhΓ€ngig.

    ness schrieb:

    2.: wie bekomme ich die Schnittpunktkoordinate heraus

    wenn du herausgefunden hast das ebene und gerade sich schneiden,
    musst dua_1⃗+kv⃗+lw⃗=a_2⃗+ru⃗\vec{a\_1} + k \vec{v} + l \vec{w} = \vec{a\_2} + r \vec{u} machen und die gleichung nach r auflâsen. wenn du er hast liegt dein schnittpunkt bei s⃗=a2⃗+ru⃗\vec{s} = \vec{a_2} + r \vec{u}

    edit: 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:
    E:xβƒ—=a1βƒ—+kvβƒ—+lwβƒ—,k,l∈RE: \vec{x} = \vec{a_1} + k \vec{v} + l \vec{w}, k, l \in \mathbb{R}
    und
    G:xβƒ—=a2βƒ—+ruβƒ—,r∈RG: \vec{x} = \vec{a_2} + r \vec{u}, r \in \mathbb{R}

    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 - r
    u = a2 - a1

    in 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 = 2

    diese 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:
    a_1⃗,v⃗,w⃗,a_2⃗,u⃗\vec{a\_1},\vec{v},\vec{w},\vec{a\_2},\vec{u}
    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:
    Ebene:E_1=a_1⃗+lu⃗+kv⃗Ebene: E\_1=\vec{a\_1}+l\vec{u}+k\vec{v}
    E_2=a_1⃗+n⃗E\_2=\vec{a\_1}+\vec{n}
    E1E_1 und E2E_2 sind das selbe, nur anders dargestellt (Ich komme an beides leicht ran.).
    Gerade:G=a2⃗+mw⃗Gerade: G=\vec{a_2}+m\vec{w}
    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:
    a_2⃗+mw⃗=a_1⃗+n⃗\vec{a\_2}+m\vec{w}=\vec{a\_1}+\vec{n}
    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:
    a_1⃗,v⃗,w⃗,a_2⃗,u⃗\vec{a\_1},\vec{v},\vec{w},\vec{a\_2},\vec{u}
    Die dΓΌrften ja alle gegeben sein, oder?

    Nehmen wir mal als Beispiel die Gerade
    G:x⃗=a⃗+r⋅u⃗G: \vec{x}=\vec{a}+r\cdot\vec{u}
    Was soll diese Gleichung?
    Du kannst mit ihr jeden Punkt xβƒ—\vec{x} auf der Geraden G eindeutig darstellen, indem Du zu einem beliebigen (gegebenen) Punkt aβƒ—\vec{a} der Geraden den Vector uβƒ—\vec{u} hinzuaddierst. Mit dem Faktorr∈Rr\in \mathbb{R} 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/Normalgleichung

    Genau.

    Ebene:E_1=a_1⃗+lu⃗+kv⃗Ebene: E\_1=\vec{a\_1}+l\vec{u}+k\vec{v}
    E_2=a_1⃗+n⃗E\_2=\vec{a\_1}+\vec{n}

    Nicht ganz.. πŸ˜‰
    Die Normalenform der Ebene lautet
    E:nβƒ—βˆ˜(xβƒ—βˆ’aβƒ—)=0E: \vec{n}\circ (\vec{x}-\vec{a})=0
    ∘\circ ist das Skalarprodukt.
    Mit dieser Gleichung kannst Du jeden beliebigen Punkt xβƒ—\vec{x} in der Ebene darstellen. xβƒ—βˆ’aβƒ—\vec{x}-\vec{a} 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:
    G:x⃗=a2⃗+mw⃗G: \vec{x}=\vec{a_2}+m\vec{w}

    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:
    a_2⃗+mw⃗=a_1⃗+n⃗\vec{a\_2}+m\vec{w}=\vec{a\_1}+\vec{n}
    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
    nβƒ—βˆ˜(a2βƒ—+mwβƒ—βˆ’aβƒ—)=0\vec{n}\circ (\vec{a_2}+m\vec{w}-\vec{a})=0
    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 E:nβƒ—βˆ˜xβƒ—βˆ’nβƒ—βˆ˜aβƒ—=0E: \vec{n}\circ \vec{x}-\vec{n}\circ\vec{a}=0 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 R3\mathbb{R}^3 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:

    nβƒ—βˆ˜(a2βƒ—+mwβƒ—βˆ’aβƒ—)=0\vec{n}\circ (\vec{a_2}+m\vec{w}-\vec{a})=0

    Ich mach mal weiter:
    nβƒ—βˆ˜(a2βƒ—+mwβƒ—)βˆ’nβƒ—βˆ˜aβƒ—=0\vec{n}\circ(\vec{a_2}+m\vec{w})-\vec{n}\circ\vec{a}=0
    nβƒ—βˆ˜(a2βƒ—+mwβƒ—)=nβƒ—βˆ˜aβƒ—\vec{n}\circ(\vec{a_2}+m\vec{w})=\vec{n}\circ\vec{a}
    nβƒ—βˆ˜a2βƒ—+nβƒ—βˆ˜(mwβƒ—)=nβƒ—βˆ˜aβƒ—\vec{n}\circ\vec{a_2}+\vec{n}\circ(m\vec{w})=\vec{n}\circ\vec{a}
    nβƒ—βˆ˜(mwβƒ—)=nβƒ—βˆ˜(aβƒ—βˆ’a2βƒ—)\vec{n}\circ(m\vec{w})=\vec{n}\circ(\vec{a}-\vec{a_2})
    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
    (a21+mw_1βˆ’a_1,a22+mw_2βˆ’a_2,...)T(a_{21}+mw\_1-a\_1,a_{22}+mw\_2-a\_2,...)^T

    Dann kannst Du mit[1]
    a⃗⋅b⃗=a_1b_1+a_2b_2+a_3b_3\vec{a}\cdot\vec{b}=a\_1b\_1+a\_2b\_2+a\_3b\_3
    eine Gleichung machen, die du nach m auflΓΆsen kannst.
    Darum auch die zweite Formel; ist dann wohl etwas einfacher...

    Gruß

    [1] http://de.wikipedia.org/wiki/Skalarprodukt



  • 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:
    m=(n_xa_1_xβˆ’n_xa_2_x+n_ya_1_yβˆ’n_ya_2_y+n_za_1_zβˆ’n_za_2_z)/(n_xw_x+n_yw_y+n_zw_z)m=(n\_x a\_1\_x - n\_x a\_2\_x + n\_y a\_1\_y - n\_y a\_2\_y + n\_z a\_1\_z - n\_z a\_2\_z)/(n\_x w\_x + n\_y w\_y + n\_z w\_z)
    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...


Anmelden zum Antworten