三点顺序

#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)p1p2p1+p2 所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P )  P × ( - Q ) = - ( P × Q ) 叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:


  若 P × Q > 0 , PQ的顺时针方向。

  若 P × Q < 0 , PQ的逆时针方向。

  若 P × Q = 0 , PQ共线,但可能同向也可能反向。


解释:a×b=(ay * bz - by * az, az * bx - ax * bz, ax * by - ay * bx)又因为az bz都为0,所以a×b=00 ax * by - ay * bx

根据右手系(叉乘满足右手系),若 P × Q > 0,ax * by - ay * bx>0,也就是大拇指指向朝上,所以PQ的顺时针方向,一下同理。

 

所以:因为已知到三个坐标Ax1,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)

    ABAC的叉积为:(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;
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值