4 면체의 둘레를 어떻게 찾습니까?


9

내가 찾을 수있는 가장 최소화 방정식을 찾고 있어요 중심 좌표를 하고 반경 (A)의 사면체가 circumsphere 네 개의 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 |

이 분야에 대한 나의 지식에는 한계가 있지만 행렬과 벡터 연산을 처리 할 수 ​​있다고 생각합니다. 그러나 방정식의 오른쪽 부분이 각 벡터의 표준 제곱입니까? (벡터에 있음). 방정식이 유효합니까? | 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의 컴퓨터 그래픽 용 기하학적 도구 에서 나온 것 입니다 . 본문에 따르면 주목할 점

4 면체 V0, V1, V2, V3은 정식 1 (0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1과 동형이되도록 정렬됩니다. )

동 형사상을 이해함에 따라 지오메트리에 사용될 때 몇 가지 다른 의미가있을 수 있습니다. 그래프 이론과 관련하여 동형을 의미하는 경우 4 면체의 토폴로지가 동일하므로 다음 코드가 올바르게 작동해야합니다 (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.