Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   2D- in 3D-Koordinate umrechnen (https://www.delphipraxis.net/189091-2d-3d-koordinate-umrechnen.html)

milos 2. Mai 2016 20:30


2D- in 3D-Koordinate umrechnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

angenommen ich habe ein Dreieck welches ich von einem 3-Dimensionalen Raum auf eine 2D-Fläche zeichne.
Ich würde nun gerne bei einem Klick darauf die genauen 3D-Koordinaten berechnen.
Gegeben sind alle Ecken des Dreiecks in 3D und 2D Koordinaten.

Siehe anhang

Freundliche Grüsse

jfheins 2. Mai 2016 21:26

AW: 2D- in 3D-Koordinate umrechnen
 
Du nimmst einen Punkt (nennen wir ihn A) als Basis.
Im 2D Raum kannst du dann jeden Punkt als Linearkombination von AB und AC schreiben. Die Linearkombination würde ich erst als lineares Gleichunssystem schreiben, das auflösen und die daraus resultierenden Formeln ins Programm einbauen. Du bekommst zwei vielfache für deine Vektoren (nennen wir sie u und w ).

Diese Werte (u, w) kannst du dann wiederum als Linarkombination in den 3D-Raum übertragen. (A als Basis und AB und AC als Vektoren) Und fertig 8-)

milos 2. Mai 2016 21:43

AW: 2D- in 3D-Koordinate umrechnen
 
Zitat:

Zitat von jfheins (Beitrag 1337314)
Du nimmst einen Punkt (nennen wir ihn A) als Basis.
Im 2D Raum kannst du dann jeden Punkt als Linearkombination von AB und AC schreiben. Die Linearkombination würde ich erst als lineares Gleichunssystem schreiben, das auflösen und die daraus resultierenden Formeln ins Programm einbauen. Du bekommst zwei vielfache für deine Vektoren (nennen wir sie u und w ).

Diese Werte (u, w) kannst du dann wiederum als Linarkombination in den 3D-Raum übertragen. (A als Basis und AB und AC als Vektoren) Und fertig 8-)

Hallo,

erstmal für die schlauen Worte! :-D

Könntest du das bitte ein wenig genauer erklären? Ich bin leider nicht wirklich ein Mathematik-Guru und verstehe nicht genau was mit Basis als Punkt A (3D oder 2D?) und der Linearkombination gemeint ist und was ich genau damit anstellen soll... :/
Wie gesagt, bin in Mathe wohl ein mal zu oft unkonzentriert gewesen. :oops:

Freundliche Grüsse

Edit: Falls unklar ist was ich genau meine, schaut im ersten Post vorbei da hab ich ein Bild hochgeladen ^^

jfheins 3. Mai 2016 06:12

AW: 2D- in 3D-Koordinate umrechnen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ja klar :) (Ziel war es auch, auszuloten was genau ich noch weiter erklären muss :angel:)

Also alles etwas ausführlicher: Du hast ein 3D-Dreieck mit den Punkten A, B und C. Diese hast du in eine Ebene projiziert, nennen wir die Punkte a, b und c. (klein)

Ausgehend von dem Punkt a kannst du nun ein neues, angepasstes Koordinatensystem definieren. a ist der Ursprung, die Strecke ab die eine Achse und ac die andere. Das ist dann nicht rechtwinklig, aber es funktioniert trotzdem. Vorteil ist, dass du alle Punkte im Dreieck als Vielfache der beiden Strecken angeben kannst.
Für einen beliebigen Punkt im 2D-Dreieck (x, y) brauchst du nun die Koordinaten in dem neuen Koordinatensystem. Nennen wir die Variablen (u, v) dann ergibt sich folgendes:

Anhang 45252

Mit den "Basisvektoren" b_1 und b_2. B_1 = b-a und b_2 = c-a. Die kannst du einfach nebeneinander in eine 2x2 Matrix schreiben.
Das ist jetzt ein lineares Gleichungssystem (kurz LGS) das sich gut lösen lassen sollte. (Wenn du nicht weist wie, frag nochmal nach. Wenn die Determinante der Matrix 0 ist, ist dein Dreieck nicht wohldefiniert.)

Wenn du das LGS gelöst hast, kannst du eine Formal für u und v hinschreiben. Diese überträgst du dann in das Programm und bekommst dann für jeden beliebigen Punkt die Werte u und v.

Anschließend rechnest du folgendes:
Anhang 45256

Das Ergebnis (der Vektor X) ist dein Punkt im 3D-Raum.

Namenloser 3. Mai 2016 07:01

AW: 2D- in 3D-Koordinate umrechnen
 
Nur als ergänzenden Hinweis: An den Stellen, wo bei jfheins (b1 b2) bzw. (B1 B2) steht, sind jeweils Blockmatrizen gemeint. Für mich sah das zuerst aus wie ein Skalarprodukt und ich war etwas verwirrt.

Zacherl 3. Mai 2016 14:12

AW: 2D- in 3D-Koordinate umrechnen
 
Ich hatte mir vor einiger Zeit mal diverse Klassen gebastelt, die für deinen Zweck nützlich sein könnten (alle angelehnt an die DirectX 9 Datentypen wie Vector2, Vector3, Quaternion, Matrix, etc).

Eingebaut hatte ich neben Hilfsfunktionen zur Konvertierung auch Transformationen, mit denen du die Punkte skalieren, drehen, verschieben kannst und noch vieles mehr.

Wenn das für dein Projekt kein Overkill ist und du die Klassen gebrauchen kannst, dann schaue ich mal, ob die noch irgendwo auf meiner Festplatte rumfliegen.

Medium 3. Mai 2016 22:08

AW: 2D- in 3D-Koordinate umrechnen
 
Ein anderer, evtl. einfacherer Weg, wäre es den Schnittpunkt zwischen dem Dreieck und dem "Mauszeiger" zu bilden. Stelle dir den Mauszeiger dabei als eine Gerade vor, die genau in Z-Richtung* durch den Zeiger "in den Bildschirm hinein" geht. Der Schnittpunkt ist sofort die gesuchte Lösung.

Zusatzinfo, die für das Problem an sich nicht mehr relevant ist: Das Verfahren nennt sich hochgestochen "Raycasting", und ist der kleine Bruder vom Raytracing. Diese Technik wird auch gerne in 3D-Editoren benutzt, um herauszufinden über welchem Objekt sich der Mauszeiger gerade befindet. (Und Doom basierte darauf! :D)

*) Achtung, das gilt nur für Orthogonalprojektion!!! Wenn du perspektivisch projezierst und/oder mehrere Dreiecke hast und/oder die Selektion auch über diese Technik machen willst, wird die Projektion wichtig. Dann muss die Gerade durch deinen Kamerapunkt in Richtung des Mauszeigers auf der Abbildungsebene gehen. Sonst triffst du irgendwo, aber nicht das was du glaubst. (Am besten zeichnet man sich seine "Zeiger-Gerade" mit in die Szene - wenn man sie nicht mehr sieht bzw. sie nur noch ein Punkt an der selben Stelle wie der Mauszeiger ist, dann ist sie sehr wahrscheinlich richtig.)

milos 5. Mai 2016 05:42

AW: 2D- in 3D-Koordinate umrechnen
 
Zitat:

Zitat von jfheins (Beitrag 1337323)
Ja klar :) (Ziel war es auch, auszuloten was genau ich noch weiter erklären muss :angel:)

Also alles etwas ausführlicher: Du hast ein 3D-Dreieck mit den Punkten A, B und C. Diese hast du in eine Ebene projiziert, nennen wir die Punkte a, b und c. (klein)

Ausgehend von dem Punkt a kannst du nun ein neues, angepasstes Koordinatensystem definieren. a ist der Ursprung, die Strecke ab die eine Achse und ac die andere. Das ist dann nicht rechtwinklig, aber es funktioniert trotzdem. Vorteil ist, dass du alle Punkte im Dreieck als Vielfache der beiden Strecken angeben kannst.
Für einen beliebigen Punkt im 2D-Dreieck (x, y) brauchst du nun die Koordinaten in dem neuen Koordinatensystem. Nennen wir die Variablen (u, v) dann ergibt sich folgendes:

Anhang 45252

Mit den "Basisvektoren" b_1 und b_2. B_1 = b-a und b_2 = c-a. Die kannst du einfach nebeneinander in eine 2x2 Matrix schreiben.
Das ist jetzt ein lineares Gleichungssystem (kurz LGS) das sich gut lösen lassen sollte. (Wenn du nicht weist wie, frag nochmal nach. Wenn die Determinante der Matrix 0 ist, ist dein Dreieck nicht wohldefiniert.)

Wenn du das LGS gelöst hast, kannst du eine Formal für u und v hinschreiben. Diese überträgst du dann in das Programm und bekommst dann für jeden beliebigen Punkt die Werte u und v.

Anschließend rechnest du folgendes:
Anhang 45256

Das Ergebnis (der Vektor X) ist dein Punkt im 3D-Raum.

Wow danke, das nenne ich mal ne Hammer Antwort und hilft sogar einen Mathe-Schwächling wie mir :thumb: Irgendwie hatte ich auch mal etwas ähnliches im Kopf, aber Mathematisch hätte ich das wohl nicht lösen können.

Also ich habe alles verstanden mit dem Koordinatensystem dessen Achsen auf der Linie des Dreiecks liegen, jedoch bin ich ein wenig mit der Gleichung überfordert, hoffe du nimmst es mir nicht übel :D Sehe ich das so richtig, das die Gleichung angibt (und falls das eine richtig dumme Frage ist, sag es mir bitte damit ich mich später vergraben kann :lol:) das x,y aus a+ub_1+vb_2 berechnet werden kann und u,v aus a + (b_1 b_2)? Wegen @Namenloser (Danke an der stelle :D) weiss ich ja das die eingeklammerten Basisvektoren Blockmatrizen sind, jedoch habe ich leider noch nie mit Matrizen gearbeitet und bisher immer versucht diese zu umgehen da es mir auf den ersten Blick zu kompliziert aussah, jedoch können sie sehr nützlich sein in dem Gebiet deshalb würde ich gerne den Umgang mit ihnen lernen. Wäre die Matrix so korrekt?:
Code:
[b_1_1, b_2_1
 b_1_2, b_2_2]
Oder was ich mir auch überlegt habe ist, ob ich irgendwie die Basisvektoren und u und v in eine Matrix schreiben soll, da es ja nebeneinander, aber das wäre ja auch komisch weil ich u und v ja noch gar nicht habe?

Wie du siehst bestehen bei mir noch einige Unklarheiten, jedoch glaube ich das wenn ich das mit der Blockmatrix begriffen habe, sollte ich die Formeln auch hinbekommen.

Delphi bietet ja in der Unit Delphi-Referenz durchsuchenSystem.Math.Vectors eine schöne Delphi-Referenz durchsuchenTMatrix Struktur. Diese wollte ich nun für einige Berechnungen zum testen benutzen, jedoch ist diese Standardmässig irgendwie nur eine 3x3 Matrix oder sehe ich das falsch? Wenn ich ja die restlichen "Felder" auf 0 setze klappt das ja nicht mehr wie es soll. Wäre es sinnvoller dafür ein eigenes Konstrukt zu bauen oder geht das auch irgendwie mit der Hauseigenen Lösung?


Zitat:

Zitat von Zacherl (Beitrag 1337364)
Ich hatte mir vor einiger Zeit mal diverse Klassen gebastelt, die für deinen Zweck nützlich sein könnten (alle angelehnt an die DirectX 9 Datentypen wie Vector2, Vector3, Quaternion, Matrix, etc).

Eingebaut hatte ich neben Hilfsfunktionen zur Konvertierung auch Transformationen, mit denen du die Punkte skalieren, drehen, verschieben kannst und noch vieles mehr.

Wenn das für dein Projekt kein Overkill ist und du die Klassen gebrauchen kannst, dann schaue ich mal, ob die noch irgendwo auf meiner Festplatte rumfliegen.

Das hört sich sehr gut an! :D
Sollte es für dir keine zu grossen Umstände bereiten, nehme ich die Klasse gerne als "Inspiration" für weitere Funktionen die ich dann einbauen muss.
Wäre schon sowas auch mal in Delphi und nicht nur C/C++ zu sehen :D

Zitat:

Zitat von Medium (Beitrag 1337420)
Ein anderer, evtl. einfacherer Weg, wäre es den Schnittpunkt zwischen dem Dreieck und dem "Mauszeiger" zu bilden. Stelle dir den Mauszeiger dabei als eine Gerade vor, die genau in Z-Richtung* durch den Zeiger "in den Bildschirm hinein" geht. Der Schnittpunkt ist sofort die gesuchte Lösung.

Zusatzinfo, die für das Problem an sich nicht mehr relevant ist: Das Verfahren nennt sich hochgestochen "Raycasting", und ist der kleine Bruder vom Raytracing. Diese Technik wird auch gerne in 3D-Editoren benutzt, um herauszufinden über welchem Objekt sich der Mauszeiger gerade befindet. (Und Doom basierte darauf! :D)

