【问题标题】:determine whether line is entirely within path2d shape (in java)确定线是否完全在 path2d 形状内(在 java 中)
【发布时间】:2011-09-14 09:29:18
【问题描述】:

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

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

【问题讨论】:

  • 请展示涉及的主要类的相关API(即方法)

标签: java line contains shape intersect


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 路径只是由直线段组成,所以并不过分复杂。我会尝试你建议的迭代,谢谢!
  • 线部分同一侧的两个点可以google,顺便说一句。叉积技术最容易转化为代码。
  • 哦,如果你想快速证明为什么你需要迭代:考虑一个跳过一个点的算法。对于跳过点相对两侧的两个点,假设它们位于线段的同一侧。放置跳过的点,使路径与线段相交。或者,假设这两个点位于直线的相对两侧。将跳过的点移出,使路径绕线弯曲。因此,没有任何算法可以跳过一个点并且仅使用路径信息是正确的。
  • 好的,所以我想我完全理解我需要做什么......但我不确定如何迭代路径(或线段)中的每个点。有什么想法/建议吗?
  • 嗯,有一个这样的问题:stackoverflow.com/questions/5803111/…
【解决方案2】:

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

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

【讨论】:

  • 几乎,除了我不只是希望端点在形状内,而是线段两端之间的每个点(复杂形状并不总是相同的东西)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多