Vektorrechnung, brauche Hilfe ^^
Vektorrechnung, brauche Hilfe ^^
Moin
In der Schule bin ich ab der Differenzialrechnung nicht mehr wirklich im Matheunterricht mitgekommen. Ergo hab ich damals auch die Vektorrechnung nur teilweise kapiert (eben das was man vorher auch schon wußte).
Kann mir jemand erklären, wie ich eine möglicherweise vorhandene Kollision zwischen einer Fläche (Dreieck) und einem Strahl errechne? Mir nützen Formeln nicht so viel, weil ich es ja damit auch nicht (von alleine) verstehe.
Gegeben ist mir also ein Strahl S mit seinem Ausgangspunkt (Px, Py, Pz), seiner Richtung (Rx, Ry, Rz) und ein dreieckiges Polygon mit den Koordinaten seiner Eckpunkte (P1x, P1y, P1z) ...(P3x, P3y, P3z).
Meine erste Überlegung war, erstmal zu schauen, [1] ob der Strahl paralell zur Fläche des Polygons geht. Wenn sie paralell gehen, treffen die sich ja nie. [2] Dann hab ich mir überlegt, dass das Polygon ja eine Fläche bzw Ebene erzeugt. Man müsste jetzt errechnen, wo der Strahl die Ebene schneidet. [3] Anschließend muss man rausfinden, ob der Schnittpunkt sich noch innerhalb der Fläche des Polygons oder außerhalb befindet.
Das sind so meine Gedanken,
Den Aufprallwinkel benötige ich auch, aber ich denke, dass ich den selber berechnen kann (trigonometrische Funktionen). Oder gibt es hier effektivere Methoden als Sin/Cos/usw.?
Greetz Laurin
In der Schule bin ich ab der Differenzialrechnung nicht mehr wirklich im Matheunterricht mitgekommen. Ergo hab ich damals auch die Vektorrechnung nur teilweise kapiert (eben das was man vorher auch schon wußte).
Kann mir jemand erklären, wie ich eine möglicherweise vorhandene Kollision zwischen einer Fläche (Dreieck) und einem Strahl errechne? Mir nützen Formeln nicht so viel, weil ich es ja damit auch nicht (von alleine) verstehe.
Gegeben ist mir also ein Strahl S mit seinem Ausgangspunkt (Px, Py, Pz), seiner Richtung (Rx, Ry, Rz) und ein dreieckiges Polygon mit den Koordinaten seiner Eckpunkte (P1x, P1y, P1z) ...(P3x, P3y, P3z).
Meine erste Überlegung war, erstmal zu schauen, [1] ob der Strahl paralell zur Fläche des Polygons geht. Wenn sie paralell gehen, treffen die sich ja nie. [2] Dann hab ich mir überlegt, dass das Polygon ja eine Fläche bzw Ebene erzeugt. Man müsste jetzt errechnen, wo der Strahl die Ebene schneidet. [3] Anschließend muss man rausfinden, ob der Schnittpunkt sich noch innerhalb der Fläche des Polygons oder außerhalb befindet.
Das sind so meine Gedanken,
Den Aufprallwinkel benötige ich auch, aber ich denke, dass ich den selber berechnen kann (trigonometrische Funktionen). Oder gibt es hier effektivere Methoden als Sin/Cos/usw.?
Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
And we're out of beta. We're releasing on time.
jo, würde ich genau so machen, Gerade+Ebene Schnittpunkt berechnen (Ebenengleichung mit Geradegleichen gleichsetzten) und dann ermitteln ob der Punkt im Dreieck ist (Linearkombination zweiter Vektoren die das Dreieck aufspannen und testen ob die Summe der Faktoren <=1 ist).
und für den Winkel würde ich die normale Gleichung verwenden:
Alpha = ArcSin( |Skalar(n*a)| / (|n|*|a|) )
wobei n die normale der Ebene ist und a der Richtungsvektor der Geraden
und für den Winkel würde ich die normale Gleichung verwenden:
Alpha = ArcSin( |Skalar(n*a)| / (|n|*|a|) )
wobei n die normale der Ebene ist und a der Richtungsvektor der Geraden
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Das klingt bei dir so einfach
Das mit den Gleichsetzen der Gleichungen macht Sinn, so macht man das ja auch bei 2D-Schnittpunktberechnungen.
Kannst du eine Beispielrechnung machen?
Das mit dem Winkel hab ich gar nicht kapiert.

