http://acm.hdu.edu.cn/showproblem.php?pid=2108
叉乘(cross product)
2维空间中的叉乘是:
P1(x1, y1) X P2(x2, y2) = x1y2 – y1x2
对于连续的三个点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的顺时针方向
//hdoj 2108 Shape of HDU
#include<iostream>
using namespace std;
struct Position{
int x; //x坐标
int y; //y坐标
};
//叉积
int corss(Position p1,Position p2,Position p3){
int x1=p2.x-p1.x;
int x2=p3.x-p2.x;
int y1=p2.y-p1.y;
int y2=p3.y-p2.y;
int c=x1*y2-x2*y1;
if(c>=0) return 0;
else return 1;
}
int main(){
int n;
Position p,p0; //第一个和第二个顶点的坐标,用于和最后一个和最后第二个点组成的三角形的判断
Position p1,p2,p3; //存储当前要判断的三角形的坐标
while(cin>>n&&n){
int i=0,j,flag=0;
if(i==0){
cin>>p.x>>p.y>>p0.x>>p0.y>>p1.x>>p1.y;
flag=corss(p,p0,p1);
if(flag) break;
i+=6;
}
p1=p0;p2=p1;
for(;i<2*n;i+=2){
cin>>p3.x>>p3.y;
flag=corss(p1,p2,p3);
if(flag) break;
p1=p2;
p2=p3;
}
//最后一个点与第1、2个点组成的三角形不能漏判
if(!flag&&!corss(p2,p3,p)&&!corss(p3,p,p0))
cout<<"convex"<<endl;
else cout<<"concave"<<endl;
}
return 0;
}