四面体の外接円を見つけるにはどうすればよいですか?


9

4つの3Dポイントが与えられた場合の四面体外接円の中心座標半径を見つけるために最も最小化された方程式を探しています。

私がインターネットで見つけたものは、主に平らな3D三角形の外接球、またはいくつかの大まかな数学的定義、または通常の四面体などの非常に単一のケースを扱っています。とにかく私は下の方程式を見つけることができましたが、私は何かを逃しました:

    ->  ->      ->
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 |

この分野での私の知識には限界がありますが、行列とベクトル演算を処理できると思います。しかし、方程式の正しい部分は、各ベクトルのノルムの2乗ですか?(これはベクトルに含まれています)。方程式は有効ですか?| d1 | ^ 2を書くのを怠惰に忘れたのは作家だけですか?それとも、いくつかの数学的特性を定義する一般的な方法ですか?

PS:これはDelaunay Triangulation実装用です。方程式(番号9)は次のリンクにあります:https : //www2.mps.mpg.de/homes/daly/CSDS/t4h/tetra.htm


4
数学stackexchangeを試してください。
Majte 2015年

おかげで、そこに外接円を計算する方法を見つけました!
herme5 2015年

1
@JamesAMDリンクはwww2.mps.mpg.de/homes/daly/CSDS/t4h/tetra.htmです。
herme5

3
@ herme5、答えの計算方法に関する独自の答えをここに投稿してください。多くの人が答えを見つけたいと思って将来ここに来るかもしれません、そしてあなたがそれを共有することは彼らにとって価値があります。あなた自身の答えを投稿し、それを受け入れることさえ完全に受け入れられます。
ティム・ホルト

2
通知@TimHoltをありがとう。私はそれをやる !それにもかかわらず、私がそれをどのようにしたかはもうわかりません、それは2年以上前でした!古い実装を見つけて見てみましょう
herme5

回答:


2

これは古代のスレッドですが、後世に少し参考にしておくとよいと思いました。公式の出典は、Philip J. SchneiderおよびDavid H. EberlyによるGeometric Tools for Computer Graphicsによるものです。本文によると注意すべきこと

四面体V0、V1、V2、V3は、正準1(0、0、0)、(1、0、0)、(0、1、0)、(0、0、1 )。

私が理解しているように同型、ジオメトリで使用する場合、いくつかの異なる意味がある可能性があります。彼がグラフ理論に関して同型であることを意味する場合、四面体のトポロジはすべて同じであるため、次のコードは正しく動作するはずです(K4、完全なグラフ)。正規頂点の順序でさまざまな順列を使用して、wolfram alphaに対する関数の結果テストしましたが、結果に違いはありませんでした。順序付けが問題であることがわかった場合は、この関数への入力時に頂点V1、V2、V3によって形成される三角形の法線を調べ、点積テストで点を半空間のように扱って理解することをお勧めしますその三角形が正しい方向を向いている場合。そうでない場合、単純なstd::swap三角形の頂点のいずれか2つを指定すると、法線の方向が反転し、続行できます。しかし、私が言ったように、私はさまざまな順列との違いを見なかった。

以下は、実装の混乱を避けるために行列を使用せずに翻訳したコードです。これはかなり簡単です。

void Circumsphere(const Vec3& v0, const Vec3& v1, const Vec3& v2, const Vec3& v3, Vec3* center, float* radius)
{
  //Create the rows of our "unrolled" 3x3 matrix
  Vec3 Row1 = v1 - v0;
  float sqLength1 = length2(Row1);
  Vec3 Row2 = v2 - v0;
  float sqLength2 = length2(Row2);
  Vec3 Row3 = v3 - v0;
  float sqLength3 = length2(Row3);

  //Compute the determinant of said matrix
  const float determinant =   Row1.x * (Row2.y * Row3.z - Row3.y * Row2.z)
                            - Row2.x * (Row1.y * Row3.z - Row3.y * Row1.z)
                            + Row3.x * (Row1.y * Row2.z - Row2.y * Row1.z);

  // Compute the volume of the tetrahedron, and precompute a scalar quantity for re-use in the formula
  const float volume = determinant / 6.f;
  const float iTwelveVolume = 1.f / (volume * 12.f);

  center->x = v0.x + iTwelveVolume * ( ( Row2.y * Row3.z - Row3.y * Row2.z) * sqLength1 - (Row1.y * Row3.z - Row3.y * Row1.z) * sqLength2 + (Row1.y * Row2.z - Row2.y * Row1.z) * sqLength3 );
  center->y = v0.y + iTwelveVolume * (-( Row2.x * Row3.z - Row3.x * Row2.z) * sqLength1 + (Row1.x * Row3.z - Row3.x * Row1.z) * sqLength2 - (Row1.x * Row2.z - Row2.x * Row1.z) * sqLength3 );
  center->z = v0.z + iTwelveVolume * ( ( Row2.x * Row3.y - Row3.x * Row2.y) * sqLength1 - (Row1.x * Row3.y - Row3.x * Row1.y) * sqLength2 + (Row1.x * Row2.y - Row2.x * Row1.y) * sqLength3 );

  //Once we know the center, the radius is clearly the distance to any vertex
  *radius = length(*center - v0);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.