通过横截面上的一个点在椭圆上找到法线“N”

Rob*_*öld 4 geometry ellipse normals

我正在尝试在我制作的一个小物理引擎中制作一个很好的偏转效果。现在它很好地偏离了多边形边缘的法线。但是,与其制作具有 100 条边的多边形以获得“圆形偏转”的平滑效果,我想我可以使用椭圆来计算偏转法线。

所以,我真正想要的是一个函数,它在一个线段上取一个点P并返回一个假想椭圆(w,h)的圆周上的法线N。有关详细信息,请参阅附图。

问题的图片

要在椭圆的圆周上得到一个点,我很确定它是:

x=P.x+Math.sin()*w
y=P.y+Math.cos()*h
Run Code Online (Sandbox Code Playgroud)

但我怎么能从中得到正常呢?


这是一个尝试实施 BDO Adams 博士的答案的小提琴。

max*_*000 5

椭圆点的方程是

x=x_centre+a*cos(t)
y=y_centre+b*sin(t)
Run Code Online (Sandbox Code Playgroud)

对于椭圆形的每一个点,你可以找到t如atan2( (y-y_centre)/b , (x-x_centre)/a )

当你知道t切线方向可以确定dx/dt,dy/dt:

dx=-a*sin(t)
dy=b*cos(t)
Run Code Online (Sandbox Code Playgroud)

当您知道切线方向时,只需将其旋转 90 度即可获得法线:

nx=b*cos(t)
ny=a*sin(t)
Run Code Online (Sandbox Code Playgroud)

为了避免计算,t我们可以将它与前两个公式结合起来:

nx=(x-x_centre)*b/a
ny=(y-y_centre)*a/b
Run Code Online (Sandbox Code Playgroud)