我有一个椭圆,中心点在原点(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*π
| 归档时间: |
|
| 查看次数: |
7805 次 |
| 最近记录: |