ฉันจะค้นหาวงรอบของจัตุรมุขได้อย่างไร


9

ฉันกำลังมองหาสมการที่ถูกย่อให้เล็กที่สุดเพื่อค้นหาพิกัดศูนย์กลางและรัศมีของวงกลมจัตุรมุขที่ให้สี่จุดสามมิติ

สิ่งที่ฉันพบบนอินเทอร์เน็ตส่วนใหญ่จัดการกับขอบเขตวงรอบของสามเหลี่ยมสามมิติแบนด์หรือคำจำกัดความทางคณิตศาสตร์ที่หยาบหรือบางกรณีเดียวเช่นจัตุรมุขปกติ อย่างไรก็ตามฉันพยายามหาสมการด้านล่าง แต่ฉันพลาดบางสิ่ง:

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

ความรู้ของฉันในสาขานี้มีข้อ จำกัด แต่ฉันคิดว่าฉันสามารถจัดการเมทริกซ์และการดำเนินการเวกเตอร์ได้ แต่ส่วนที่ถูกต้องของสมการคือสี่เหลี่ยมจัตุรัสปกติของแต่ละเวกเตอร์หรือไม่? (ซึ่งเป็นเวกเตอร์) สมการใช้ได้หรือไม่ มันเป็นแค่นักเขียนที่ลืมที่จะเขียน | d1 | ^ 2 หรือเปล่า? หรือเป็นวิธีทั่วไปในการกำหนดคุณสมบัติทางคณิตศาสตร์บางอย่าง

PS: สำหรับการใช้งาน Delaunay Triangulation สมการ (หมายเลข 9) อยู่ในลิงค์ต่อไปนี้: https://www2.mps.mpg.de/homes/daly/CSDS/t4h/tetra.htm


4
ลองใช้การแลกเปลี่ยนทางคณิตศาสตร์
Majte

ขอบคุณฉันได้พบวิธีการคำนวณรอบที่นั่น!
herme5

1
@JamesAMD เชื่อมโยงwww2.mps.mpg.de/homes/daly/CSDS/t4h/tetra.htm
herme5

3
@ herme5 อย่าลังเลที่จะโพสต์คำตอบของคุณเองที่นี่เกี่ยวกับวิธีการคำนวณคำตอบ หลายคนอาจมาที่นี่ในอนาคตโดยหวังว่าจะได้คำตอบและคุณแบ่งปันสิ่งนี้จะเป็นประโยชน์ต่อพวกเขา เป็นที่ยอมรับโดยสิ้นเชิงในการโพสต์คำตอบของคุณเองและยอมรับได้
Tim Holt

2
ขอบคุณสำหรับการแจ้งเตือน @TimHolt ฉันจะทำมัน ! อย่างไรก็ตามฉันไม่แน่ใจอีกต่อไปว่าฉันจะทำอย่างไรมันเป็นมากกว่า 2 ปีที่ผ่านมา! เพียงแค่ให้ฉันค้นหาและลองดูการใช้งานแบบเก่าของฉัน
herme5

คำตอบ:


2

แม้ว่านี่จะเป็นเรื่องโบราณ แต่ฉันคิดว่ามันดีสำหรับคนรุ่นหลังที่จะมีการอ้างอิงเล็กน้อย แหล่งที่มาของสูตรมาจากเครื่องมือเรขาคณิตสำหรับคอมพิวเตอร์กราฟิกโดย Philip J. Schneider และ David H. Eberly บางสิ่งบางอย่างที่ควรทราบตามข้อความ

จัตุรมุข V0, V1, V2, V3 สั่งให้มัน isomorphic กับบัญญัติหนึ่ง (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1 ).

เมื่อฉันเข้าใจมอร์ฟิซึ่มส์อาจมีความหมายต่างกันหลายอย่างเมื่อใช้ในเรขาคณิต ถ้าเขาหมายถึง isomorphic เกี่ยวกับทฤษฎีกราฟดังนั้นโค้ดต่อไปนี้ควรทำงานอย่างถูกต้องเนื่องจากโครงสร้างของจัตุรมุขใด ๆ เหมือนกัน (K4 กราฟที่สมบูรณ์) ฉันทดสอบผลลัพธ์ของฟังก์ชั่นเทียบกับวุลแฟรมอัลฟ่าโดยใช้การเรียงสับเปลี่ยนหลาย ๆ อย่างในการเรียงลำดับของจุดยอดมาตรฐานและฉันไม่เห็นความแตกต่างในผลลัพธ์ หากการจัดเรียงพิสูจน์ได้ว่าเป็นปัญหาฉันขอแนะนำให้ตรวจสอบปกติของรูปสามเหลี่ยมที่เกิดขึ้นจากจุดยอด V1, V2, V3 เมื่อป้อนข้อมูลไปยังฟังก์ชั่นนี้และรักษาจุดต่าง ๆ เช่นพื้นที่ครึ่งหนึ่งด้วยการทดสอบแบบจุดผลิตภัณฑ์ ถ้าสามเหลี่ยมนั้นหันหน้าไปทางที่ถูกต้อง ถ้ามันไม่ง่ายstd::swapของจุดยอดสองมุมใด ๆ ของสามเหลี่ยมจะกลับทิศทางของค่าปกติและคุณอาจดำเนินการต่อไป แต่อย่างที่ฉันพูดฉันไม่เห็นความแตกต่างกับวิธีเรียงสับเปลี่ยน

นี่คือรหัสที่แปลโดยไม่ใช้เมทริกซ์เพื่อหลีกเลี่ยงความสับสนในการติดตั้งใด ๆ มันค่อนข้างตรงไปตรงมา

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.