2012-11-23 21 views
4

我正試圖在我製作的一個小物理引擎中產生良好的偏轉效果。現在它很好地偏離了多邊形邊界的法線。但是不用製作一個具有100條邊的多邊形來獲得「圓偏轉」的平滑效果,我想我可以使用橢圓來計算偏轉法線。通過橫截面上的一個點在橢圓上找到正常的「N」

所以,我很想是,需要一個點P上的線段和在假想橢圓的圓周返回正常Ñ(W,H)的功能。有關詳細信息,請參閱附圖。

A picture of the problem

拿到一分上橢圓的圓周我敢肯定它是:

x=P.x+Math.sin()*w 
y=P.y+Math.cos()*h 

,但我怎麼能得到正常的嗎?


Here's a fiddle嘗試實施BDO Adams博士的答案。

回答

0

首先使用ATAN2函數來獲取的角度正常,並獲得來自

theta = atan2(2y/semiminorradius, x/semimajorradius) 
ny = semiminorradius * sin(theta) 
nx = semimajorradius * cos(theta) 

你需要的法向量的向量被歸? (單位長度)若有

r = sqrt(tx^2+ty^2) 
nny = ny/r 
nnx = nx/r 

當你繪製它的點實際上是(NY,NX)

+0

我試着實現這個[這裏](http://jsfiddle.net/45eFT/2/),但是結果單元向量'〜(0.55,0.83)'看起來不正確。我期望像'(0,1)'或'(0,-1)'這樣的東西。 –

4

橢圓點的方程是

x=x_centre+a*cos(t) 
y=y_centre+b*sin(t) 

對於橢圓的每個點就可以找到t作爲atan2((y-y_centre)/b , (x-x_centre)/a)

當你知道t切線方向可以確定:dx/dt,dy/dt

dx=-a*sin(t) 
dy=b*cos(t) 

當你知道切線方向,只需90度旋轉它,你有一個正常的:

,並避免計算t,我們可以用第2個公式結合起來:

nx=(x-x_centre)*b/a 
ny=(y-y_centre)*a/b