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

时间:2013-07-20 12:04:00

标签: 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

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

1 个答案:

答案 0 :(得分:14)

请参阅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

你需要的只是

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

t在-180和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

我们可以计算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) );

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

double t = Math.Atan( dHalfwidthEllipse * Math.Tan( dAngle * Math.Pi/180.0 ) 
                                                    / dHalfheightEllipse) + Math.Pi;

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

double t = Math.Atan( dHalfwidthEllipse * Math.Tan( dAngle * Math.Pi/180.0 ) 
                                                    / dHalfheightEllipse) - Math.Pi;

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

  

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

     

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

     

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

     

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