2009-09-04 2 views
0

포인트가 구의 특정 거리 내에 있는지 테스트하고 싶습니다. 그래서 당신은 이러한 변수가포인트를 구형으로 테스트 최적화

...

이는 내부 DIST가 긍정적 인 경우 DIST가 음수 인 경우는, 반경 밖에

Point3F spherePnt; 
F32 sphereRadius; 
Point3F testPnt; 
내가 할 수있는

...

F32 dist = (spherePnt - testPnt).len() - sphereRadius; 
반지름. 처음 눈에 때문에 만들지 만, 분명히 자신이 실제로주고처럼이 보이는

또는 LEN 내부의 제곱근을 피하기 위해 최적화() 당신이 시도 할 수있는 기능 등

...

F32 dist = (spherePnt - testPnt).lenSquared() - (sphereRadius * sphereRadius); 

확인 나 부정확 한 결과. 예를 들어

, 주어진 변수는 수학적으로,이 사실, 잘못 꽤 분명하다

F32 dist = (spherePnt - testPnt).len() - sphereRadius; 
F32 dist2 = mSqrt((spherePnt - testPnt).lenSquared() - (sphereRadius * sphereRadius)); 

dist = 0.7320508075688772935274463415059; 
dist2 = 0.4142135623730950488016887242097; 

...

SpherePnt(0, 0, 0) 
SphereRadius(1) 
testPnt(1, 1, 1) 

이 결과를 가지고 ...이 같은 설정이다 . 그것은 2의 제곱근이 3의 제곱근과 같아지기를 기대하기 때문에 ... 질문은 생각합니다 ...

이 테스트를 수행하고 싶다면 "포인트 p 영역의 범위 r "내에서 제곱근을 피하면서이를 수행하는 방법이 있습니까?

답변

6

"제곱 거리"접근 방식에서는 sqrt 계산이 필요하지 않습니다! 구면 중심과 테스트 포인트 사이의 거리는 제곱 거리가 제곱 반경보다 작 으면 구면 반경보다 작습니다. "구형 또는 구형 내부"를 테스트하기위한 유일한 목적으로 차이의 제곱근은 제곱근의 차이가 아니라 완전히 무의미합니다.

+0

정확히. 반경의 제곱과 중심점까지의 거리의 제곱을 비교하십시오. –

+1

. 그리고 이것이 당신의 모든 시간을 사용하는 "내부 루프"라면, 한 번에^2 개의 축 하나를 추가하여 속도를 높일 수 있습니다. > R^2를 얻 자마자 멈출 수 있습니다. –

+0

@ 좋은 생각, 좋은 생각, 얼마나 많은 시간을 절약 할 수 있을지 궁금해. (점의 분포에 따라 - 점이 구와 멀리 떨어져 있으면 아주 중요 할 수 있습니다.) –