Das mit den Gleichsetzen der Gleichungen macht Sinn, so macht man das ja auch bei 2D-Schnittpunktberechnungen.
Kannst du eine Beispielrechnung machen?
Das mit dem Winkel hab ich gar nicht kapiert.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
And we're out of beta. We're releasing on time.
wie du es Code-Maßig machst ist deine entscheidung, so mach ich das mathematisch: (Variablen mit einem Unterstrich sind Vektoren (hier 3D))
Ebene : x = p + r*a + s*b
Gerade : x = q + t*c
x ist so zu sagen jeder Punkt der Ebene/Gerade
Nun setzt du beide x gleich
p + r*a + s*b = q + t*c
0 = p-q + r*a + s*b - t*c
Da es ja in 3D ist hast du also 3 gleichungen mit 3 unbekannet Faktoren r,s,t, also kannst du es lösen.
Dann setzt du t in die Geradegleichung und erhälst den SchnittPunkt.
____
Nun sind ja a und b zwei Vektoren von Dreieck, und p deren Ausgangspunkt, also kannst du anhand von dem errechneten r und s sagen ob der Punkt inerhalb des Dreiecks ist: Innerhalb wenn 1>=r+s
____
Beim Winkel errechnest du kurz das Kreuzprodukt aus a und b was dann das n ist. Mit unserem c der Geraden kannst du dann den Winkel errechnen, nach der Formel oben.
Wenn du jetzte noch die ausführliche Variante willst, dauert es etwas, kannst aber auch mal bei Tips und Tricks gucken, da sind Macros für Vektoren (Kreuzpr., Skalarpr.)
Ebene : x = p + r*a + s*b
Gerade : x = q + t*c
x ist so zu sagen jeder Punkt der Ebene/Gerade
Nun setzt du beide x gleich
p + r*a + s*b = q + t*c
0 = p-q + r*a + s*b - t*c
Da es ja in 3D ist hast du also 3 gleichungen mit 3 unbekannet Faktoren r,s,t, also kannst du es lösen.
Dann setzt du t in die Geradegleichung und erhälst den SchnittPunkt.
____
Nun sind ja a und b zwei Vektoren von Dreieck, und p deren Ausgangspunkt, also kannst du anhand von dem errechneten r und s sagen ob der Punkt inerhalb des Dreiecks ist: Innerhalb wenn 1>=r+s
____
Beim Winkel errechnest du kurz das Kreuzprodukt aus a und b was dann das n ist. Mit unserem c der Geraden kannst du dann den Winkel errechnen, nach der Formel oben.
Wenn du jetzte noch die ausführliche Variante willst, dauert es etwas, kannst aber auch mal bei Tips und Tricks gucken, da sind Macros für Vektoren (Kreuzpr., Skalarpr.)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Ich hab mal bisl rumprobiert 
[EDIT] Zu beachten wäre noch:

