Kugelposition durch 4 Punkte definieren

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Kugelposition durch 4 Punkte definieren

    Hallo zusammen,
    ich stehe vor folgendem Problem.
    Gegeben sind 4 Punkte im 3Dimensionalen Raum. Diese 4 Punkte liegen auch auf unterschiedlicher Höhe.
    Zusätzlich ist auch ein Radius vorgegeben. Sonst würde ich dieses Beispiel verwenden:

    arndt-bruenner.de/mathe/scripts/kugel4p.htm

    Nun soll eine Kugel auf diesen vier Punkten definiert werden.

    Gesucht ist also z.B. der Mittelpunkt der Kugel.

    Hier ein paar Bilder zum besseren Verstehen.

    (Anhang)

    Ich hoffe ihr könnt mir ein paar Ansätze oder eine Formel sagen.

    Liebe Grüße
    Bilder
    • 7cfa286d-a0cd-437f-b608-cbc555b703e2.jpg

      64,21 kB, 1.564×986, 79 mal angesehen
    • df622afc-61b3-4790-ab36-ec3efb643830 (1).jpg

      482,76 kB, 1.539×989, 75 mal angesehen
    • df622afc-61b3-4790-ab36-ec3efb643830.jpg

      482,76 kB, 1.539×989, 71 mal angesehen
    @Farliam Die Kugelgleichung mit den drei ersten Werten aufschreiben, einen Start-Mittelpunkt berechnen und den dann iterativ verbessern durch Hinzunahme des 4. Wertes.
    ===
    Probiere aus, 4 Mal das Problem zu lösen, idem Du je einen (anderen) Wert weglässt.
    Mittle die 4 Lösungen, das könnte schon reichen.
    ===
    Das ganze geht schief, wenn die Punkte zu sehr in einer Ebene liegen, "zu sehr" orientiert sich dabei am Kugelradius.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es gibt eine ganze Reihe von Möglichkeiten eine Kugel mathematisch zu beschreiben. Vermutlich wirst du hier die Kugelgleichung der analytischen Geometrie (Vektorrechnung) verwenden:

    (x - xm)² + (y -ym)² + (z - zm)² = r²

    Dabei ist das Tupel (x, y, z) ein beliebiger Punkt der Kugeloberfläche und (xm, ym, zm) der Mittelpunkt der Kugel.

    Alle Tupel, welche die Kugelgleichung erfüllen, bilden die Kugeloberfläche.

    Wenn du drei Kugelpunkte und den Radius r hast, dann kannst du diese in die obige Gleichung einsetzen und erhältst ein System von drei (quadaratischen) Gleichungen, das genau dann lösbar ist, wenn die drei Punkte linear unabhängig sind, d.h. wenn sie nicht auf einer Geraden liegen. (das kann man mathematisch leicht abprüfen. (r muss natürlich größer 0 sein.)

    Allerdings ist es nicht ganz so einfach ein quadratisches Gleichungssystem zu lösen (anders als bei den linearen Gleichungen) ... und blöderweise ist die Lösung nicht eindeutig. Wenn (xm, ym, zm) eine Lösung ist, dann ist der Punkt (xm', ym', zm'), der durch Spiegelung an der Ebene entsteht, die durch die drei gegebenen Punkte entsteht, auch eine Lösung.

    Mit dem vierten Punkt kann man nun also prüfen, welche der beiden Kugeln die Lösung ist.

    Dazu setzen wir diesen vierten Punkt nacheinander in die beiden Kugelgleichungen ein.

    Fall 1: Punkt vier erfüllt KEINE der beiden Gleichungen. Dann ist die Aufgabe widersprüchlich und damit nicht lösbar. Es gibt keine Kugel mit diesen vier Punkten. Schade. :)

    Fall 2: Punkt vier erfullt BEIDE Gleichungen. Dann liefert der vierte Punkt keine sinnvollen Informationen. Er ist redundant und dann sind beide Kugeln Lösungen. Das ist dann der Fall, wenn alle vier Punkte auf einem Kreis liegen. In diesem Fall gibt es keine eindeutige Lösung.

    Fall 3: Punkt vier erfüllt genau EINE Kugelgleichung. Dann hat man herausgefunden, welche Kugel die Lösung ist.

    So kann man das jetzt programmtechnisch umsetzen. Wobei die Sache mit dem quadratischen Gleichungssystem eine etwas haarige Angelegenheit ist. Wie man das macht schreib ich dir, wenn du noch Interesse haben solltest.

    Das ist die Antwort der analytischen Geometrie auf deine Frage. Ich hoffe, ich habe dich nicht gar zu sehr strapaziert. :)

    LG
    Peter

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Peter329“ ()

    ich kann sowas nur anschaulich denken. Und auch nur sehr ins Unreine:
    3 Punkte spannen eine Fläche im Raum auf.
    4 Punkte kann man verwenden, um 2 Flächen aufzuspannen.
    Wo die Normal-Vektoren der Flächen sich treffen - ist da der Mittelpunkt der Kugel?
    Na, vielleicht auch nicht.
    Nee - ich glaub war nix.
    Moin.
    Dies ist sehr allgemein, aber falls es dir hilft, hier kannst du vieles einfügen.

    matheretter.de/geoservant/de
    gib das ein
    kugel(0|0|0 4){F00}
    vektor(0|0|0 2|2|2,828 "a")

    Wie du siehst, habe ich den Vektor bereits so lang gemacht, dass er genau auf die Oberfläche trifft. Sein Betrag entspricht also dem Radius. Wenn du ein Punkt nach dem anderen auf der Oberfläche brauchst (so wie ich in meinem Thread schon gezeigt habe (siehe Code)), dann musst du die x-, y- und z-Komponenten so berechnen, dass der Betrag wieder der Radius der Kugel wird:

    $$x = r \cdot sin(ϑ) \cdot cos(ϕ) $$


    $$y = r \cdot sin(ϑ) \cdot sin(ϕ) $$


    $$z = r \cdot cos(ϑ) $$



    Hier noch der Wikipedia-Eintrag, vor allem der Teil "Umrechnungen" hat mir auch geholfen.

    Und noch zum Schluss: Videos von Daniel Jung

    1)

    2)
    Die Berechnungsvorschrift ist doch auf der Seite bereits angegeben?
    Was genau also ist deine Frage?

    Das ist das zu lösende Gleichungssystem:


    Der Mittelpunkt ergibt' sich folgendergestalt:


    Und der Radius:


    Ist deine Frage wie man lineare Gleichungssysteme algorithmisch löst?
    Und Gott alleine weiß alles am allerbesten und besser.

    ErfinderDesRades schrieb:

    4 Punkte kann man verwenden, um 2 Flächen aufzuspannen.
    Nö.
    4 Flächen, bei jeder fehlt ein anderer Punkt.
    ====
    @Farliam Mal anschaulich gedacht (4 Punkte, nicht in einer Ebene, keine 3 auf einer Geraden):
    3 Punkte definieren einen Kreis.
    Lege in diesen Kreis eine Kugel mit (gedanklich) variablem Radius, wobei dieser Kreis für alle gedachten Kugeln derselbe ist.
    Nun änderst Du den Radius der Kugel so lange, bis die Kugel den vierten Punkt berührt.
    Wenn der resultierende Radius mit dem gegebenen übereinstimmt, hast Du gewonnen.
    Wenn nicht, musst Du die Aufgabenstellung präzisieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    4 Punkte kann man verwenden, um 2 Flächen aufzuspannen.


    3 Punkte, die nicht kolinear sind, spannen eine Ebene auf.

    4 Punkte, die nicht komplanar sind spannen einen Tetraeder auf, also VIER Flächen.

    Übrigens, welche Normalen willst du denn schneiden ? Eine Ebene hat nämlich unendlich viele Normalen. :)

    RodFromGermany schrieb:

    Nun änderst Du den Radius der Kugel so lange, bis die Kugel den vierten Punkt berührt.


    Unter der o.a. Bedingung, dass die vier Punkte nicht komplanar sind, kann man das so machen !

    Die Berechnung ist recht einfach:

    Mit den ersten drei Punkten P1, P2, P3 bildet man die Richtungsvekoren r1 = Vektor(P1, P2) und r2 = Vektor (P2, P3)

    Das Kreuzprodukt r1 x r2 liefert einen orthogonalen Vektor, den normiert man auf die Länge 1 und erhält den Normalenvektor e1 auf die Ebene E(P1, P2, P3).

    Mit e1 hat man die Gleichung der Ebene E in der Normalenform.

    Man berechnet die Gleichungen der Mittelsenkechten m1 auf die Strecke (P1, P2) und m2 auf die Strecke (P2, P3). Dazu verwendet man die Punkt-Richtungsform der Geradengleichung. Die Richtungen der Mittelsenkrechten ergeben sich aus r1 x e1 und r2 x e1.

    Dann schneidet man die Mittelsenkrechten m1 und m2 und erhält den Mittelpunkt M der Kreises durch P1, P2, P3.

    Mit der Punkt-Richtungsform hat man damit die Gleichung der Normalen h auf den Kreis durch den Mittelpunkt M.

    Mit dem Parameter t wählen wir einen beliebigen Punkt Q auf der Normalen h.

    Wir bestimmen nun t so, dass der Abstand (P1, Q) = Abstand (P4, Q) gleich ist. Q ist der Mittelpunkt der gesuchten Kugel und Abstand (P1, Q) der gesuchte Radius der Kugel.

    Rechnerisch ist das alles ziemlich hausbacken:

    Man braucht dazu:

    - das KREUZPRODUKT von zwei Vektoren, um den orthogonalen Vektor zu bestimmen (das kann man leicht programmieren)

    - die Lösung eines linearen Gleichungssystems mit zwei Variablen, um den Schnittpunkt von Geraden zu bestimmen. Dazu verwendet man am einfachsten die Cramer'sche Regel. Die nutzt DETERMINANTEN und auch das kann man leicht programmieren.

    So würde ich die gesuchte Kugel berechnen.

    [edit]

    Was man vielleicht noch anmerken sollte: bei der Rechnung wird der vorgegebene Kugelradius nicht verwendet ! Diese Angabe ist nämlich redundant, sie ergibt sich zwingend aus den vier vorgegebenen (nicht komplanaren) Punkten.

    Wenn die Angabe von r widersprüchlich sein sollte, dann ist die Aufgabe unlösbar (s. mein Post #3)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()