我正在寻找最简单/最快(计算上)的方法来确定一个形状,更具体地说是一个 GeneralPath 对象,是否包含任何给定的线段(Line2D.Double 类型)。
GeneralPath 具有确定是否包含点或矩形的方法,但不包含线(我可以找到)。这条线可以倾斜,所以我不能只模拟一个非常薄的矩形。线中的一个点肯定会在形状内,但我需要检查线段的其余部分。所以有可能,我还可以检查线是否与任何边界边缘相交,但我不确定在给定形状和线的情况下看起来如何。
您的 GeneralPath 是否包含直线段或二次或贝塞尔线段?这很重要。直线的算法是最直接的:
遍历路径中的所有点。如果两个连续的点位于线的相对两侧,则您有可能交叉。然后您需要检查线段端点相对于潜在交叉点是否在形状内部或外部,您可以通过求解两点的交点(线和两个连续点形成的线)并查看是否结果包含在您的线段中。
不幸的是,弯曲的路径可以有两个连续的点,它们之间有一个括号形状“)”,您的线可以通过它们,同时仍将可迭代点保持在同一侧。如果您可以获得具有两个端点和一个(双)控制点形成边界三角形(四边形)的格式,您可以获得简单的简单解决方案(因为保证曲线适合形成的三角形/四边形通过三/四点,只要线不与三角形/四边形相交,就可以了)。不幸的是,这也有一个丑陋的部分——如果这条线确实如此与三角形/四边形相交,您无法保证任何事情,必须仔细检查。不幸的是,除了标准化坐标系和求解零点之外,我不知道其他技术。这就是我在似乎找不到的书中查找的内容(或等到另一张不错的 SO 海报出现)。
...实际上,由于形状的曲率属性在旋转下是不变的,因此对于更仔细的检查部分,您只需旋转曲线点(无论是 3 还是 4)以进行轴对齐。然后做你的瘦矩形技巧。这可能不是最干净的,但它是最明显的技巧。
想一想,为什么不首先旋转所有点呢?整个相交问题是旋转不变的。这将节省大量代码。只需将线轴对齐,将变换应用于形状,然后做你厚颜无耻的矩形技巧。
除非我遗漏了什么,否则为什么不能检查路径是否包含 x1,y1 和 x2,y2 以及AND
以下两个:
generalPath.contains(line.getX1(),line.getY1()) &&
generalPath.contains(line.getX2(),line.getY2())