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 2 von 2     12   
Benutzerbild von Zacherl
Zacherl

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 6. Mai 2016, 19:12
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
Bitte sehr
Angehängte Dateien
Dateityp: pas VectorTypes.pas (23,6 KB, 38x aufgerufen)
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 8. Mai 2016, 05:21
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
Bitte sehr
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!

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
Milos

Geändert von milos ( 8. Mai 2016 um 05:51 Uhr)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#13

AW: 2D- in 3D-Koordinate umrechnen

  Alt 8. Mai 2016, 12:32
Guck Dir auch die Unit Vectorgeometry.pas im GLScene-Projekt an. Da könnte einiges drin sein, was Dich weiter bringt.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 8. Mai 2016, 12:34
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
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 15. Mai 2016, 17:34
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

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

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

Freundliche Grüsse
Miniaturansicht angehängter Grafiken
latex_7393fab1a0823dd2401b6fd605f868d8.jpg  
Milos
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 15. Mai 2016, 23:54
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:
unbenannt.png
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.
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 16. Mai 2016, 13:42
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

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

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 trotzdem schön zu sehen das es Leute gibt die es versuchen

Freundliche Grüsse
Milos

Geändert von milos (16. Mai 2016 um 14:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 16. Mai 2016, 16:52
Ah ja da ist ja der Fehler

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

Geändert von jfheins (16. Mai 2016 um 16:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 18. Mai 2016, 02:52
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

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
Aber das meinst du doch nicht oder? xD

Freundliche Grüsse und danke nochmal, bist ein Schatz
Milos

Geändert von milos (18. Mai 2016 um 02:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

AW: 2D- in 3D-Koordinate umrechnen

  Alt 18. Mai 2016, 19:53
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
Aber das meinst du doch nicht oder? xD
Ich weiß nicht genau, was ich da nicht ernst meinen soll
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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