*) Achtung, das gilt nur für Orthogonalprojektion!!! Wenn du perspektivisch projezierst und/oder mehrere Dreiecke hast und/oder die Selektion auch über diese Technik machen willst, wird die Projektion wichtig. Dann muss die Gerade durch deinen Kamerapunkt in Richtung des Mauszeigers auf der Abbildungsebene gehen. Sonst triffst du irgendwo, aber nicht das was du glaubst. (Am besten zeichnet man sich seine "Zeiger-Gerade" mit in die Szene - wenn man sie nicht mehr sieht bzw. sie nur noch ein Punkt an der selben Stelle wie der Mauszeiger ist, dann ist sie sehr wahrscheinlich richtig.)

An das hatte ich auch schon gedacht, aber das Problem ist eben das nicht nur Orthogonal gezeichnet wird und ich dafür lieber eine Berechnung anhand der Position auf der Fläche hätte. ^^

Freundliche Grüsse

Medium 6. Mai 2016 07:53

AW: 2D- in 3D-Koordinate umrechnen
 
Der Weg über einen Strahl ist aber allgemeiner - gerade bei nicht-orthogonalen Projektionen!! ;) (Meiner Meinung nach würd sich's lohen.)

jfheins 6. Mai 2016 09:55

AW: 2D- in 3D-Koordinate umrechnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von milos (Beitrag 1337521)
Wow danke, das nenne ich mal ne Hammer Antwort und hilft sogar einen Mathe-Schwächling wie mir :thumb: Irgendwie hatte ich auch mal etwas ähnliches im Kopf, aber Mathematisch hätte ich das wohl nicht lösen können.

Also ich habe alles verstanden mit dem Koordinatensystem dessen Achsen auf der Linie des Dreiecks liegen, jedoch bin ich ein wenig mit der Gleichung überfordert, hoffe du nimmst es mir nicht übel :D Sehe ich das so richtig, das die Gleichung angibt (und falls das eine richtig dumme Frage ist, sag es mir bitte damit ich mich später vergraben kann :lol:) das x,y aus a+ub_1+vb_2 berechnet werden kann und u,v aus a + (b_1 b_2)?

Das ist eine Gleichung, die zweite Zeile ist lediglich eine Termumformung um aus den zwei getrennten Gleichungen eine zu machen. Die Gleichung ließ sich "so herum" einfach aufstellen. Aber von den Größen x, y, a, u, b1, v, b2 hast du ja alle bis auf u und v. Daher musst du die Gleichung noch umstellen, damit du u und v ausrechnen kannst ;-)
Und dieses Umstellen kannst du hier mit einer Matrixinversion lösen. Aber damit es eine Matrix zum invertieren gibt, musst du die Vektoren vorher in eine Matrix schreiben. Immer dran denken, Matrizen sind nicht so irre kompliziert Konstrukte - sie dienen in erster Näherung dazu, dass man bei vielen Gleichungen, die zusammen hängen, nichts verwechselt. Man könnte das ganze auch durch "scharfes hingucken" oder probieren lösen.

Zitat:

Wegen @Namenloser (Danke an der stelle :D) weiss ich ja das die eingeklammerten Basisvektoren Blockmatrizen sind, jedoch habe ich leider noch nie mit Matrizen gearbeitet und bisher immer versucht diese zu umgehen da es mir auf den ersten Blick zu kompliziert aussah, jedoch können sie sehr nützlich sein in dem Gebiet
Kann ich bestätigen, sind sehr nützlich :stupid:

Zitat:

deshalb würde ich gerne den Umgang mit ihnen lernen. Wäre die Matrix so korrekt?:
Code:
[b_1_1, b_2_1
 b_1_2, b_2_2]

Ja, genau das habe ich hier auf dem Zettel stehen :cyclops:
Zitat:

Oder was ich mir auch überlegt habe ist, ob ich irgendwie die Basisvektoren und u und v in eine Matrix schreiben soll, da es ja nebeneinander, aber das wäre ja auch komisch weil ich u und v ja noch gar nicht habe?
u und v sind nur Skalare, die kannst du untereinander in einen Vektor schreiben. Man kann Skalare als 1x1 Matrizen und Vektoren als 1xn Matrizen sehen, aber für mich fangen richtige Matrizen™ bei 2x2 an.

Umgestellt sieht die Gleichung so aus:

Anhang 45273

Und damit kannst du jetzt u und v ausrechnen. Beachte, dass das inverse wirklich links stehen muss, die Multiplikation ist nicht vertauschbar. Die Matrixinversion kannst du analytisch machen, die Formel dazu gibt es bei Wikipedia.

Zitat:

