杭电2108题(计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2108
题解:判多边形是否为凸包,简单计算几何,判断相邻两边叉积为正即可
叉积公式:ACM常用数学公式汇总 - 戎码人生 - CSDN博客 https://blog.csdn.net/qq_26891045/article/details/51490709
对于连续的三个点p0,p1,p2,另向量a=p1-p0,b=p2-p1若是凸多边形,那么b相对于a一定是向逆时针方向旋转的。
判断两向量的旋转方向,可以使用向量的叉积 a×b = x1×y2 - x2×y1
a×b > 0 b在a的逆时针方向
a×b = 0 b平行于a(共线)
a×b < 0 b在a的顺时针方向
要注意的是,对于最后一个点pn,还要和起始的两个点p0,p1判断一次。
代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	bool flag;
	int x[1005],y[1005];
	while(cin>>n&&n!=0)
	{
		flag=true;
		for(int i=0;i<n;i++)  cin>>x[i]>>y[i];
		x[n]=x[0];  y[n]=y[0]; x[n+1]=x[1]; y[n+1]=y[1]; 
		for(int i=0;i<n;i++)
		{
			int ans = (x[i+1]-x[i])*(y[i+2]-y[i])-(y[i+1]-y[i])*(x[i+2]-x[i]);
			if(ans<=0)
			{
				flag=false;
				break;
			}
		}
		if(flag)  cout<<"convex"<<endl;
		else cout<<"concave"<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39905917/article/details/87562421