Kreis auf einer Ebene
-
Nur mal rein prinzipiell: Sollte es nicht evtl. einfacher sein, das was du da oben beschreibst direkt mit den exakten Kreisen zu machen anstatt zuerst irgendwie komplizierte Approximationen zu bestimmen? Die Minkowski Summe von zwei Kreisen sollte doch wieder ein Kreis sein!?
-
SeppJ schrieb:
cl90 schrieb:
Ich hatte gehofft es gibt einen schnelleren Weg. Es passiert ja gelegentlich, dass man einen sehr einfachen Weg übersieht.
Meinen ersten Ansatz hast du aber schon gelesen, oder?
Klar
Nur weiß ich nicht wie ich das Analytische Problem Programmieren soll.
Es gibt unendlich viele Orthogonale Vektoren, und ich möchte nicht eine Numerische Suche nach einem Starten. Das dauert alles viel zu lange.
Wenn du eine Idee hast einen Orthogonalen Vektor zu finden, würde ich die gerne hören
dann wäre das eine 1A Lösung.Das Hauptproblem ist, das ich keinen Zweiten Punkt auf der Ebene Kenne. Hätte ich einen, könnte ich diesen auf die Länge R Skallieren und mit einer Supereinfachen einmaligen Drehung und Zweimaliger Spiegelung die 4 Punkte finden. Leider habe ich keinen weiteren Punkt.
Also Theorethisch wäre die Lösung meines Problemes einen beliebigen weiteren Punkt auf der Ebene zu finden, Und das am besten mit einer einfachen Berechnung.dot schrieb:
Nur mal rein prinzipiell: Sollte es nicht evtl. einfacher sein, das was du da oben beschreibst direkt mit den exakten Kreisen zu machen anstatt zuerst irgendwie komplizierte Approximationen zu bestimmen? Die Minkowski Summe von zwei Kreisen sollte doch wieder ein Kreis sein!?
Nicht ganz. Die MinkowskiSumme zweier Kreise ist je nach Kreis eine Fläche/ Donut oder ein 3D Konstrukt wenn beide Kreise nicht Paralell sind.
Und die Summe wird nicht zwischen zwei Kreisen, sondern zwischen zwei Polyedern mit 8 Ecken ausgeführt.
Außerdem wird die Minkowski Summe nicht ausgeführt weil Sie zu teuer ist. Faktisch betracht werden die Punktwolken aufaddiert und die Convexe Hülle gesucht, womit dann alle anderen Punkte die nicht Teil der Hülle Sind verworfen werden.
-
cl90 schrieb:
Das Hauptproblem ist, das ich keinen Zweiten Punkt auf der Ebene Kenne.
Und was war das dann mit
cl90 schrieb:
Es gibt eine Möglichkeit z.B. an der Spitze des Normalenvektors eine Achse zu generieren welche ich für eine Rodrigues Rotation nutze. So könnte man einen Punkt mit Radius R finden.
-
Mir ist entfallen, dass ich für diese Rotation ebenfalls ein Ähnliches Problem lösen muss.
An der Spitze des Normalenvektors brauche ich auch einen Orthogonalen Vektor für die RotationsAchse.
Also habe ich das selbe Problem.Edit:
Stumpf, dass es so lange gedauert hat bis der Groschen gefallen ist, aber ist das hier eine lösung:
n = normalenvektor
e = irgendein random Vektor (z.b. 1 0 0)
b = cross(n,e) -> Orthogonaler Vektor der mir einen zweiten Punkt auf der Ebene Gibt?
-
Ok, nun, einfache Möglichkeit: Berechne einen neuen Punkt durch verschieben deines Kreismittelpunktes in Richtung der Hauptachse, entlang der dein Normalvektor die geringste Ausdehnung hat, berechne den Vektor vom neuen Punkt zum Ausgangspunkt, bestimme das Kreuzprodukt dessen mit der Ebenennormale, addiere das zum Ausgangspunkt und voilà hast du einen weiteren Punkt in der Ebene...
-
cl90 schrieb:
Stumpf, dass es so lange gedauert hat bis der Groschen gefallen ist, aber ist das hier eine lösung:
n = normalenvektor
e = irgendein random Vektor (z.b. 1 0 0)
b = cross(n,e) -> Orthogonaler Vektor der mir einen zweiten Punkt auf der Ebene Gibt?Ja, das ist der triviale Ansatz. Der scheitert aber wenn dein n zufälligerweise gleich e ist (Kreuzprodukt kollabiert dann). Du musst nur irgendwie sicherstellen, dass das nicht passieren kann...
-
dot schrieb:
Ja, das ist der triviale Ansatz. Der scheitert aber wenn dein n zufälligerweise gleich e ist (Kreuzprodukt kollabiert dann). Du musst nur irgendwie sicherstellen, dass das nicht passieren kann...
Das ist glücklicherweise sehr einfach, da die Normelenvektoren von -45° bis +45° auf einer beschnittenen Halbsphäre liegen. Ich kann einfach den 90° einheitsvektor neben. Sprich [0, 0, R] und ich erhalte immer einen Vektor != Normalenvektor.
Zu deiner Mathematik habe ich aber nochmal eine Frage. War in deinem Ansatz etwas drin, so dass der resultierende orthogonale Vektor genau die richtige Länge (R) erhällt? Eine Faktorisierung auf Länge R ist jetzt nicht so teuer, aber es wäre schon ziemlich praktisch wenn die Lösung des Kreutzproduktes bereits auf Länge R wäre.
Soweit schonmal ein Danke an euch alle
Hat etwas länger gedauert bis ich es begriffen habe, aber das Hauptproblem ist gelöst.
-
cl90 schrieb:
Zu deiner Mathematik habe ich aber nochmal eine Frage. War in deinem Ansatz etwas drin, so dass der resultierende orthogonale Vektor genau die richtige Länge (R) erhällt?
Nein, das geht im Allgemeinen leider nicht. Die Länge des Kreuzproduktes skaliert mit dem Sinus des Winkels zwischen den beiden Ausgangsvektoren. Wenn die beiden Ausgangsvektoren also nicht normal aufeinander stehen, wirst du dein Kreuzprodukt noch normalisieren müssen...
-
Danke
-
Zur Ergänzung falls jemand anderes eine Lösung gebrauchen könnte:
Wenn die Ebenengleichung in: Stützpunkt und NormalenVektor gebeben ist, kann ein Beliebiger Punkt auf der Ebene auch ohne Kreutzprodukt generiert werden:
n = (a, b, c)
v = (-b, a, 0) // ist ein Orthogonaler Vektor<n, v> = 0; // Skalarprodukt
Da spaart man sich glatt nochmal das Kreutzprodukt