判断线段相交

11 篇文章 0 订阅
2 篇文章 0 订阅
#include  < iostream >
using   namespace  std;

template 
< class  T >
T Direction (T x1, T y1, T x2, T y2, T x3, T y3)
{
    
//  P1 -> P2 -> P3, 如果方向不变,返回 0。如果顺时针旋转,返回正数。如果逆时针旋转,返回负数。
     return  (x3  -  x1)  *  (y2  -  y1)  -  (x2  -  x1)  *  (y3  -  y1);
}

template 
< class  T >
bool  OnSegment (T x1, T y1, T x2, T y2, T x3, T y3)
{
    
//  已知 P3 在直线 P1_P2 上,判断 P3 是否在线段 P1_P2 上
     return  min (x1, x2)  <=  x3  &&  x3  <=  max (x1, x2)  &&  min (y1, y2)  <=  y3  &&  y3  <=  max (y1, y2);
}

template 
< class  T >
bool  Intersect (T x1, T y1, T x2, T y2, T x3, T y3, T x4, T y4)
{
    
//  判断线段 P1_P2 与 线段 P3_P4 是否相交
    T d1  =  Direction (x3, y3, x4, y4, x1, y1);
    T d2 
=  Direction (x3, y3, x4, y4, x2, y2);
    T d3 
=  Direction (x1, y1, x2, y2, x3, y3);
    T d4 
=  Direction (x1, y1, x2, y2, x4, y4);
    
if  (((d1  >   0   &&  d2  <   0 ||  (d1  <   0   &&  d2  >   0 ))  &&  ((d3  >   0   &&  d4  <   0 ||  (d3  <   0   &&  d4  >   0 )))
        
return   true ;
    
if  (d1  ==   0   &&  OnSegment (x3, y3, x4, y4, x1, y1))
        
return   true ;
    
if  (d2  ==   0   &&  OnSegment (x3, y3, x4, y4, x2, y2))
        
return   true ;
    
if  (d3  ==   0   &&  OnSegment (x1, y1, x2, y2, x3, y3))
        
return   true ;
    
if  (d4  ==   0   &&  OnSegment (x1, y1, x2, y2, x4, y4))
        
return   true ;
    
return   false ;
}

void  main ()
{
    
int  x1, y1, x2, y2, x3, y3, x4, y4;
    cin 
>>  x1  >>  y1  >>  x2  >>  y2  >>  x3  >>  y3  >>  x4  >>  y4;
    cout 
<<  Intersect (x1, y1, x2, y2, x3, y3, x4, y4);
}
代码是按照算法导论第二版 33.1 小节的算法写的,算法的时间复杂度是 O (1) 的,而且无需除法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值