HDU 2108 Shape of HDU(几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2108

题        意:给你一个多边形的顶点,判断他是否是个凸边形。

思        路:若是凸边形则按逆时针走时,所有的顶点都与他前一个顶点和后一个顶点成逆时针走势。

                   所以可以根据三个顶点组成的两个向量的差积(向量积)来判断向量角的大小和方向。

                  例如:p1,p2,p3三点,ans = (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)

                                                如果ans=0,则三点在一线;如果ans<0则成顺时针;如果ans>0则是逆时针。

代码如下:

#include 
using namespace std;
#include 
#include 
#include 
#include 
struct node
{
    int x, y;
} vis[1200];
int suxun( int x1, int x2, int x3 )
{
    return (vis[x2].x-vis[x1].x)*(vis[x3].y-vis[x1].y) - (vis[x3].x-vis[x2].x)*(vis[x2].y-vis[x1].y);
}
int main()
{
    int n;
    while( scanf ( "%d", &n ) != EOF )
    {
        if( n == 0 ) break;
        for( int i = 0; i < n; i ++ )
        {
            scanf ( "%d %d", &vis[i].x, &vis[i].y );
        }
        int ans;
        for( int i = 0 ; i < n; i ++ )
        {
            ans = suxun(i%n,(i+1)%n,(i+2)%n);
            if(ans<0)break;
        }
        if( ans < 0 ) printf("concave\n");
        else printf("convex\n");
    }
    return 0;
}


你可能感兴趣的:(几何,algorithm,几何)