Wie du siehst bestehen bei mir noch einige Unklarheiten, jedoch glaube ich das wenn ich das mit der Blockmatrix begriffen habe, sollte ich die Formeln auch hinbekommen.

Delphi bietet ja in der Unit Delphi-Referenz durchsuchenSystem.Math.Vectors eine schöne Delphi-Referenz durchsuchenTMatrix Struktur. Diese wollte ich nun für einige Berechnungen zum testen benutzen, jedoch ist diese Standardmässig irgendwie nur eine 3x3 Matrix oder sehe ich das falsch? Wenn ich ja die restlichen "Felder" auf 0 setze klappt das ja nicht mehr wie es soll. Wäre es sinnvoller dafür ein eigenes Konstrukt zu bauen oder geht das auch irgendwie mit der Hauseigenen Lösung?
Was die konkrete Implementierung angeht, kann ich dir leider nicht so viel helfen, da ich schon lange nicht mehr Delphi gemacht habe. Aber die Mathematik sollte hier wie da funktionieren. Und es müsste eigentlich auch mit 3x3 Matrizen gehen, wenn du rechts und unten 0 hinschreibst.

Zacherl 6. Mai 2016 18:12

AW: 2D- in 3D-Koordinate umrechnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von milos (Beitrag 1337521)
Sollte es für dir keine zu grossen Umstände bereiten, nehme ich die Klasse gerne als "Inspiration" für weitere Funktionen die ich dann einbauen muss.
Wäre schon sowas auch mal in Delphi und nicht nur C/C++ zu sehen :D

Bitte sehr :thumb:

milos 8. Mai 2016 04:21

AW: 2D- in 3D-Koordinate umrechnen
 
Zitat:

Zitat von Zacherl (Beitrag 1337668)
Zitat:

Zitat von MILOS (Beitrag 1337668)
Sollte es für dir keine zu grossen Umstände bereiten, nehme ich die Klasse gerne als "Inspiration" für weitere Funktionen die ich dann einbauen muss.
Wäre schon sowas auch mal in Delphi und nicht nur C/C++ zu sehen :D

Bitte sehr :thumb:

Vielen dank!
Mit der Unit geht vieles einfacher und sie ist wirklich sehr gut und übersichtlich geschrieben und nimmt mir ne menge Arbeit ab, Respekt! :thumb:

Zitat:

Zitat von jfheins (Beitrag 1337616)
Umgestellt sieht die Gleichung so aus:

Anhang 45273

Und damit kannst du jetzt u und v ausrechnen. Beachte, dass das inverse wirklich links stehen muss, die Multiplikation ist nicht vertauschbar. Die Matrixinversion kannst du analytisch machen, die Formel dazu gibt es bei Wikipedia.

Danke, ich glaube ich konnte u und v nun mit der Klasse von @Zacherl korrekt berechnen, habe jedoch trotzdem ein Problem bei der berechnung von X wie in der 2. Gleichung die du gezeigt hast. Denn ich kann diese ja nicht gleich umformen wie die erste, denn wenn ich x und y oder u und v nehme habe ich ja nur einn 2D Vektor. Setze ich bei einem der drei eine 0 ein komme ich nicht zum möglichem Resultat. Könntest du mir da nochmal den Entscheidenden Hinweis geben?

Vielen Dank schon mal, warst jetzt schon sehr hilfsbereit :)

Freundliche Grüsse

Jens01 8. Mai 2016 11:32

AW: 2D- in 3D-Koordinate umrechnen
 
Guck Dir auch die Unit Vectorgeometry.pas im GLScene-Projekt an. Da könnte einiges drin sein, was Dich weiter bringt.

jfheins 8. Mai 2016 11:34

AW: 2D- in 3D-Koordinate umrechnen
 
Zitat:

Zitat von milos (Beitrag 1337719)
Danke, ich glaube ich konnte u und v nun mit der Klasse von @Zacherl korrekt berechnen, habe jedoch trotzdem ein Problem bei der Berechnung von X wie in der 2. Gleichung die du gezeigt hast. Denn ich kann diese ja nicht gleich umformen wie die erste, denn wenn ich x und y oder u und v nehme habe ich ja nur einn 2D Vektor. Setze ich bei einem der drei eine 0 ein komme ich nicht zum möglichem Resultat. Könntest du mir da nochmal den Entscheidenden Hinweis geben?

