我有一个椭圆,中心点位于原点(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#给出上述值?
答案 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 *π