判断两线段标准相交

 1 {
 2 二维线段标准相交问题
3 }
4 Program LineIntersect;
5
6 const
7 precision=1E-6;
8
9 Type
10
11 point=record
12 x,y:double;
13 end;
14
15 Tdbl=-1..1;
16
17 var
18 p:array[1..4] of point;
19 i:longint;
20 Function dblcmp(d:double):Tdbl;//注意这里相当于一个过滤器,函数值只有三种-1,0,1
21 begin
22 if abs(d)<precision then exit(0);//precision用来消除精度误差
23 if d>0 then exit(1) else exit(-1);
24 end;
25
26 Function det(x1,y1,x2,y2:double):double;//叉积运算
27 begin
28 exit(x1*y2-x2*y1);
29 end;
30
31 Function cross(a,b,c:point):double;//判断一个跨立
32 begin
33 exit(det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y));
34 end;
35
36 Function segcrossSimple(a,b,c,d:point):boolean;//关键部分
37 begin
38 exit((dblcmp(cross(a,c,d)) XOR dblcmp(cross(b,c,d))=-2)
39 and (dblcmp(cross(c,a,b)) XOR dblcmp(cross(d,a,b))=-2));//位运算加速
40 end;
41
42 begin
43 for i:=1 to 4 do
44 with p[i] do
45 readln(x,y);
46 if segcrossSimple(p[1],p[2],p[3],p[4]) then writeln('Yes') else writeln('No');
47 end.

大概思路:

1.把线段相交转化为跨立问题

2.用叉积来判断左右,两次判断确定跨立成立

3.利用位运算加速(这里原理不太清楚)

posted on 2012-01-28 10:56  爱宝宝  阅读(120)  评论(0编辑  收藏  举报

导航