2009-04-18 77 views
2

我想解決一個棘手的數學問題,在iphone上下文的cocos2d。cocos2d幫助找到一個圓上的點

基本上我有一個隨時間旋轉的輪盤輪。

我想在某些點(如羅盤序號點N,S,E,W)上有一個Sprite閂鎖到車輪上,並在所有其他點上反彈。

我有車輪旋轉的圖像,只需要解決部分問題,我可以測試一個精靈是否與圓上正確點處的圓相交,因爲它正在旋轉。

我認爲這個問題是朝着正確的方向發展的,但我無法理解它。任何人都可以解釋嗎?

Best way to find a point on a circle closest to a given point

回答

1

如果我理解正確:

首先檢查精靈和輪盤的中心之間的距離。這會告訴你,精靈是否在輪子的邊緣。 (如果沒有,沒有任何反應,對吧?)

然後,找到sprite輪盤輪的「x軸」所形成的角度。

spriteAngle = atan2(sprite.x - rouletteCentre.x, sprite.y - rouletteCentre.y) 

您需要找到等效的atan2()函數。它通常以弧度返回一個答案;如果您願意,您可能需要將其轉換爲度數或四分之一轉或其他值。

然後,減去輪盤輪本身旋轉的角度(如果輪本身正在旋轉,如果沒有,那麼你已經完成了)。確保你的角度測量是一致的。

actualAngle = spriteAngle - rouletteRotationAngle 

請注意,actualAngle可能在0-360度範圍之外,您需要使其「繞回」。

最後,您會希望允許小範圍的值爲可接受的值(例如98度到102可能會被視爲「北」)。

1

所以,你必須半徑爲r的圓,與中心(X0,Y0)。

一個點位於圓的外側,座標爲(x,y)。你的問題是找到點(x,y)上圓的最近點。

解決方案很簡單。點到圓上的最近投影是通過簡單的縮放來完成的。因此,

d = sqrt((x-x0)^2 + (y-y0)^2) 
xp = x0 + (x - x0)*r/d 
yp = y0 + (y - y0)*r/d 

新點(xp,yp)將在圓上。說實話,你最好在極座標上工作,原點位於圓心。然後一切都變得更容易。

你的下一個問題是它在圓上的位置?不要忘記圓圈上的指南針的點隨時間旋轉。 atan2函數會給出點(xp-x0,yp-y0)所在的角度。大多數工具集都具有該功能。看到我從這裏減去了原點。