Bagaimana cara menemukan lapisan tetrahedron?

9

Saya mencari persamaan yang paling diminimalkan untuk menemukan koordinat pusat dan jari-jari dari tetrahedron circumsphere diberikan empat 3D poin.

Apa yang saya temukan di internet terutama berhubungan dengan lingkaran segitiga 3D datar, atau beberapa definisi matematika kasar, atau beberapa kasus yang sangat tunggal seperti tetrahedron biasa. Lagi pula saya berhasil menemukan persamaan di bawah ini tetapi saya melewatkan sesuatu:

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

Pengetahuan saya di bidang ini memiliki batas tetapi saya pikir saya bisa menangani operasi matriks dan vektor. Tetapi apakah bagian yang tepat dari persamaan kuadrat dari norma masing-masing vektor? (yang menjadi vektor). Apakah persamaan itu valid? Apakah hanya penulis yang dengan malas lupa menulis | d1 | ^ 2? Atau Apakah itu cara umum untuk mendefinisikan beberapa properti matematika.

PS: Ini untuk implementasi Delaunay Triangulation. Persamaan (nomor 9) ada di tautan berikut: https://www2.mps.mpg.de/homes/daly/CSDS/t4h/tetra.htm

herme5
sumber
4
Coba matematika stackexchange.
Majte
Terima kasih, saya telah menemukan cara untuk menghitung keadaan di sana!
herme5
1
@JamesAMD tautannya adalah www2.mps.mpg.de/homes/daly/CSDS/t4h/tetra.htm .
herme5
3
@ herme5, silakan kirim jawaban Anda sendiri di sini tentang bagaimana Anda menghitung jawabannya. Banyak orang mungkin datang ke sini di masa depan berharap untuk menemukan jawabannya, dan Anda membagikannya akan sangat berharga bagi mereka. Benar-benar dapat diterima untuk mengirim jawaban Anda sendiri dan bahkan menerimanya.
Tim Holt
2
Terima kasih atas pemberitahuan @TimHolt. Aku akan melakukannya ! Meskipun demikian saya tidak yakin lagi bagaimana saya melakukannya, itu sudah lebih dari 2 tahun yang lalu! biarkan saya mencari dan melihat implementasi lama saya
herme5

Jawaban:

2

Meskipun ini adalah utas kuno, saya pikir mungkin baik bagi anak cucu untuk memiliki sedikit referensi. Sumber rumus adalah dari Geometric Tools for Computer Graphics oleh Philip J. Schneider dan David H. Eberly. Sesuatu yang perlu diperhatikan, menurut teks

Tetrahedron V0, V1, V2, V3 dipesan sehingga isomorfis dengan yang kanonik (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1 ).

Seperti yang saya pahami isomorfisme , bisa ada beberapa arti berbeda ketika digunakan dalam geometri. Jika ia berarti isomorfik berkaitan dengan teori grafik, maka kode berikut harus berperilaku dengan benar, karena topologi tetrahedron apa pun adalah sama (K4, grafik lengkap). Saya menguji hasil fungsi terhadap wolfram alpha menggunakan berbagai permutasi dalam pemesanan simpul kanonik, dan saya tidak melihat perbedaan dalam hasilnya. Jika pemesanan terbukti menjadi masalah, saya sarankan memeriksa normal segitiga yang dibentuk oleh simpul V1, V2, V3 pada input ke fungsi ini, dan memperlakukan titik-titik seperti setengah ruang dengan tes titik-produk untuk mencari tahu jika segitiga itu menghadap ke jalan yang benar. Jika tidak, sederhanastd::swapdari setiap dua dari simpul segitiga akan membalikkan arah normal dan Anda dapat melanjutkan. Tapi seperti yang saya katakan, saya tidak melihat perbedaan dengan berbagai permutasi.

Berikut adalah kode yang diterjemahkan tanpa menggunakan matriks untuk menghindari kebingungan implementasi, ini cukup mudah;

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);
}
Jon Koelzer
sumber