判断两条线段是否相交

对于线段A,B,如果 线段A与直线B相交 ,线段B与直线A相交 ,那么就可以认为线段A 和线段B相交。
关键问题是:如何判断直线AB是否与线段CD相交呢?
设直线AB的方程为:f(x,y) = 0,直线方程可以通过两点式求得。
当C和D点不在直线的同侧时,直线AB必然与线段CD相交,也就是说直线AB与线段CD相交的条件为:f(C) * f(D) <= 0。
代码如下:
 1     typedef struct point  
 2 
 3     {  
 4 
 5         float x;  
 6 
 7         float y;  
 8 
 9     }Point;  
10 
11     //判断直线AB是否与线段CD相交  
12 
13     bool lineIntersectSide(Point A, Point B, Point C, Point D)  
14 
15     {  
16 
17         // A(x1, y1), B(x2, y2)的直线方程为:  
18 
19         // f(x, y) =  (y - y1) * (x1 - x2) - (x - x1) * (y1 - y2) = 0  
20 
21       
22 
23         float fC = (C.y - A.y) * (A.x - B.x) - (C.x - A.x) * (A.y - B.y);  
24 
25         float fD = (D.y - A.y) * (A.x - B.x) - (D.x - A.x) * (A.y - B.y);  
26 
27       
28 
29         if(fC * fD > 0)  
30 
31             return false;  
32 
33       
34 
35         return true;  
36 
37     }  
38 
39     bool sideIntersectSide(Point A, Point B, Point C, Point D)  
40 
41     {  
42 
43         if(!lineIntersectSide(A, B, C, D))  
44 
45             return false;  
46 
47         if(!lineIntersectSide(C, D, A, B))  
48 
49             return false;  
50 
51         return true;  
52 
53     }  

 

posted @ 2019-03-05 15:26  玥茹苟  阅读(495)  评论(0编辑  收藏  举报