【发布时间】:2011-08-11 22:18:59
【问题描述】:
我正在尝试计算围绕连接多个点的线的多边形(例如 GPX 轨道)。 下图显示了一个示例,其中轨道为红线,所需的多边形为蓝色。
为简化起见,红点由 x 和 y 表示 - 而不是由纬度/经度表示。
如果我只有指定路径的三个点的列表,我该如何计算这样的环境(浅蓝色多边形)?
为此类计算提供算法的部分解决方案(例如,仅针对两点)或有关数学库(Java 中)的提示也会使我向前迈出一步。
进一步的假设:
- 轨道没有交叉路口。
更新: 使用 Rogach 和 xan 提出的方法,如果线之间的角度小于 90 度或大于 270 度,我会遇到一些问题: 如您所见,多边形与自身相交,这导致了一个严重的问题。
在我看来,使用java.awt.geom.Area 是更好的方法:
我的解决方案(基于 Rogach 的代码):
对于连接轨道两点的每条线,我计算一个周围的多边形。之后,我将计算出的多边形添加(区域联合)到一个区域,该区域为我完成所有必要的计算。由于该区域在添加新多边形时严格使用“或”算法,因此我不必关心上面更新中介绍的多边形的“自相交”。
Area area = new Area();
for (int i = 1; i < points.size(); i++) {
Point2D point1 = points.get(i - 1);
Point2D point2 = points.get(i);
Line2D.Double ln = new Line2D.Double(point1.getX(), point1.getY(), point2.getX(), point2.getY());
double indent = 15.0; // distance from central line
double length = ln.getP1().distance(ln.getP2());
double dx_li = (ln.getX2() - ln.getX1()) / length * indent;
double dy_li = (ln.getY2() - ln.getY1()) / length * indent;
// moved p1 point
double p1X = ln.getX1() - dx_li;
double p1Y = ln.getY1() - dy_li;
// line moved to the left
double lX1 = ln.getX1() - dy_li;
double lY1 = ln.getY1() + dx_li;
double lX2 = ln.getX2() - dy_li;
double lY2 = ln.getY2() + dx_li;
// moved p2 point
double p2X = ln.getX2() + dx_li;
double p2Y = ln.getY2() + dy_li;
// line moved to the right
double rX1_ = ln.getX1() + dy_li;
double rY1 = ln.getY1() - dx_li;
double rX2 = ln.getX2() + dy_li;
double rY2 = ln.getY2() - dx_li;
Path2D p = new Path2D.Double();
p.moveTo(lX1, lY1);
p.lineTo(lX2, lY2);
p.lineTo(p2X, p2Y);
p.lineTo(rX2, rY2);
p.lineTo(rX1_, rY1);
p.lineTo(p1X, p1Y);
p.lineTo(lX1, lY1);
area.add(new Area(p));
}
【问题讨论】:
-
这些线会相交吗?或者你不在乎多边形是否重叠?
-
最后一个没有交点的多边形就是目标。
-
如果路径的两个部分相交但在路径中没有相互连接,您希望它是什么样子?
-
一般我假设路径(红线)是无交叉的。