Code: Alles auswählen
Structure V3D
x.l
y.l
z.l
EndStructure
Structure Strahl
pos.V3D
r.V3D
EndStructure
S.Strahl
Structure Dreieck
P1.V3D
P2.V3D
P3.V3D
EndStructure
D.Dreieck
;Ebene des Dreiecks: e = D\P1+r*(D\P2-D\P1)+s*(D\P3-D\P1)
;Strahl: s = S\pos+t*S\r
;Sollen sich schneiden, also: D\P1+r*(D\P2-D\P1)+s*(D\P3-D\P1) = S\pos+t*S\r
;Ausgeschrieben:
;D\P1\x + r*(D\P2\x-D\P1\x) + s*(D\P3\x-D\P1\x) = S\pos\x + t*S\r\x
;D\P1\y + r*(D\P2\y-D\P1\y) + s*(D\P3\y-D\P1\y) = S\pos\y + t*S\r\y
;D\P1\z + r*(D\P2\z-D\P1\z) + s*(D\P3\z-D\P1\z) = S\pos\z + t*S\r\z
r = (S\pos\x + t*S\r\x - D\P1\x - s*(D\P3\x-D\P1\x)) / (D\P2\x-D\P1\x)
s = (S\pos\y + t*S\r\y - D\P1\y - r*(D\P2\y-D\P1\y)) / (D\P3\y-D\P1\y)
t = (D\P1\z + r*(D\P2\z-D\P1\z) + s*(D\P3\z-D\P1\z) - S\pos\z) / S\r\z
r = (S\pos\x + ((D\P1\z + r*(D\P2\z-D\P1\z) + s*(D\P3\z-D\P1\z) - S\pos\z) / S\r\z)*S\r\x - D\P1\x - s*(D\P3\x-D\P1\x)) / (D\P2\x-D\P1\x)
s = (S\pos\y + ((D\P1\z + r*(D\P2\z-D\P1\z) + s*(D\P3\z-D\P1\z) - S\pos\z) / S\r\z)*S\r\y - D\P1\y - r*(D\P2\y-D\P1\y)) / (D\P3\y-D\P1\y)
r = ((S\pos\x + D\P1\z*S\r\x/S\r\z + s*(D\P3\z-D\P1\z)*S\r\x/S\r\z - S\pos\z*S\r\x/S\r\z - D\P1\x - s*(D\P3\x-D\P1\x)) / (D\P2\x-D\P1\x))/(1 - (D\P2\z-D\P1\z)*S\r\x/S\r\z/(D\P2\x-D\P1\x))
;Scheiße... ~_~
;Neuer Ansatz:
;Normale der Dreiecks-Ebene:
;n = (D\P2-D\P1) x (D\P3-D\P1) (http://de.wikipedia.org/wiki/Kreuzprodukt)
n\x = (D\P2\y-D\P1\y) * (D\P3\z-D\P1\z) - (D\P2\z-D\P1\z) * (D\P3\y-D\P1\y)
n\y = (D\P2\z-D\P1\z) * (D\P3\x-D\P1\x) - (D\P2\x-D\P1\x) * (D\P3\z-D\P1\z)
n\z = (D\P2\x-D\P1\x) * (D\P3\y-D\P1\y) - (D\P2\y-D\P1\y) * (D\P3\x-D\P1\x)
n = n / Sqr(n\x*n\x+n\y*n\y+n\z*n\z)
;Ebene:
;p = -(n * D\P1)
;n*(S\pos+t*S\r) = -p
;n*(S\pos+t*S\r) = n * D\P1
;n\x*(S\pos\x+t*S\r\x)+n\y*(S\pos\y+t*S\r\y)+n\z*(S\pos\z+t*S\r\z) = n\x * D\P1\x + n\y * D\P1\y + n\z * D\P1\z
;t*(n\x*S\r\x + n\y*S\r\y + n\z*S\r\z) + n\x*S\pos\x + n\y*S\pos\y + n\z*S\pos\z = n\x * D\P1\x + n\y * D\P1\y + n\z * D\P1\z
t = (n\x * D\P1\x + n\y * D\P1\y + n\z * D\P1\z - (n\x*S\pos\x + n\y*S\pos\y + n\z*S\pos\z))/(n\x*S\r\x + n\y*S\r\y + n\z*S\r\z)
;Schnittpunkt:
Schnittpunkt\x = S\pos\x+t*S\r\x
Schnittpunkt\y = S\pos\y+t*S\r\y
Schnittpunkt\z = S\pos\z+t*S\r\z
Code: Alles auswählen
If t < 0
;Schnittpunkt ist auf der "falschen" seite des Strahls (wir haben ja mit einer Geraden gerechnet)
EndIf
If (n\x*S\r\x + n\y*S\r\y + n\z*S\r\z) = 0
;Strahl ist parallel zur Ebene
EndIf

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
ganz nett, aber wie du vllt selber gemerkt hast, ist die Darstellung eines Dreiecks mit 3 Punkten für die berechnung nicht geeignet.
Besser ist da die Darstllung durch ein Punkt und 2 Aufspannende Vektoren, deren Länge die Länge der Dreiecksseite entspricht.
Das erspart n menge rechnen, denn dann sind diese 2 Aufspannende Vektoren des Dreiecks = der Ebene
@Kaeru Gaman
Tia, wie soll dnen sowas aussehen ?
Ich meine Mathematisch ist das ja alles übersichtlich, aber wenn ich das Coden würde hmmm...
kanns ja mal probieren
Besser ist da die Darstllung durch ein Punkt und 2 Aufspannende Vektoren, deren Länge die Länge der Dreiecksseite entspricht.
Das erspart n menge rechnen, denn dann sind diese 2 Aufspannende Vektoren des Dreiecks = der Ebene
@Kaeru Gaman
Tia, wie soll dnen sowas aussehen ?
Ich meine Mathematisch ist das ja alles übersichtlich, aber wenn ich das Coden würde hmmm...
kanns ja mal probieren
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Naja, anstattSTARGÅTE hat geschrieben:ganz nett, aber wie du vllt selber gemerkt hast, ist die Darstellung eines Dreiecks mit 3 Punkten für die berechnung nicht geeignet.
Besser ist da die Darstllung durch ein Punkt und 2 Aufspannende Vektoren, deren Länge die Länge der Dreiecksseite entspricht.
Das erspart n menge rechnen, denn dann sind diese 2 Aufspannende Vektoren des Dreiecks = der Ebene
Code: Alles auswählen
n\x = D\P2\y * D\P3\z - D\P2\z * D\P3\y
n\y = D\P2\z * D\P3\x - D\P2\x * D\P3\z
n\z = D\P2\x * D\P3\y - D\P2\y * D\P3\x
Code: Alles auswählen
n\x = (D\P2\y-D\P1\y) * (D\P3\z-D\P1\z) - (D\P2\z-D\P1\z) * (D\P3\y-D\P1\y)
n\y = (D\P2\z-D\P1\z) * (D\P3\x-D\P1\x) - (D\P2\x-D\P1\x) * (D\P3\z-D\P1\z)
n\z = (D\P2\x-D\P1\x) * (D\P3\y-D\P1\y) - (D\P2\y-D\P1\y) * (D\P3\x-D\P1\x)
Mir fällt übrigens keine Methode ein, festzustellen ob der Schnittpunkt im Dreieck liegt oder nicht - bisher ist das ja nur Strahl und Ebene.

[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
mit dem Punkt im Dreieck:
Ein Dreieck/Ebene besteht aus einem Stützvektor und 2 Richtungsvorktoren welche eine Ebene Aufspannen und beim Dreieck gleichzeitig 2 von den 3 Seiten bilden.
Nun möchte ich prüfen ob ein Punkt im Dreieck liegt. Also versuche ich vom Dreiecksstützvektor zum Schnittpunkt zu kommen, indem ich vor den 2 Richtungsvektoren Faktoren setzte, sodass x = p + r*a + s*b (x Schnittpunkt, p Stützvektor, a & b Richtungsv. )
Ich erhalte nun ein r und ein s
dann muss diese Gleichung gelten 1 >= r + s und r>0 und s>0 damit der Punkt im Dreieck ist.
Der Grund dafür ist, wenn r oder s kleiner als 0 wäre würde der Punkt auf jedenfall außerhalb liegen (hinter dem Dreieck)
würde r + s > 1 sein, würde der Punkt auch außerhalb liegen.
Wenn entweder r =1 oder s=1 wäre würde der Schnittpunkt genau auf einem der Dreiecks-Ecken liegen
Ein Dreieck/Ebene besteht aus einem Stützvektor und 2 Richtungsvorktoren welche eine Ebene Aufspannen und beim Dreieck gleichzeitig 2 von den 3 Seiten bilden.
Nun möchte ich prüfen ob ein Punkt im Dreieck liegt. Also versuche ich vom Dreiecksstützvektor zum Schnittpunkt zu kommen, indem ich vor den 2 Richtungsvektoren Faktoren setzte, sodass x = p + r*a + s*b (x Schnittpunkt, p Stützvektor, a & b Richtungsv. )
Ich erhalte nun ein r und ein s
dann muss diese Gleichung gelten 1 >= r + s und r>0 und s>0 damit der Punkt im Dreieck ist.
Der Grund dafür ist, wenn r oder s kleiner als 0 wäre würde der Punkt auf jedenfall außerhalb liegen (hinter dem Dreieck)
würde r + s > 1 sein, würde der Punkt auch außerhalb liegen.
Wenn entweder r =1 oder s=1 wäre würde der Schnittpunkt genau auf einem der Dreiecks-Ecken liegen
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr