判断两条线段是否相交
2016-11-13 13:52
369 查看
![](https://images2015.cnblogs.com/blog/1046723/201611/1046723-20161113131733936-1930626371.png)
根据这个性质可以判断点p2是在线段的左边还是右边,这是判断两条线段是否相交的一个重要性质。
![](https://images2015.cnblogs.com/blog/1046723/201611/1046723-20161113132006280-590367595.png)
这是判断两条线段相交的一种情况,一条线段的端点在另一条线段上。
![](https://images2015.cnblogs.com/blog/1046723/201611/1046723-20161113132204264-204800540.png)
这是判断两条线段是否相交的原理。
1 #include <iostream> 2 #include <algorithm> 3 #include <cmath> 4 using namespace std; 5 6 struct point { 7 double x, y; 8 }; 9 10 bool segmentsIntersect(point p1, point p2, point p3,point p4) { 11 double d1 = direction(p1, p2, p3); 12 double d2 = direction(p1, p2, p4); 13 double d3 = direction(p3, p4, p1); 14 double d4 = direction(p3, p4, p2); 15 16 if (d1 > 0 && d2 < 0 || d1 < 0 || d2>0 || d3>0 && d4 < 0 || d3 < 0 && d4>0) 17 return true; 18 if (fabs(d1) <= 1e-9 && onSegment(p1, p2, p3)) return true; 19 if (fabs(d2) <= 1e-9 && onSegment(p1, p2, p4)) return true; 20 if (fabs(d3) <= 1e-9 && onSegment(p3, p4, p1)) return true; 21 if (fabs(d4) <= 1e-9 && onSegment(p3, p4, p2)) return true; 22 return false; 23 } 24 25 //这是判断p3是在线段p1p2的哪一侧 26 double direction(point p1, point p2, point p3) { 27 return (p2.x - p1.x)*(p3.y - p2.y) - (p3.x - p2.x)*(p2.y - p1.y); 28 } 29 30 //这是判断点p3是否在以p1p2为对角线的矩形内 31 bool onSegment(point p1, point p2, point p3) { 32 if (p3.x >= min(p1.x, p2.x) && p3.x <= max(p1.x, p2.x) && 33 p3.y >= min(p1.y, p2.y) && p3.y <= max(p1.y, p2.y)) 34 return true; 35 return false; 36 }
下面还有一种详情可以看算法导论的几何篇
![](https://images2015.cnblogs.com/blog/1046723/201611/1046723-20161113132350483-930383618.png)
这个方法略懂。
相关文章推荐
- 判断两条线段是否相交(三种算法)
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断平面上任意两条线段是否相交-Python实现
- 判断两条线段是否相交
- 判断两条线段是否相交(三种算法)
- 使用叉积判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- Pick-up sticks(判断两条线段是否相交)
- 判断是否两条线段相交
- 判断两条线段是否相交_模版
- 判断两条线段是否相交 计算几何
- 判断两条线段是否相交
- 模板—判断两条线段是否相交
- 已知两条线段端点,判断是否相交及交点
- c# 判断两条线段是否相交(判断地图多边形是否相交)
- 计算几何 --- 判断两条线段是否相交(平面内)