如何在给定角度的椭圆上找到点

And*_*nis 4 c#

我有一个椭圆,中心点在原点(0,0)

double dHalfwidthEllipse = 10; 
double dHalfheightEllipse = 20;
double dAngle = 30;//Its in degree
PointF ptfPoint = new PointF();//To be found
PointF ptfOrigin = new PointF(0, 0);//Origin
Run Code Online (Sandbox Code Playgroud)

相对于原点的角度= 30度; 现在如何使用C#获得上述值?

flu*_*lup 16

请参阅http://www.mathopenref.com/coordparamellipse.html

中心点在原点,半宽a和半高b的椭圆的参数方程是

x(t)= cos t,
y(t)= b sin t

如果你只是想绘制一个椭圆,给定

double dHalfwidthEllipse = 10;       // a
double dHalfheightEllipse = 20;      // b
PointF ptfOrigin = new PointF(0, 0); // Origin
Run Code Online (Sandbox Code Playgroud)

所有你需要的是

PointF ptfPoint = 
    new PointF(ptfOrigin.X + dHalfwidthEllipse * Math.Cos(t * Math.Pi/180.0), 
               ptfOrigin.Y + dHalfheightEllipse * Math.Sin(t * Math.Pi/180.0) );
Run Code Online (Sandbox Code Playgroud)

t在-80到180度之间变化.

然而,正如@Sebastian指出的那样,如果你想通过角度theta计算穿过中心的线的精确交点,它会变得有点复杂,因为我们需要找到对应于theta的那个:

y(t)/ x(t)=tanθ

b sin t /(a cos t)=tanθ

b/a tan t =tanθ

t = arctan(tanθ/ b)+ n*π

所以,如果我们添加

double dAngle = 30;                  // theta, between -90 and 90 degrees
Run Code Online (Sandbox Code Playgroud)

我们可以计算t和ptfPoint:

double t = Math.Atan( dHalfwidthEllipse * Math.Tan( dAngle * Math.Pi/180.0 ) 
                                                    / dHalfheightEllipse);
PointF ptfPoint = 
    new PointF(ptfOrigin.X + dHalfwidthEllipse * Math.Cos(t), 
               ptfOrigin.Y + dHalfheightEllipse * Math.Sin(t) );
Run Code Online (Sandbox Code Playgroud)

这适用于正x轴周围的区域.对于90到180度之间的θ,添加π:

double t = Math.Atan( dHalfwidthEllipse * Math.Tan( dAngle * Math.Pi/180.0 ) 
                                                    / dHalfheightEllipse) + Math.Pi;
Run Code Online (Sandbox Code Playgroud)

对于介于-180和-90度之间的θ,减去π:

double t = Math.Atan( dHalfwidthEllipse * Math.Tan( dAngle * Math.Pi/180.0 ) 
                                                    / dHalfheightEllipse) - Math.Pi;
Run Code Online (Sandbox Code Playgroud)

当你接近y轴时,x(t)接近零并且上面的计算除以零,但你可以使用相反的方法:

x(t)/ y(t)= tan(90 - θ)

a cos t /(b sin t)= tan(90 - θ)

a/b tan t = tan(90 - θ)

t = arctan(b tan(90-θ)/ a)+ n*π