题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2108
题意: 逆时针的给出N个点的坐标,求所围成多边形是凹的还是凸的。
代码:
#include<stdio.h>
#include<stdlib.h>
struct xy
{
int x;
int y;
}d[1000];
int g(int a,int b,int c)
{
int t;
//公式:s=(x1-x3)*(y2-y3)-(x2-x3)*(y1-y3)
//当s>0时,p1,p2,p3三个点呈逆时针
//当s<0时,p1,p2,p3三个点呈顺时针
t=(d[a].x-d[c].x)*(d[b].y-d[c].y)-(d[b].x-d[c].x)*(d[a].y-d[c].y);
return t;
}
int main()
{
int i,t,n;
while(scanf("%d",&n),n)
{
for(i=0;i<n;i++)
{
scanf("%d %d",&d[i].x,&d[i].y);
}
for(i=0;i<n;i++)
{
//模n是因为当i=n-1的时候n+1,n+2会超出数据范围,所以从头开始为最后一个点和第一二个点判断直线的走向
t=g(i%n,(i+1)%n,(i+2)%n);
if(t<0)break;
}
if(t>=0)
printf("convex\n");
else
printf("concave\n");
}
return 0;
}
分析: 我也不清楚这个是什么时候学的了,这个好像是利用叉积的符号判断两个矢量的顺逆关系
这样的话只要有一条直线向右拐,就说明这个多边形是凹多边形.如下图