#include <iostream>
using namespace std;
int main(int argc, const char * argv[])
{
double x1,y1,x2,y2,x3,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
while(!(x1==0 && y1==0 && x2==0 && y2==0 && x3==0 && y3==0)){
if((x2-x1)!=0){ //斜率存在
double k=(y2-y1)/(x2-x1);
if(k!=0){
if((y3>k*(x3-x1)+y1 && x2>x1) || (y3<k*(x3-x1)+y1 && x1>x2))
cout<<"0"<<endl;
else
cout<<"1"<<endl;
}
else if(k==0){
if((y3>y1 && x2<x1) || (y3<y1 && x2>x1))
cout<<"1"<<endl;
else
cout<<"0"<<endl;
}
}
else{ //斜率不存在
if((y1<y2 && x3>x2) || (y1>y2 && x3<x2))
cout<<"1"<<endl;
if((y1>y2 && x3>x2) || (y1<y2 && x3<x2))
cout<<"0"<<endl;
}
cin>>x1>>y1>>x2>>y2>>x3>>y3;
}
return 0;
}
总结:开始我是这样做的,看点的走向来判断是顺时针还是逆时针,这里就是要注意点,斜率!所以所有的数据最好是定义成double,否则斜率那会出问题。
后来在讨论区里看了看,知道了有“矢量叉积”的性质判断点的顺序,性质:
利用矢量叉积判断是逆时针还是顺时针。设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2 所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。 叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:
若 P × Q > 0 , 则P在Q的顺时针方向。
若 P × Q < 0 , 则P在Q的逆时针方向。
若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。
解释:a×b=(ay * bz - by * az, az * bx - ax * bz, ax * by - ay * bx)又因为az bz都为0,所以a×b=(0,0, ax * by - ay * bx)
根据右手系(叉乘满足右手系),若 P × Q > 0,ax * by - ay * bx>0,也就是大拇指指向朝上,所以P在Q的顺时针方向,一下同理。
所以:因为已知到三个坐标A(x1,y1),B(x2,y2)C(x3,y3),因此,可以利用上述性质
利用矢量叉积判断是逆时针还是顺时针。
设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是顺时针的
代码:
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int x1,y1,x2,y2,x3,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
while(!(x1==0 && y1==0 && x2==0 && y2==0 && x3==0 && y3==0)){
if((x2-x1)*(y3-y1)-(y2-y1)*(x3-x1)<0)
cout<<"1"<<endl;
else
cout<<"0"<<endl;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
}
return 0;
}