Szukam najbardziej zminimalizowanym równania znaleźć współrzędne centrum i promień z czworościanu circumsphere podane cztery punkty 3D.
To, co znalazłem w Internecie, dotyczy głównie obwodu płaskiego trójkąta 3D lub niektórych przybliżonych definicji matematycznych lub niektórych bardzo pojedynczych przypadków, takich jak zwykłe czworościany. W każdym razie udało mi się znaleźć równanie poniżej, ale coś przeoczyłem:
-> -> ->
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 |
Moja wiedza w tej dziedzinie ma swoje granice, ale myślę, że potrafię obsługiwać macierze i operacje wektorowe. Ale czy prawidłowa część równania jest kwadratem normy każdego wektora? (które są w wektorze). Czy równanie jest prawidłowe? Czy to tylko pisarz, który leniwie zapomniał napisać | d1 | ^ 2? Czy jest to powszechny sposób definiowania niektórych właściwości matematycznych.
PS: To jest implementacja triangulacji Delaunaya. Równanie (numer 9) znajduje się w następującym linku: https://www2.mps.mpg.de/homes/daly/CSDS/t4h/tetra.htm
Odpowiedzi:
Chociaż jest to starożytny wątek, pomyślałem, że dla potomności może być coś ciekawego. Źródło formuły pochodzi z Geometric Tools for Computer Graphics autorstwa Philipa J. Schneidera i Davida H. Eberly. Coś do odnotowania, zgodnie z tekstem
Jak rozumiem izomorfizm , w geometrii może istnieć kilka różnych znaczeń. Jeśli chodzi o izomorficzny w odniesieniu do teorii grafów, to poniższy kod powinien zachowywać się poprawnie, ponieważ topologia dowolnego czworościanu jest taka sama (K4, pełny wykres). I przetestowane wyniki funkcji przeciwko Wolfram Alpha stosując różne permutacje w zamawiania kanonicznych wierzchołków i widziałem żadnej różnicy w wynikach. Jeśli uporządkowanie okaże się problemem, sugeruję zbadanie normalności trójkąta utworzonego przez wierzchołki V1, V2, V3 po wejściu do tej funkcji i potraktowanie punktów jak półprzestrzeń testem iloczynu, aby ustalić jeśli ten trójkąt jest skierowany we właściwą stronę. Jeśli nie, to proste
std::swap
dowolnych dwóch wierzchołków trójkąta odwróci kierunek normalny i możesz kontynuować. Ale jak powiedziałem, nie widziałem różnicy przy różnych permutacjach.Oto przetłumaczony kod bez użycia macierzy, aby uniknąć nieporozumień związanych z implementacją, jest dość prosty;
źródło