判断线段相交

#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、付费专栏及课程。

余额充值