现已知一个矩形参数,也就是矩形左上角X,Y,右下角X1,Y1坐标。
传递一个任意角度,计算这个角度在矩形内接椭圆上的点坐标。
方法很多,直接用流行的开源库,调用库函数就好。
由于自己想实现功能极为简单,直接写个函数。
这里分享出这个实现函数、用MFC和C#两语言写。
C#语言的:
- /// <summary>
- /// 椭圆求点公式
- /// </summary>
- /// <param name="lpRect">椭圆边框</param>
- /// <param name="angle">角度</param>
- /// <returns></returns>
- public Point GetArcPoint(Rectangle lpRect, float angle)
- {
- Point pt = new Point();
- double a = lpRect.Width / 2.0f;
- double b = lpRect.Height / 2.0f;
- if (a == 0 || b == 0)
复制代码 MFC写的;
- /// <summary>
- /// 椭圆求点公式
- /// </summary>
- /// <param name="lpRect">椭圆外接矩形</param>
- /// <param name="angle">角度</param>
- /// <returns></returns>
- CPoint GetArcPoint(CRect lpRect, float angle)
- {
- CPoint pt;
- double a = lpRect.Width() / 2.0f;
- double b = lpRect.Height() / 2.0f;
- if (a == 0 || b == 0)
- return CPoint(lpRect.left, lpRect.top);
- //弧度
- double radian = angle * PI / 180.0f;
- //获取弧度正弦值
- double yc = sin(radian);
- //获取弧度余弦值
- double xc = cos(radian);
- //获取曲率 r = ab/\Sqrt((a.Sinθ)^2+(b.Cosθ)^2
- double radio = (a * b) / sqrt(pow(yc * a, 2.0) + pow(xc * b, 2.0));
- //计算坐标
- double ax = radio * xc;
- double ay = radio * yc;
- pt.x = (int)(lpRect.left + a + ax);
- pt.y = (int)(lpRect.top + b + ay);
- return pt;
- }
复制代码
调用部分
CRect rc(12,34,56,78);
WORD wStartAngle = 21;
wStartAngle = 360 - wStartAngle;
CPoint StartPoint = GetArcPoint(rc, wStartAngle);//
|