TFormPoint
Übersicht

![]() |
darthBetreff: TFormPoint |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
ich hab vor kurzem eine Funktion geschrieben, die Schnittpunkte zwischen Geraden-Abschnitten und Ebenen findet. Bei diese Punkte soll dann überprüft werden, ob sie im Dreieck (das die Ebene definiert) liegen. Dazu setz ich einen Pivot auf den ersten Punkt des Dreiecks, richte den nach der Normalen aus und TForm dann alle Punkte, das gibt mir 4 Punkte im 2D-Raum, die ich dann mit einem einfacheren Algorithmus überprüfen kann. Code: [AUSKLAPPEN] Function inTrig3D(t.triangle,p.point)
piv=CreatePivot() PositionEntity piv,t\p[0]\x,t\p[0]\y,t\p[0]\z AlignToVector piv,n\x,n\y,n\z,3,1 poly.polygone=newPolygone() poly\flag=False For k=0 To 2 TFormPoint t\p[k]\x,t\p[k]\y,t\p[k]\z,0,piv pNew.point=newPoint(TFormedX(),TFormedY(),0) pNew\flag=False addPointToPoly(poly,pNew) Next TFormPoint p\x,p\y,p\z,0,piv pTest.point=newPoint(TFormedX(),TFormedY(),0) pTest\flag=False Return inPoly2D(poly,pTest) End Function Da ich das so (mit den Pivot, AlignToVector und TForm Befehlen) nie in andere Sprachen übersetzen kann dachte ich mir, dass ich das selber ausrechne. (Sprich das TForm nachbauen.) Nun stellt sich die Frage, wie das geht... Mein Ansatz: n.vektor=getPlaneNormale() ;Normale der Ebene v1.vektor=newVector(Punkt2-Punkt1) ;vom Dreieck v2.vektor=newVector(Punkt3-Punkt1) ;vom Dreieck die beiden Vektoren werden normalisiert. Dann mach ich eine Matrix: Code: [AUSKLAPPEN] [ v1\x v2\x n\x | px-t\p1\x
v1\y v2\y n\y | py-t\p1\y v1\z v2\z n\z | pz-t\p1\z ] Aus der Überlegung heraus: der Transformierte Punkt sollte eine Linearkombination der beiden Ebenenvektoren und der Normale sein (sprich: P=a*V1+b*V2+c*N), die Koeffizienten a,b,c sind dann die neuen Koordinaten, wobei c theoretisch null sein müsste, weil ja alle Punkte auf der Ebene liegen. (Das px-t\p1\x mache ich, um die Punkte relativ zum "Ursprung" (also dem ersten Punkt des Dreiecks) zu haben.) Diese Matrix formt man mit dem Gauss-Algorithmus um, danach kann man substituieren und hat die Koeffizienten. Mein Problem: 1.) es gibt nicht das selbe Ergebnis wie TFormPoint 2.) es funktioniert nicht (die Punkte werden nicht als im Dreieck erkannt wenn sie drin liegen müssten) Vielleicht weiss jemand wie BlitzBasic das TForm macht, oder kann mir einen Fehler in meiner Gedankenkette aufzeigen? Die einzelnen Zwischenfunktionen funktionieren, sie sind ausführlich geprüft (sprich: das lösen der Matrix, das Substituieren, die Normale,... der Rest halt ![]() |
||
Diese Signatur ist leer. |
Krischan |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielleicht wirst Du dort fündig:
Blitz3D C++ geometry code |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Grund, warum du nicht dieselben Ergebnisse wie bei TFormPoint erhältst, ist relativ einfach zu finden.
Du setzt in der Matrix drei Vektoren als Richtungsvektoren für ein Koordinatensystem ein: Der Normalenvektor der Ebene sowie zwei Seiten des Dreiecks. Zum einen sind diese Vektoren nicht normalisiert (von der Normalen der Ebene mal abgesehen), und zum anderen steht zwischen den drei Vektoren kein rechter Winkel, sprich, du hast ein skaliertes und stark verzerrtes Koordinatensystem. Die Matrix von Blitz für den Pivot ist hingegen so aufgebaut, als dass das aufgespannte Koordinatensystem Einheitslänge besitzt und alle Richtungsvektoren senkrecht zueinander stehen. Das erklärt zumindest, weshalb du nicht die gleichen Ergebnisse wie TFormPoint erhältst; allerdings sollte der Code immer noch funktionieren. Ich verstehe aber nicht ganz, wofür du hier den Gauss'schen Algorithmus benötigtst - du brauchst ja nur noch alle Punkte mit der Matrix zu multiplizieren und hast das gewünschte Ergebnis; es gibt eigentlich kein Gleichungssystem zu lösen. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
danke Krischan, ich werde mir den Link mal zu Gemüte führen. @Noobody: Die Vektoren werden normalisiert (alle 3), allerdings nicht orthogonalisiert. Ich habe ein Orthonormalisierungs-Verfahren programmiret, allerdings nicht angewandt, ich werde mal sehen ob es zu besseren Ergebnissen führt. Gauss wende ich an, um die Parameter zu finden, a*x+b*y+c*z=p (falls x y z p vektoren sind) löst man am einfachsten mit gauss: Code: [AUSKLAPPEN] [ x1 y1 z1 | p1
x2 y2 z2 | p2 x3 y3 z3 | p3 ] Umformen zu: Code: [AUSKLAPPEN] [ 1 tij tij | pij
0 1 tij | pij 0 0 1 | pij ] Und von da kommt man dann zu den Parametern, die ich brauche. Im Grunde multipliziere ich einen Lösungsvektor mit der Matrix um den Punktvektor zu erhalten. |
||
Diese Signatur ist leer. |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir ist immer noch nicht klar, wofür du Gauss benötigst ![]() Wenn du einen Pivot auf die Ebene stellst und nachher TFormPoint ausführst, ist das dasselbe, wie wenn du deine Matrix wie gehabt bildest und dann den Punkt mit der Matrix multiplizierst; die Matreix benötigt keinerlei Umformung. Wenn die Matrix richtig gebildet ist, fällt die Z - Koordinate automatisch weg (d.h. wird 0) - du musst nicht erst ein Gleichungssystem per Gauss lösen (das ist vermutlich sogar falsch, weswegen es auch nicht funktioniert). |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
darth |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
so wie es aussieht habe ich die Lösung. Der Ansatz, die Matrix einfach als Transformationsmatrize zu brauchen hat nicht funktioniert. Allerdings war die Orthonormalisierung scheinbar nötg, ich habe nur zwei der 3 Vektoren orthogonalisiert, wenn ich alle 3 miteinbeziehe, dann funktioniert es wunderbar. (Scheint jedenfalls so)... Nun denn, danke für die Hilfen ![]() Good fight, good night. |
||
Diese Signatur ist leer. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group