给定一个段 S 和一个多边形 P,是否有一种快速算法可以返回 S 穿过多边形 P 的子段的总长度?
注意:P 由封闭的 LineString 定义(即:第一个和最后一个相等的点数组)。P 没有任何“孔”,但可以是凹的和/或自相交的。
注意:最终目标是所有相交子段的总长度,如果这可以更快地完成,而无需检索所有子段的显式数组,那就更好了。
加分项:所述算法的 Java 实现。使用 JTS 之类的库是可以的,只要生成的解决方案速度很快。
使用 JTS 的简单解决方案已经存在,但不支持自相交多边形,而且我相信它不是最快的。该解决方案包括创建一个 Polygon 对象(对于 P)、一个 2 点 LineString 对象(对于 S),并获取生成的交叉点的长度。
这是执行此操作的代码:
GeometryFactory fact = new GeometryFactory();
WKTReader wktRdr = new WKTReader(fact);
String wktP = "POLYGON((40 100, 40 20, 120 20, 120 100, 60 40, 40 100))";
String wktS = "LINESTRING(20 60, 160 60)";
Geometry pl = wktRdr.read(wktP);
Geometry ls = wktRdr.read(wktS);
Geometry in = pl.intersection(ls);
System.out.println("P = " + pl);
System.out.println("S = " + ls);
System.out.println("P intersection S = " + in);
System.out.println("S length = " + ls.getLength());
System.out.println("P intersection S length = " + in.getLength());
编辑:关于自相交多边形的考虑:一种解决方案,虽然可能不是最快的,但可能涉及通过将自相交多边形拆分为多个非自相交多边形来对其进行预处理。
关于这个问题的一些解释和一些伪代码在这里: Algorithm to split self-intersected Path2D into several not self-intersected paths?