2017-12-22 10 views
0

3 개의 꼭지점에서 평면 방정식을 발견했습니다. 이제 경계 상자 (예 : 대형 큐브)가있는 경우 평면이 큰 큐브를 자르는 격자 위치 (작은 큐브)를 어떻게 결정할 수 있습니까?3 개의 꼭지점으로 구성된 평면으로 자른 그리드 결정

나는 현재이 방법은 다음입니다 :

각각의 작은 큐브 센터, 말 (XP, YP, ZP)의 경우를하는 XP에서 + B YP + C * Zp에 (평면, 즉 수직 거리를 계산 + d)/(SquareRoot Of (a^2 + b^2 + c^2)). 이 값은 (smallCube * SquareRoot (3)의 길이)/2보다 작거나 같아야합니다. 이 기준이 충족되면이 작은 큐브 위치에서 큰 입방체를 자르기 위해 비행기를 추측합니다.

A, B, C, D는에 의해 양식 도끼 +의 평면의 계수입니다 + CZ + D = 0

누군가가 알려 수 있다면 내가 만약 내가, 정말 기쁠 뭔가 잘못된 일을하거나 다른 간단한 접근법을 사용합니다.

답변

1

주어진 평면과 교차하는 작은 입방체 (그리드 보셀)의 목록을 얻으려는 것 같습니다.

간단한 방법 : 모든 큐브 가장자리 비행기의

찾기 교차로. 예를 들어, AAB의 수직 에지와 교차하는 Y 알이 방정식에 의해 계산 될 수있다 (X0는 Z0는 일정)

aX0 + bY + c*Z0 + d = 0 

및 Y 큐브 범위 인 것이 확인. 작은 큐브 좌표 (0, ky=Floor(Y/VoxelSize), 0)을 가져온 다음 이웃 보셀을 순서대로 확인합니다 (평면 계수를 고려하여 실제 후보 만 확인).

candidates: 
0,ky,0 
1,ky,0 
0,ky-1,0 
0,ky+1,0 
0,ky,1 

는 레이의 경우 Amanatides/우 알고리즘과 같은 (2D와 3D 모두 포함)의 복셀 시퀀스를 생성하는 고급 방법이 있습니다. 아마도 비슷한 여기

er 모든 큐브에 대해 동일하게 유지, 그래서 한 번을 계산하는 것을 this page에서 AABB 평면 교차 테스트 코드 (포함 일부 설명)

// Test if AABB b intersects plane p 
int TestAABBPlane(AABB b, Plane p) { 
    // Convert AABB to center-extents representation 
    Point c = (b.max + b.min) * 0.5f; // Compute AABB center 
    Point e = b.max - c; // Compute positive extents 

    // Compute the projection interval radius of b onto L(t) = b.c + t * p.n 
    float r = e[0]*Abs(p.n[0]) + e[1]*Abs(p.n[1]) + e[2]*Abs(p.n[2]); 

    // Compute distance of box center from plane 
    float s = Dot(p.n, c) - p.d; 

    // Intersection occurs when distance s falls within [-r,+r] interval 
    return Abs(s) <= r; 
} 

참고 인 평면 voxelization 위해도 존재 나중에 사용하십시오.

+0

한 번 내 알고리즘을 살펴보고 변경 사항을 설명해 주시면됩니다. 고맙습니다 –

+0

Emm ... 알고리즘이 무엇입니까? 귀하의 확인은 옳지 않습니다 - 거짓 긍정적 결과가 나올 수 있습니다. 그리고 나는 당신에게 단서를주었습니다 - 모든 작은 입방체를 무차별 적으로 검사하는 방법을 없애는 방법. – MBo

+0

프로그래머의 초심자이기 때문에 알고리즘을 코딩하는 것이 약간 어렵다는 것을 알고 있기 때문에 당신이 내 수표를 약간 수정할 수 있다면 정말 기쁠 것입니다. –

관련 문제