确定行是否完全在path2d形状内(在java中)

时间:2011-06-14 03:49:42

标签: java line contains shape intersect

我正在寻找最简单/最快(计算)的方法来确定一个形状,更具体地说是一个GeneralPath对象,是否包含任何给定的线段(Line2D.Double类型)。

GeneralPath具有确定是否包含矩形的方法,但不包含行(我可以找到)。这条线可以倾斜,所以我不能只模拟一个非常薄的矩形。线中的一个点肯定会在形状内部,但我需要检查线段的其余部分。因此,我还可以检查线是否与任何边界边相交,但我不确定在给定形状和线条的情况下它是如何看的。

2 个答案:

答案 0 :(得分:2)

您的GeneralPath是否包含直线段或二次或贝塞尔段?这很重要。直线算法最简单:

迭代路径中的所有点。如果两条连续点位于线的两侧,则可能存在交叉点。然后你需要检查线段终点是否在相对于潜在交叉的形状内部或外部,通过求解两个点的交点(线和由两个连续点形成的线)并查看是否结果包含在您的线段中。

不幸的是,弯曲路径可以有两个连续的点,它们之间有一个括号形状“)”,你的线可以通过,同时仍然保持可迭代点在同一侧。如果你可以得到两个端点和一个(双)控制点的格式,形成一个边界三角形(四边形),你可以得到简单的简单解决方案(因为曲线保证适合形成的三角形/四边形内部通过三/四点,只要线不与三角形/四边形相交,你就是好的)。不幸的是,这也有一个丑陋的部分 - 如果与三角形/四边形相交,则不能保证任何东西,并且必须仔细检查。作为一个双重不幸,我不知道除了标准化坐标系和求解零之外的一种技术。这就是我在一本我无法找到的书中看到的东西(或者等到另一张漂亮的SO海报出现)。

...实际上,由于形状的曲率属性在旋转下是不变的,因此对于更近的检查部分,您可以将曲线点(无论是3还是4)旋转为轴对齐。然后做你瘦的矩形技巧。这可能不是最干净的,但这是最明显的伎俩。

想一想,为什么不首先轮换所有点?整个交叉问题是旋转不变的。这样可以节省大量代码。只需将线对齐线,将变换应用于形状,然后做出厚颜无耻的矩形技巧。

答案 1 :(得分:0)

除非我遗漏了什么,为什么你不能检查路径是否包含x1,y1和x2,y2和AND两者如下:

generalPath.contains(line.getX1(),line.getY1()) &&
generalPath.contains(line.getX2(),line.getY2())