2009-09-04 67 views
0

我想測試一個點是否在球體的特定距離內。優化點到球體的距離測試

所以,你有這些變量...

Point3F spherePnt; 
F32 sphereRadius; 
Point3F testPnt; 

我能做到......

F32 dist = (spherePnt - testPnt).len() - sphereRadius; 

如果DIST是肯定它的半徑之外,如果DIST是否定的是裏面的半徑。

或者作爲一個優化,以避免LEN裏面的平方根()函數,你可以試試這個...

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

好吧,這看起來像它使因爲乍看之下,但顯然它實際上是給我錯誤的結果。

例如,假設變量的設置是這樣的...

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

取的結果...

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

dist = 0.7320508075688772935274463415059; 
dist2 = 0.4142135623730950488016887242097; 

這是很明顯的,這是事實,錯了,數學。它減少到期望2的平方根與3的平方根相同...所以問題是,我猜...

鑑於我想執行此測試,「是點p在一個球體的範圍內「,有沒有辦法做到這一點,同時避免平方根?

回答

6

您不需要「平方距離」方法中的sqrt計算!如果平方距離小於平方半徑,兩個點(球體中心和測試點)之間的距離小於球體半徑 - 僅用於測試「在球體內還是在球體內?」,事實上差異的平方根不是平方根的差異,完全不相關。

+0

沒錯。將距離中心點的平方與半徑的平方進行比較。 – 2009-09-04 00:33:18

+1

對。如果這是使用所有時間的「內部循環」,則可以通過一次添加一個^ 2來加速。只要您獲得> R^2,您就可以停止。 – 2009-09-06 20:34:02

+0

@Mike,不錯的想法,我想知道它會節省多少時間(取決於點的分佈 - 如果點遠離球體非常分散,它可能很重要)。 – 2009-09-06 23:33:31