AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2D- in 3D-Koordinate umrechnen

Ein Thema von milos · begonnen am 2. Mai 2016 · letzter Beitrag vom 18. Mai 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#1

2D- in 3D-Koordinate umrechnen

  Alt 2. Mai 2016, 21:30
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
Miniaturansicht angehängter Grafiken
bsp.png  
Milos

Geändert von milos ( 3. Mai 2016 um 04:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: 2D- in 3D-Koordinate umrechnen

  Alt 2. Mai 2016, 22:26
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
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: 2D- in 3D-Koordinate umrechnen

  Alt 2. Mai 2016, 22:43
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
Hallo,

erstmal für die schlauen Worte!

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.

Freundliche Grüsse

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

Geändert von milos ( 3. Mai 2016 um 04:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: 2D- in 3D-Koordinate umrechnen

  Alt 3. Mai 2016, 07:12
Ja klar (Ziel war es auch, auszuloten was genau ich noch weiter erklären muss )

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:

latex_f5b3b0b29de2dad909a4bed8a8a7a84e.png

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:
latex_7393fab1a0823dd2401b6fd605f868d8.jpg

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

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: 2D- in 3D-Koordinate umrechnen

  Alt 3. Mai 2016, 08:01
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.

Geändert von Namenloser ( 3. Mai 2016 um 08:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: 2D- in 3D-Koordinate umrechnen

  Alt 3. Mai 2016, 15:12
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: 2D- in 3D-Koordinate umrechnen

  Alt 3. Mai 2016, 23:08
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! )

*) 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.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: 2D- in 3D-Koordinate umrechnen

  Alt 5. Mai 2016, 06:42
Ja klar (Ziel war es auch, auszuloten was genau ich noch weiter erklären muss )

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 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 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 ) 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 ) 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?


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!
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

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! )

*) 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
Milos
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: 2D- in 3D-Koordinate umrechnen

  Alt 6. Mai 2016, 08:53
Der Weg über einen Strahl ist aber allgemeiner - gerade bei nicht-orthogonalen Projektionen!! (Meiner Meinung nach würd sich's lohen.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#10

AW: 2D- in 3D-Koordinate umrechnen

  Alt 6. Mai 2016, 10:55
Wow danke, das nenne ich mal ne Hammer Antwort und hilft sogar einen Mathe-Schwächling wie mir 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 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 ) 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 ) 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

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
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:

latex_ade012607c860cd4a5b86a793729b6d9.png

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.

Geändert von jfheins ( 6. Mai 2016 um 11:00 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz