题目链接: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;
}