2011-06-14 30 views
1

我正在寻找最简单的/最快(计算)方法,以确定是否一个形状,更具体地GeneralPath对象,包含任何给定的线段(类型Line2D的。双)。确定行是否是完全内path2d形状(在Java)

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

+0

请出示相关的API(即方法)涉及的主要类别 – Bohemian 2011-06-14 05:31:33

回答

2

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

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

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

...实际上,由于形状的曲率特性下旋转不变,对于仔细检查部分可以只旋转曲线点是轴(3或4是否)对准。然后做你的瘦小的长方形技巧。这可能不是最干净的,但这是最明显的把戏。

试想想,为什么不能做所有的点的旋转摆在首位?整个交点问题是旋转不变的。这将节省很多代码。只需将轴线对齐,将变形应用于形状,并执行厚脸皮的矩形技巧。

+0

该路径由直线段组成,因此不会过于复杂。我会尝试你所建议的迭代,谢谢! – scaevity 2011-06-14 04:39:13

+0

线条部分同一侧的两点可以用google搜索,顺便说一句。跨产品技术是最容易转化为代码的技术。 – ccoakley 2011-06-14 04:44:49

+0

哦,如果你想快速证明你为什么需要迭代:考虑一个跳过单个点的算法。对于跳过点两侧的两点,假设它们位于线段的同一侧。放置跳过的点,以便路径穿过线段。或者,假设两点位于线的相对两侧。将跳过的点移出,以便路径绕线弯曲。所以没有一个算法可以跳过一个点,只要路径信息是正确的。 – ccoakley 2011-06-14 04:50:43

0

除非我失去了一些东西,你为什么不能检查,如果路径中包含X1,Y1和X2,Y2和AND两个如下:

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

差不多,除了我不只是希望端点在形状内,但线段两端之间的每一个点(复杂形状并不总是相同的)。 – scaevity 2011-06-14 06:07:06