判断两线段是否相交

以下代码摘自  http://www.cai0715.cn/read.php?109

其中x1,y1,x2,y2是全局变量,存储了一条直线的起始点和终止点坐标。x3,y3,x4,y4是表示另外一条直线。下面函数用来判断两条直线是否相交。

//====================================================
function cross(tx,ty,ax,ay,bx,by:longint):longint; {叉积}
begin
exit((ax-tx)*(by-ty)-(bx-tx)*(ay-ty));
end;
//====================================================
function bet(tx,ty,ax,ay,bx,by:longint):longint; {点积}
begin
exit((ax-tx)*(bx-tx)+(ay-ty)*(by-ty));
end;
//====================================================
function check(x3,y3,x4,y4:longint):boolean;
var s1,s2,s3,s4:longint;
begin
s1:=cross(x1,y1,x2,y2,x3,y3); s2:=cross(x1,y1,x2,y2,x4,y4);
s3:=cross(x3,y3,x4,y4,x1,y1); s4:=cross(x3,y3,x4,y4,x2,y2);

if (s1*s2<0)and(s3*s4<0) then exit(true); {规范相交}

if ((s1=0)and(bet(x3,y3,x1,y1,x2,y2)<=0)) or
    ((s2=0)and(bet(x4,y4,x1,y1,x2,y2)<=0)) or
    ((s3=0)and(bet(x1,y1,x3,y3,x4,y4)<=0)) or
    ((s4=0)and(bet(x2,y2,x3,y3,x4,y4)<=0)) then exit(true); {非规范相交}

exit(false); {否则返回false}
end;

//====================================================

 

以下这种形式是错误的,因为如果两线段共线则无法准确判断。

//====================================================
function check(x3,y3,x4,y4:longint):boolean;
var s1,s2,s3,s4:longint;
begin
s1:=cross(x1,y1,x2,y2,x3,y3); s2:=cross(x1,y1,x2,y2,x4,y4);
s3:=cross(x3,y3,x4,y4,x1,y1); s4:=cross(x3,y3,x4,y4,x2,y2);

if (s1*s2<=0)and(s3*s4<=0) then exit(true); {相交}
exit(false); {否则返回false}
end;

//====================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值