java 平面内线段相交判断
2017-05-17 20:03
2046 查看
平面内线段相交判断
说到线段, 我们很自然想到直线,判断两条直线是否相交只需判断它们斜率是否相等,相等就为平行或重合, 不等就相交(注:判断相交我们不采用除法,因为除法容易产生浮点误差,当两条直线斜率接近时,很容易出错。 事实上,几乎所有几何题都不建议采用除法)。线段相交有两种形式:
规范相交和 非规范相交 。 区别就是交点是否是其中一条线段的端点,不是的是规范相交。
叉积的概念: 设向量 a(x1, y1) 、 b(x2, y2) ;
a x b = x1*y2 - x2*y1; (与数学中的叉积不太一样)
判断线段相交比较繁琐,主要就是判断异侧:
我们以一条线段的一端点为起点,沿着线段方向看去(一条射线),在左手边为逆时针方向,右手边为顺时针方向。如果另一线段两端点分别在这一线段的两侧,那么线段可能相交(也可能在线段外),否则不可能相交。对另一线段采用相同方法就可判断出是否相交了。
这个过程主要通过叉积来判断: 叉积大于 0 ,在点在向量的顺时针方向,小于 0 , 在逆时针方向 ; 等于 0, 端点在直线上。
具体实现:
设:线段 a :P1(x1, y1)、P2(x2, y2) 线段 b: Q1(x3, y3)、Q2(x4, y4)
d1 ====> (P2 - P1) x (Q1 - P1) (叉积)
d2 ====> (P2 - P1) x (Q2 - P1) (叉积)
d3 ====> (Q2 - Q1) x (P1 - Q1) (叉积)
d4 ====> (Q2 - Q1) x (P2 - P1) (叉积)
首先,先判断端点是否在另一线段上。
然后,我们只需判断 d1 * d2 < 0 并且 d3 * d4 < 0 便可判断线段相交。
java实现代码:
public static boolean isIntersect(Gps gps1, Gps gps2, Gps gps3, Gps gps4){ double d1 = ((gps1.getWgLon() - gps2.getWgLon()) * (gps3.getWgLat() - gps1.getWgLat())) - ((gps2.getWgLat() - gps1.getWgLat()) * (gps3.getWgLon() - gps1.getWgLon())); double d2 = ((gps1.getWgLon() - gps2.getWgLon()) * (gps4.getWgLat() - gps1.getWgLat())) - ((gps2.getWgLat() - gps1.getWgLat()) * (gps4.getWgLon() - gps1.getWgLon())); double d3 = ((gps3.getWgLon() - gps4.getWgLon()) * (gps1.getWgLat() - gps3.getWgLat())) - ((gps3.getWgLat() - gps4.getWgLat()) * (gps1.getWgLon() - gps3.getWgLon())); double d4 = ((gps3.getWgLon() - gps4.getWgLon()) * (gps2.getWgLat() - gps3.getWgLat())) - ((gps3.getWgLat() - gps4.getWgLat()) * (gps2.getWgLon() - gps3.getWgLon())); if(d1 * d2 <= 0 && d3 * d4 <= 0){ return true; } return false; }
理论出处
相关文章推荐
- 判断平面上两线段是否相交,顺便解释判断点在直线的位置...
- 今天写了一个很简单的判断平面坐标系两线段是否相交的算法
- 关于如何判断在平面上的两条线段是否相交
- 判断平面上任意两条线段是否相交-Python实现
- 判断平面上两线段是否相交
- 判断同一平面内任意两线段是否相交的方法
- 判断二维平面上两线段是否相交
- 如何判断平面上两条线段(注意是线段)是否相交?(某公司校园招聘面试试题)
- 计算几何 --- 判断两条线段是否相交(平面内)
- pku 1410 Intersection(判断线段是否相交)
- 计算平面上二条线段的相交点
- 两线段相交的快速判断-叉积的一个应用
- 【算法导论】33.2:判断任意两条线段是否相交
- C语言平面几何6-判断线段是否与矩形范围有交集
- hdu 1558 线段相交判断 + 并查集
- [PKU 1127 1410 USTC 1121]判断线段相交 判断点在多边形内
- pku1410判断线段相交()
- 已知线段各点经纬度,判断线段相交函数
- 成都预赛 Complex intersecting line segments 判断线段是否相交 包含端点
- 射线与平面相交判断