Die zweite Gleichung brauchst du auch nicht umformen ;-) Nachdem du ja mit der umgeformten, ersten Gleichung die "neuen Koordinaten" u und v ermittelt hast, setzt du die einfach in die zweite Gleichung ein. Bedenke, alle Vektoren die ich als Großbuchstaben geschrieben habe, sind 3x1 Vektoren. B_1 ist ja die Differenz von 2 Punkten im 3D-Raum, hat also eine x, y und z Komponente. Und die Matrix (B_1 B_2) ist rechteckig mit zwei Spalten und drei Zeilen.

Ergebnis ist der Vektor X, der zum ursprünglichen Punkt x passt. x könnte bspw. der Punkt sein, wo der User hingeklickt hat, dann ist X der entsprechende 3D-Punkt.

Zitat:

Vielen Dank schon mal, warst jetzt schon sehr hilfsbereit :)
Gerne :-)

milos 15. Mai 2016 16:34

AW: 2D- in 3D-Koordinate umrechnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey,

Habe nun das Wochenende versucht mich ein wenig in das Thema hineinzulesen und bin nun halbwegs drinnen. Die erste Formel kriege ich nun sicher ohne Probleme hin, jedoch habe ich immer noch ein kleines Verständnisproblem bei der 2. :/ (Ich habe sie nochmals angehängt damit klar ist welche gemeint ist^^)

Wieso genau steht dort 2 mal X=...? Klar, den Punkt könnte man ja auf verschiedene Arten berechnen jedoch komme ich bei A + u * B1 + u * B2 nicht auf ein mögliches Resultat und bei der unteren X Gleichung müsste ich ja einen 3D Vektor mit einem 2D Vektor (u,v ?) Multiplizieren oder nicht?

Wie man vielleicht erkennen kann, ich tappe wieder im dunkeln und je mehr ich drüber nachdenke desto mehr unklarheiten enstehen :shock::pale:

Ich glaube mein grösstes Problem sind eher die ganzen Gleichungen mit ihren Elementen und "Ausführungen", habe ich schön öfters bemerkt wenn man mal was auf Wikipedia o.ä. sucht :D

Wäre wirklich dankbar für nochmalige hilfe, denn ich verdreh mir gleich alles im kopf und kapiere gar nichts mehr :stupid:

Freundliche Grüsse

jfheins 15. Mai 2016 22:54

AW: 2D- in 3D-Koordinate umrechnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also das Bild hat ja drei Zeilen. die erste ist eine Definition. Die Basusvektoren B1 und B2 habe ich so definiert und die musstdu so ausrechnen.

Dann habe ich die zweite Gleichung aufgeschrieben (zweite Zeile) und vereinfacht/umgeformt (dritte Zeile). Das heißt, du brauchst nur eine davon. Welche dir liber ist.

Die erste Form: \vec{X} = \vec{A} + u \vec{B_1} + v \vec{B_2}
hier weißt du ja u und v aus der vorherigen Rechnung, Ich hoffe, für u und v gelten folgende Ungleichungen: u und v beide je zwischen 0 und 1, sowie u+v kleiner gleich 1. (Nur dann ist der Pukt nämlich im Dreieck!)

Dann rechnest du für jede der drei Komponenten von X die Gleichung aus, also X_x = A_x + u * (B_x - A_x) + v * (C_x - A_x)
Hier habe ich die Definition für B_1 und B_2 direkt eingesetzt, da sind also nur noch die x-Komponenten der 3D-Punkte drin und u, v.
Für die anderen beiden Komponenten von X brauchst du das analog. (also _y und _z)

Die zweite Form (dritte Zeile) macht daraus eine Matrixmultiplikation. Wenn du eine Bibliothek dafür hast, macht es das vll. einfacher.
Die Matrix setzt sich einfach aus den beiden Basisvektoren zusammen. Ich habe das mal in Excel gemacht:
Anhang 45312
Die Matrix habe ich mal fett umrahmt, das Ergebnis der Matrixmultiplikation ist grün und das Endergebnis (das große X) ist die Addition von dem grünen und A und steht oben rechts.

Zu dem was du schon hast:
Zitat:

jedoch komme ich bei A + u * B1 + u * B2 nicht auf ein mögliches Resultat
zeig doch mal deinen Rechnweg und deine Ergebnisse, die du anhand des Beispiels aus dem ersten Post bekommen hast.

Zitat:

bei der unteren X Gleichung müsste ich ja einen 3D Vektor mit einem 2D Vektor (u,v ?) Multiplizieren oder nicht?
Nein. entweder machst du die Matrix "richtig", dann hast du 3x2 Skalare und u und v als Skalar. (Oder einen uv-Vektor)
Oder du "behältst" die Vektoren B_1 und B_2, dann steht da aber nur (Überraschung ^^) B_1*u + B_2 * v -- wie in der ersten Gleichung.

