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