Java类来检查一条线是否与一个形状相交。

3

在Java API中是否有一个类可以用来检查一条线段与一个形状的相交情况,给定起始和结束坐标。我已经尝试使用Line2D对象进行操作,但是该类的intersects()函数似乎只接受矩形坐标和Rectangle2D对象,这不适合我的目的,因为我的形状可能有任意数量的边。

3个回答

3

像@Dan所说,您可以检查您的线是否与您的Polygon边界相交,但您不必检查与从Polygon的任意两个点创建的每条线相交,只需检查您的线与每对点(如(p1,p2), (p2,p3), ... , (p(N-1), pN), (pN, p1))的交点即可。多边形不是由数组中所有点的组合创建的,而是由从p1到p2连接的线与从p2到p3等等直到从pN到p1连接的线创建的。

这里有一些例子:

Line2D myLine = getMyLine() // some imagine method giving your line
Point2D[] polyPoints = getPolyPoints() // some imagine method giving point of your Polygon

boolean intersect = false;
for (int i = 0; i < polyPoints.length - 1; i++) {
   intersect = myLine.intersectsLine(polyPoints[i].getX(), polyPoints[i].getY(), polyPoints[i+1].getX(), polyPoints[i+1].getY());
   if (intersect) {
      break;
   }
}
if (!intersect) {
   intersect = myLine.intersectsLine(polyPoints[polyPoints.length - 1].getX(), polyPoints[polyPoints.length - 1].getY(), polyPoints[0].getX(), polyPoints[0].getY());
}

执行intersect代码后,您将得到一个值,指示您的线是否与多边形相交。

如果您接受多边形可以包含一条线,这仍意味着线(作为路径)与多边形相交的情况,则从您的点(顶点)创建Java Polygon实例,然后只需调用:

if (!intersect) {
   intersect = myPolygon.contains(myLine.getP1()) || myPolygon.contains(myLine.getP2());
}

不,我的意思是不允许相交多边形,因为它是一个实体形状。因此,如果起点在多边形外部,则您的解决方案可以很好地工作,因为边界将捕捉任何交叉点。但是,如果起点位于多边形本身上,而终点也在多边形上,则边界不一定会捕捉到交叉点。这意味着当不应该允许这样做时,一条线能够穿过多边形。 - raphnguyen
嗯,现在我完全理解你的意思了,但这里的 steal 是指线段与多边形相交,还是指多边形包含线段? - Michał Kupisiński
我认为由于这条线是一条路径,所以我会称其为与多边形相交的线。 - raphnguyen
根据Javadocs的说明,intersectsLine(..)应该包括两条线段的端点。 - G. Bach
@AlexWien的PointInPolygon方法取决于从检查点发出的射线穿过多边形边界的次数!如果是偶数,则该点不在多边形内,如果是奇数,则在多边形内。因此,请不要说这种方法效率低下,如果您建议的方法依赖于此方法! - Michał Kupisiński
显示剩余5条评论

1
你可以检查你的线是否与形状中任意两点之间给出的任意线相交。因此,您需要遍历形状点并构建任意两点组合的线段。如果这些线段中的任何一个与您的线相交,则您的线与该形状相交。

我目前正在考虑这个解决方案,因为在我的脑海中它似乎是有道理的。我只是想象一下在大量形状的情况下,这种情况会如何发挥作用。似乎每次从顶点移动到另一个顶点时,也就是我的程序将要做的事情,我都必须检查每个形状内的每个点组合,以查看它是否与我的路径相交。我正在寻找更优雅的解决方案,但如果这是最好的解决方案,那么我可能不得不尝试这个建议。 - raphnguyen
你可以一直检查交集,直到找到一个有交集的为止。在那个点上你就可以停止了。当然,肯定有优化的方法。 - Dan D.
如果通过连接每两个点的线来创建多边形,那么它将是混乱而不是多边形。 - Michał Kupisiński

0

Polygon对象听起来像是你想要使用的东西,但它的intersects方法只接受某种形式的矩形对象(即角落坐标与尺寸,或一个Rectangle2D对象)。你可能需要扩展Polygon并添加一个接受Line2Dintersects方法...或将其与答案Dan发布的结合起来。


我需要知道intersects方法背后的算法,才能将该函数扩展为接受Line2D参数吗? - raphnguyen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接