2108 Shape of HDU

题意为判断多边形的凹凸性。有三种方法:

1)角度法:

判断每个顶点所对应的内角是否小于180度,如果小于180度,则是凸的,如果大于180度,则是凹多边形。

2)凸包法:

这种方法首先计算这个多边形的凸包,关于凸包的定义在此不再赘述,首先可以肯定的是凸包肯定是一个凸多边形。如果计算出来的凸多边形和原始多边形的点数一样多,那就说明此多边形时凸多边形,否则就是凹多边形。

3)顶点凹凸性法

利用以当前顶点为中心的矢量叉乘或者计算三角形的有符号面积判断多边形的方向以及当前顶点的凹凸性。

假设当前连续的三个顶点分别是P1,P2,P3。计算向量P1P2,P2P3的叉乘,也可以计算三角形P1P2P3的面积,得到的结果如果大于0,则表示P3点在线段P1和P2的左侧,多边形的顶点是逆时针序列。然后依次计算下一个前后所组成向量的叉乘,如果在计算时,出现负值,则此多边形时凹多边形,如果所有顶点计算完毕,其结果都是大于0,则多边形时凸多边形。

4)辛普森面积法

利用待判别的顶点以及前后两个顶点所组成的三角形,利用辛普森公式计算其面积,如果此三角形面积与整个多边形面积符号相同,那么这个顶点是凸的;如果此三角形面积与整个多边形面积符号不同,那么这个顶点是凹的,即整个多边形也是凹多边形。

方法转载自:http://blog.csdn.net/zhouxuguang236/article/details/10162553


                            *P3

                         |         
                                                 |
                                      ___________|*_________*____
                         |P1       P2
                         |
                         |

使用最简单的方法:叉积判断。

假设有点(按逆时针) (a1,b1),(a2,b2),(a3,b3)
向量P1,P2;P1=(a3-a1,b3-b1),P2=(a2-a1,b2-b1),叉积为P1.x*P2.y-P2.x*P1.y
依次判断,依次三个点,直到最后结束,如果叉积一直大于0,则为凸多边形,否则为凹多边形

AC代码

#include
#include
#include
#include
#include
#include
using namespace std;
#define INF 0x3f3f3f3f
struct node{
    int x;
    int y;
}a[200];

int chaji(node a1,node a2,node a3)
{
    int flag=(a3.x-a1.x)*(a2.y-a1.y)-(a2.x-a1.x)*(a3.y-a1.y);//判断叉积
    if(flag<0)
        return 1;
    else
        return 0;
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        else
            for(int i=0;iscanf("%d%d",&a[i].x,&a[i].y);
        a[n].x=a[0].x,a[n].y=a[0].y;//开始的第一个点
        a[n+1].x=a[1].x,a[n+1].y=a[1].y;//开始的第二个点
        int flag=0;
        if(n<=3)//三角形
            flag=0;
        else
            {
                if(chaji(a[0],a[1],a[2]))//判断第1,2,3个点
                {
                    for(int i=3;i2;i++)//循环判断连续的三个点
                    {
                        if(!chaji(a[i-2],a[i-1],a[i]))
                        {
                            flag=1;
                            break;
                        }
                        else
                            flag=0;
                    }
                }
                else
                    flag=1;
            }
        if(flag)
            printf("concave\n");
        else
            printf("convex\n");
    }
    return 0;
}

你可能感兴趣的:(HDU题目)