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