一:三点顺序
思路:
利用矢量叉积(即叉乘)判断是逆时针还是顺时针
设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;
}