Ich suche nach der am wenigsten minimierten Gleichung, um die Mittelkoordinaten und den Radius einer Tetraeder-Umkreiskugel bei vier 3D-Punkten zu finden.
Was ich im Internet gefunden habe, befasst sich hauptsächlich mit der Umfangskugel eines flachen 3D-Dreiecks oder einigen groben mathematischen Definitionen oder einem sehr einzelnen Fall wie regulären Tetraedern. Wie auch immer, ich habe es geschafft, die folgende Gleichung zu finden, aber ich habe etwas verpasst:
-> -> ->
let d1, d2, and d3 three vectors of any face of the triangle :
| d1x d1y d1z | | x | | d1^2 |
2 * | d2x d2y d2z | * | y | = | d2^2 |
| d3x d3y d3z | | z | | d3^2 |
Mein Wissen auf diesem Gebiet hat seine Grenzen, aber ich denke, ich kann mit Matrizen und Vektoroperationen umgehen. Aber ist der rechte Teil der Gleichung das Quadrat der Norm jedes Vektors? (die in einen Vektor sind). Ist die Gleichung gültig? Ist es nur der Schriftsteller, der träge vergessen hat, | d1 | ^ 2 zu schreiben? Oder ist es eine übliche Methode, eine mathematische Eigenschaft zu definieren?
PS: Es ist für eine Delaunay Triangulation-Implementierung. Die Gleichung (Nummer 9) befindet sich unter folgendem Link: https://www2.mps.mpg.de/homes/daly/CSDS/t4h/tetra.htm
Antworten:
Obwohl dies ein uralter Thread ist, dachte ich, dass es für die Nachwelt schön sein könnte, ein bisschen zu referenzieren. Die Quelle der Formel stammt von Geometric Tools for Computer Graphics von Philip J. Schneider und David H. Eberly. Laut Text etwas zu beachten
Nach meinem Verständnis des Isomorphismus kann es in der Geometrie verschiedene Bedeutungen geben. Wenn er in Bezug auf die Graphentheorie isomorph bedeutet, sollte sich der folgende Code korrekt verhalten, da die Topologie eines Tetraeders dieselbe ist (K4, ein vollständiger Graph). Ich habe die Ergebnisse der Funktion gegen Wolfram Alpha unter Verwendung verschiedener Permutationen in der Reihenfolge der kanonischen Eckpunkte getestet und keinen Unterschied im Ergebnis festgestellt. Wenn sich die Reihenfolge als Problem herausstellt, schlage ich vor, die Normalen des Dreiecks, das durch die Eckpunkte V1, V2, V3 bei Eingabe dieser Funktion gebildet wird, zu untersuchen und die Punkte wie einen Halbraum mit einem Punktprodukttest zu behandeln, um dies herauszufinden wenn dieses Dreieck in die richtige Richtung zeigt. Wenn nicht, einfach
std::swap
von zwei beliebigen Eckpunkten des Dreiecks wird die Richtung der Normalen umgekehrt, und Sie können fortfahren. Aber wie gesagt, ich sah keinen Unterschied bei verschiedenen Permutationen.Hier ist der übersetzte Code ohne Verwendung von Matrizen, um Implementierungsverwirrungen zu vermeiden. Er ist ziemlich einfach.
quelle