三点顺序及简单多边形

一:三点顺序

思路:    

利用矢量叉积(即叉乘)判断是逆时针还是顺时针

  设A(x1,y1),B(x2,y2),C(x3,y3),则三角形两边的矢量分别是:

    AB=(x2-x1,y2-y1), AC=(x3-x1,y3-y1)
    则AB和AC的叉积为:(2*2的行列式)
    |x2-x1, y2-y1|
    |x3-x1, y3-y1|
    值为:(x2-x1)*(y3-y1) - (y2-y1)*(x3-x1)
最简单: 奋斗
    利用右手法则进行判断:
    如果AB*AC>0,则三角形ABC是逆时针的
    如果AB*AC<0,则三角形ABC是顺时针的
    如果AB*AC=0,则说明三点共线
    #include <iostream>  
    #include <cstdio>  
    #include <cstring>  
    #include <cmath>  
    using namespace std;  
      
    int main()  
    {  
        double x1, y1, x2, y2, x3, y3;  
        scanf("%lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3);
        {
            if((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1) > 0) cout << "0" << endl;  
            else cout << "1" << endl;   
        }  
        return 0;  
    } 
二 :简单多边形(包括凸和凹多边形)(三点顺序的进阶)
    按顺时针或逆时针方向给你一个简单的多边形的顶点坐标,请回答此多边形是顺时针还是逆时针。
#include <iostream>

using namespace std;
const int MA=30+5;
struct Node
{
    int x,y;
}p[MA];
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
        cin>>p[i].x>>p[i].y;
        int flag=0;
        for(int i=2;i<n;i++)
        flag+=(p[i].x-p[1].x)*(p[i+1].y-p[1].y)-(p[i+1].x-p[1].x)*(p[i].y-p[1].y);
        if(flag>0)
        cout<<"counterclockwise\n";
        else
        cout<<"clockwise\n";
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_40475529/article/details/80374772