现在的位置: 首页 > 综合 > 正文

判断两线段是否相交

2013年12月09日 ⁄ 综合 ⁄ 共 1377字 ⁄ 字号 评论关闭

以下代码摘自  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;

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

抱歉!评论已关闭.