2.求出一段圆弧的中点
(1)准备工作,对之前求得的圆与多边形的公共点进行排序,为了使公共点集于多边形顶点的给出方向一致,将交点在多边形的第几条边上作为排序的第一指标,将参数t作为第二指标。所以我的交点结构体要包括参数t和所在边信息。
struct CrossoverPoint
{
double t;
double x;
double y;
double a;//角度
int index;//属于哪条边
};
(2)准备工作,将公共点序列中值完全相同的点去除,避免在焦点获取中对切点视为两个相同焦点造成的影响。
(3)通过圆弧的两端点的参数t值和角度a值情况计算出对应圆弧中点的a值,进而获得坐标。
圆弧中点角度a的计算符合以下规则
实现表现在函数MidPointOnCircle上
//求圆弧中点
MyPoint MidPointOnCircle(double x1, double y1, double x2, double y2, double x0, double y0, double r)
{
double cos1, sin1, cos2, sin2, a1, a2, a = 0;
cos1 = (x1 - x0) / r;
sin1 = (y1 - y0) / r;
cos2 = (x2 - x0) / r;
sin2 = (y2 - y0) / r;
//根据正余弦求出角度
if (abs(sin(acos(cos1)) - sin1) < esp)
{
a1 = acos(cos1);
}
else
{
a1 = 2 * PI - acos(cos1);
}
if (abs(sin(acos(cos2)) - sin2) < esp)
{
a2 = acos(cos2);
}
else
{
a2 = 2 * PI - acos(cos2);
}
if (a1 < a2)
{
a = (a1 + a2) / 2;
}
else if (a1 >= a2 && (a1 + a2<PI))
{
a = (a1 + a2) / 2 + PI;
}
else if (a1 >= a2 && (a1 + a2 >= PI))
{
a = (a1 + a2) / 2 - PI;
}
//返回中点坐标
MyPoint midPoint;
midPoint.x = x0 + r*cos(a);
midPoint.y = y0 + r*sin(a);
return midPoint;
}
原文地址:http://blog.csdn.net/xiaopangxia/article/details/45980351