码迷,mamicode.com
首页 > 其他好文 > 详细

多边形裁剪圆的实现细节之求出一段圆弧的中点

时间:2015-05-25 22:26:09      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:圆弧中点   计算机图形学   计算几何   c++   

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;

}


 

 

 

多边形裁剪圆的实现细节之求出一段圆弧的中点

标签:圆弧中点   计算机图形学   计算几何   c++   

原文地址:http://blog.csdn.net/xiaopangxia/article/details/45980351

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!