POJ-4042(简单几何)(Regular Convex Polygon )

本文介绍了一种计算包含特定三点的最小正多边形边数的方法。通过计算三点形成的三角形各边长度及对应圆心角,并验证这些角是否能被2π/n整除来确定正多边形的边数。
【转载自】http://blog.ac521.org/?p=135&replytocom=24
【题目描述】
给你三个顶点,这三个点是一个正多边形上的顶点,问这个正多边形最少有多少个边?
【解题思路】
三个点,三角形–>外接圆–>必定也是该凸多边形的外接圆-
我们可以把三个点当做一个三角形放在它的外接圆上,然后求出每个角的度(即三角形分的三个弧度所对应的圆周角),设顶点数为n,我们只需计算,三角形任意两点所对应的圆心角是否是2PI/n的倍数就可以了、、、并且i很小,可以枚举。

在计算圆心角是否是2PI/n的倍数的时候,有一个小技巧,具体看代码

bool zero(double n)
{
	return  n < EPS && n > -EPS;
}
double dis(double x1, double y1, double x2, double y2)
{ 
	return sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));
}
double angle(double a, double b, double c)
{
	return acos((a * a + b * b - c * c) / (2 * a * b));
}
bool check(double n)
{
	return zero(n-(int)(n + 0.5));
}
int main() 
{
	double x[3], y[3], a, b, c, A, B, C;
	while (scanf("%lf%lf", &x[0], &y[0]) ) {
		scanf("%lf%lf", &x[1], &y[1]);  
		scanf("%lf%lf", &x[2], &y[2]);
		a = dis(x[0], y[0], x[1], y[1]);
		b = dis(x[1], y[1], x[2], y[2]);
		c = dis(x[2], y[2], x[0], y[0]);
		A = angle(a, b, c) / MY_PI;
		B = angle(b, c, a) / MY_PI;
		C = angle(c, a, b) / MY_PI;
		int i;
		for (i = 3; i <= 1000; i++)
			if (check(A * i) && check(B * i) && check(C * i))
				break; 
		cout<<i<<endl;
	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值