判断两个多边形是否相交 ,当前认为一个点相交也是相交,可针对凹多边形和凸边型等多复杂的多边形进行相交判断,采用java实现,因为网上java实现的比较少,所以这里写下如何实现,适用于碰撞检测,地图等等应用场景
入口方法:intersectionJudgment
package org.dxl;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* * @projectName launcher2
* * @title Test
* * @package org.dxl
* * @description 判断两个多边形是否相交
* * @author IT_CREAT
* * @date 2020 2020/11/5/005 22:06
* * @version
*/
@Slf4j
public class Test {
/*
第一步:快速排除,以某一个多边形参照物,沿着此多边形画矩形,用矩形将多边形包起来,
在判断另一个多边形是否在这个矩形框中存在顶点,没有就说明另一个矩形一定在参照矩形框的外围。
第二步:利用的是向量叉乘求两线段是否相交,这种求法是求的绝对相交(交叉相交),只要存在多边形任意两线段相交,就一定相交,
同时还有一种情况,就是平行或者在延长线及线段上,这时候需要排除平行和在延长线上的情况
第三步:用点射法求某一个顶点是否在某个多边形内部,这里需要同时同时判断多变形1上的所有点都在多边形2的内部或者边线段上,
或者是反向多边形2的所有点在多边形1的内部或边线上,二者满足其一即可;
*/
public static void main(String[] args) {
Point point = new Point(0, 0.5);
Polygon polygon = new Polygon().setPoints(Arrays.asList(
new Point(0, 0),
new Point(0, 0.5),
new Point(0.5, 0.5),
new Point(0.5, 0)
));
// 点是否在内部
boolean b = pointInPolygon(point, getLineSegment(polygon));
System.out.println(b);
Polygon polygon1 = new Polygon().setPoints(Arrays.asList(
new Point(-1, -1),
new Point(-1, 1),
new Point(1, 1),
new Point(1, -1)
));
// 两个多边形相交
System.out.println(intersectionJudgment(polygon, polygon1));
}
/**
* 多边形相交判断(有一个点相交也认为相交)
*
* @param polygon1 多边形1
* @param polygon2 多边形2
* @return boolean
*/
public static boolean intersectionJudgment(Polygon polygon1, Polygon polygon2) {
if (isExistNull(polygon1, polygon2)) {
return false;
}
if (isExistNullOrEmpty(polygon1.getPoints(), polygon2.getPoints())) {
return false;
}
// 1、快速判断,如果不想交,则返回不相交
if (!fastExclude(polygon1, polygon2)) {
return false;
}
// 获取多边形线段集合
List<LineSegment> lineSegment1 = getLineSegment(polygon1);
List<LineSegment> lineSegment2 = getLineSegment(polygon2);
// 存在线段集合任意一方为空,则不想交
if (isExistNullOrEmpty(lineSegment1, lineSegment2)) {
return false;
}
// 2、向量叉乘判断多边形是否存在线段相交ÿ