线段相交的判断

第一种方法是:判断这两个直线是否相交,相交并且交点在线段上,就可以保证两个线段是相交的。

第二种方法是:跨立算法。属于计算几何的一个基础。保证几个有向面积是相反的即可。是充要条件。知道三个点计算一个三角形的有向面积就是一个三阶的最后一列为1的行列式的求值。

这里用第二种方法:

 

 1 import java.awt.Paint;
 2 
 3 public class SetmentTest {
 4 
 5     // 参考文献 https://www.2cto.com/kf/201404/296319.html
 6     public static double get_area(Point a0, Point a1, Point a2) {
 7         double s = a0.x * a1.y + a2.x * a0.y + a1.x * a2.y - a2.x * a1.y - a0.x * a2.y - a1.x * a0.y;
 8         return s;
 9     }
10 
11     public static boolean segmentIntersect(Point st1, Point ed1, Point st2, Point ed2) {
12         double s1 = get_area(st1, ed1, st2);
13         double s2 = get_area(st1, ed1, ed2);
14         double s3 = get_area(st2, ed2, st1);
15         double s4 = get_area(st2, ed2, ed1);
16         if (s1 * s2 <= 0 && s3 * s4 <= 0) {
17             // System.out.println("Intersection\n");
18             return true;
19         } else {
20             // System.out.println("No Intersection");
21             return false;
22         }
23     }
24 
25     public static void main(String[] args) {
26         Point aa = new Point(1, 1);
27         Point bb = new Point(2, 2);
28         Point cc = new Point(1, 2);
29         Point dd = new Point(2, 1);
30         System.out.println(SetmentTest.segmentIntersect(aa, bb, cc, dd));
31         if (SetmentTest.segmentIntersect(aa, bb, cc, dd) == true)
32             System.out.println("有交点");
33         else
34             System.out.println("没有交点");
35 
36     }
37 
38 }

 

参考文献:

  • https://blog.csdn.net/wingrez/article/details/75042006
  • http://www.cnblogs.com/jbelial/archive/2011/08/04/2127487.html
  • https://blog.csdn.net/k_koris/article/details/81711396?utm_source=blogxgwz4
  • https://www.2cto.com/kf/201404/296319.html
posted @ 2018-11-06 10:43  kongchung  阅读(1215)  评论(0编辑  收藏  举报