Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 12.02.15 18:22 
Moin!

Für ein Projekt muss ich auch 6 Punkten in den jeweiligen Raumrichtungen (+X,-X,+Y,-Y,+Z,-Z) ein lokales Rechte-Hand-Koordinatensystem konstruieren. Dazu gibt es bekanntermaßen 48 Lösungen, ich suche die mit der geringsten Rotation gegenüber einem Referenzsystem, sollten 2 gleich gut sein, dann das, dessen (1,1,1)-Vektor im positiven Oktanten des Referenzsystems liegt. (Beispiel)

Mein aktuelles Vorgehen sieht so aus:
ausblenden Quelltext
1:
2:
3:
4:
Aus der Menge der Nachbarn N, Mittelpunkt C:
  finden: kleinster winkel (C->N) zu (1,0,0), speichern als "A"
  finden: kleinster winkel (C->N) zu (0,1,0), welcher senkrecht auf (C->"A") steht, speichern als"B"
  (0,0,1) ist dann "A" x "B" (Überprüfung: da muss auch ein N sein)

Funktioniert sehr gut, aber wenn eine Achse genau 45° gedreht ist gibt es immer 2 gleich gute Lösungen für die betreffende Richtung, nämlich mit +45 und -45° (was als Winkel zwischen Vektoren beides 45° ergibt, da ist das Problem). Da werfe ich im Moment mit Sonderfallbehandlungen drauf, aber das kanns nicht so ganz sein.

Das könnte man einfacher machen, wenn ich aus den 3 Vektoren direkt eine Matrix konstruiere und dann die Eulerwinkel zwischen der Referenzmatrix und der neuen Matrix bestimme (also: "wie müsste ich das rotieren, um das ermittelte zu bekommen?") und diese minimiere. Sind ja nur 48, das ist von der Rechenzeit nicht so schlimm.

Erschwerend kommt hinzu, dass meine Deformation keine reine Rotation ist, sondern geringe Scher- und Stauchkomponenten enthält. Das Koordinatensystem wird also nicht exakt Orthogonal sein, aber definitiv in >85°.

Hat da jemand eine clevere Idee?

Viele Grüße,
Sebastian

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Do 12.02.15 23:43 
Ich nehme an, das Problem an dem Ansatz "Euler Drehwinkel bestimmen" war gerade, dass es keine reine Rotation ist?

Du könntest auch die 48 Kombinationen durchgehen und jeweils zwischen en Vektoren die Winkel bestimmen. Also zum Beispiel 1-x·x' für die x-Achse. Also Skalarprodukt, und das dann 1- damit der Wert bei einer geringen Drehung gering ist. Am Ende dann von den 48 Möglichkeiten diejenige mit der kleinsten Summe heraussuchen.
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Fr 13.02.15 18:32 
Jup, das ist exakt so wie ich es aktuell hab. Jede Achse einzeln wird so zusammengefummelt, siehe erster Beitrag. Den Code findet man jetzt auch im git.

Das Problem ist Konsistenz, die wolle ich dadurch erreichen dass ich das komplette System am Stück baue. Im Endeffekt brauche ich zwingend eine bestimmte Ausrichtungsart, weil sonst die nachfolgende stereografische Projektion an der falschen Stelle rauskommt. Moment. Mit diesem Satz könnte ich glaube ich zumindest die Anforderungen besser beschreiben. Das muss ich mal durchrechnen.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."