milos 16. Mai 2016 12:42

AW: 2D- in 3D-Koordinate umrechnen
 
Danke, hab mir das zum Teil schon gedacht aber nun ist es mir Klar, hab nicht gedacht das man selbst eine 3x2 mit einer 2x1 Matrix multiplizieren kann, ist ja aber ganz logisch und es klappt wunderbar :D

Der Fehler tritt bei mir tatsächlich in der ersten Formel auf wo ich es mit der Matrixinversion probiere soll denn wenn ich die 2. Formel mit korrekten "Labordaten" (z.b die aus der excel tabelle) füttere erhalte ich korrekte Daten wie bei dir auch. Momentan mache ich das so um u und v auszurechnen das ich eine Delphi-Referenz durchsuchenTMatrix3D mit den Daten aus b1 und b2 fülle sodass die Matrix so aussieht:

Delphi-Quellcode:
M=
[b_1_1, b_2_1, 0,
 b_1_2, b_2_2, 0,
   0    ,  0    , 0
Also eigentlich ne 3x3 Matrix weil das bei TMatrix der standard ist, die restlichen Felder habe ich als 0 deklariert. Danach habe ich die inversion (heisst das so?) Berechnet und den determinanten davon mit (xy - a) multipliziert, also genau so in pseudo code:
Code:
determinant(inversion(M)) * (xy - a)
Ich bin hier wieder fleissig am lesen und versuche das Thema zu verstehen und glaube gerade das ich mich mit dem determinanten vertan hab und glaube eher das ich die inversierte matrix mit dem vektor multiplizieren muss oder irre ich mich da wieder komplett? Wie sehe ich was eine Blockmatrix und was eine ganz normale Klammer ist? Wie gesagt hab die letzten tage vieles durch "try n' error" versucht und weiss mittlerweile gar nicht mehr wirklich was ging und was kläglich scheiterte :oops:

Ich versuchs erstmal weiter, vielen vielen herzlichen dank für deine grossartige unterstützung, kann mir vorstellen wie mühesam es ist sowas mir beibzubringen :stupid::lol: trotzdem schön zu sehen das es Leute gibt die es versuchen :)

Freundliche Grüsse

jfheins 16. Mai 2016 15:52

AW: 2D- in 3D-Koordinate umrechnen
 
Ah ja da ist ja der Fehler :wink:

Ich habe zwar oben von "mit Nullen auffüllen" geschrieben, aber das war nicht ganz richtig - wie mir gerade aufgefallen ist. Das Element unten rechts müsste dennoch 1 sein. (Stell dir eine Einheitsmatrix vor, in die man die kleinere Matrix hineinkopiert)
Zitat:

Wie sehe ich was eine Blockmatrix und was eine ganz normale Klammer ist?
Durch Erfahrung ^^ Also wenn da zwei Sachen übereinander oder nebeneinander in der Klammer stehen, ohne Symbol dazwischen, dann ist das eine Matrix.

Zitat:

determinant(inversion(M)) * (xy - a)
Das passt so nicht. (Fun Fact: Die Determinante der Inversen ist gleich dem inversen der Determinante. Du könntest das zu 1/determinant(M) vereinfachen.)
Du braucht die Determinante nicht, wenn du direkt die Inverse berechnest. (Du brauchst sie eventuell zur Berechnung der Inversen)

Ich habe mal deine Punkte von oben durchgerechnet mit Zwischenergebnissen. Vielleicht wird dann klarer, wie die Formeln in Code aussehen.
Grundlegendes zuer MATLAB-Syntax: Semikolon (;) macht eine neue Zeile, vertcat verkettet vertikal, horzcat horizontal.
[1; 0; 0] ist also ein Spaltenvektor und gleichbedeutend mit vertcat(1, 0, 0)
Code:
A = [20; 100; 0]
B = [20; 100; 20]
C = [0; 100; 20]

a = [0; 100]
b = [50; 0]
c = [100; 200]

x = 50;
y = 90;

%% Ab hier sind Eingaben mit >> am Angang, der Rest ist das Ergebnis der vorigen Eingabe

>> xy = vertcat(x, y) % Untereinander schreiben
xy =
    50
    90
>> Basis2D = horzcat(b-a, c-a) % Nebeneinander schreiben
Basis2D =
    50   100
  -100   100
>> inv(Basis2D) % Inverse
ans =
    0.0066667   -0.0066667
    0.0066667    0.0033333
>> uv = inv(Basis2D) * ( xy - a )
uv =
          0.4
          0.3
>> Basis3D = horzcat(B-A, C-A)
Basis3D =
     0   -20
     0     0
    20    20
>> X = A + Basis3D * uv
X =
    14
   100
    14
Falls du mit 3x3 Matrizen rechnen musst, geht der letzte Teil so:
Code:
>> xy = vertcat(x, y) % Untereinander schreiben
xy =
    50
    90
>> Basis2D = horzcat(b-a, c-a) % Nebeneinander schreiben
Basis2D =
    50   100
  -100   100
>> Basis2D(3, 3) = 1 % Erweitern
Basis2D =
    50   100     0
  -100   100     0
     0     0     1
>> inv(Basis2D) % Inverse
ans =
    0.0066667   -0.0066667            0
    0.0066667    0.0033333            0
            0            0            1
>> uv = inv(Basis2D) * vertcat( xy - a, 0 )
uv =
          0.4
          0.3
            0
>> Basis3D = horzcat(B-A, C-A, [0; 0; 0])
Basis3D =
     0   -20     0
     0     0     0
    20    20     0
>> X = A + Basis3D * uv
X =
    14
   100
    14

milos 18. Mai 2016 01:52

AW: 2D- in 3D-Koordinate umrechnen
 
Unglaublich!
Vielen vielen vielen dank hab's endlich geschafft!
Woooow, das war wohl das ekligste im Mathematik Bereich was ich bisher gemacht habe jedoch bin ich froh das du mir so gut unter die Arme gegriffen hast, hab es nun endlich verstanden das ich Vektoren und Skalare eigentlich als Matrizen betrachten und das man das so einfach untereinander oder nebeneinander schreiben kann.

Ich hoffe deine Beiträge hier werden auch in Zukunft anderen helfen, so wie du das alles 10 mal verinfacht für mich erklären musstest wird bestimmt jeder Depp das verstehen :lol:

Zitat:

Zitat von jfheins (Beitrag 1338228)
Zitat:

determinant(inversion(M)) * (xy - a)
Das passt so nicht. (Fun Fact: Die Determinante der Inversen ist gleich dem inversen der Determinante. Du könntest das zu 1/determinant(M) vereinfachen.)
Du braucht die Determinante nicht, wenn du direkt die Inverse berechnest. (Du brauchst sie eventuell zur Berechnung der Inversen)

Okay, wenn du das hier ernst meinst gibts wieder ein paar die es nicht verstehen werden :D
Aber das meinst du doch nicht oder? xD

Freundliche Grüsse und danke nochmal, bist ein Schatz :love:

jfheins 18. Mai 2016 18:53

AW: 2D- in 3D-Koordinate umrechnen
 
Zitat:

Zitat von milos (Beitrag 1338311)
Unglaublich!
Vielen vielen vielen dank hab's endlich geschafft!
Woooow, das war wohl das ekligste im Mathematik Bereich was ich bisher gemacht habe jedoch bin ich froh das du mir so gut unter die Arme gegriffen hast, hab es nun endlich verstanden das ich Vektoren und Skalare eigentlich als Matrizen betrachten und das man das so einfach untereinander oder nebeneinander schreiben kann.

Freut mich, dass es jetzt klappt :)


Zitat:

Okay, wenn du das hier ernst meinst gibts wieder ein paar die es nicht verstehen werden :D
Aber das meinst du doch nicht oder? xD
Ich weiß nicht genau, was ich da nicht ernst meinen soll :stupid:
Der Spruch "Die Determinante der Inversen ist gleich dem inversen der Determinante." klingt vielleicht erst mal verwirrend. Aber damit ist nur gemeint:
Code:
M =
    50   100
  -100   100
>> det(M)
ans =
       15000
>> det(inv(M))
ans =
   6.6667e-05
>> 1/ans
ans =
       15000
Die Determinante ist ja ein Skalar, und das inverse eines Skalars nennt man auch Kehrwert. EInsteigerfrundlicher könnte man also sagen:
Zitat:

Die Determinante der inversen Matrix von M ist gleich dem Kehrwert der Determinante von M.
Da spielt dann auch direkt hinein: Eine Matrix ist genau dann invertierbar, wenn det(M) <> 0.
Wenn die Determinante gleich 0 ist, müsstest du beim invertieren der Matrix irgendwann durch 0 teilen. Eine solche Matrix ist nicht invertierbar. Das passiert beispielsweise, wenn man eine komplette Zeile mit Nullen füllt. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz