【问题标题】:Point closest to combined geometric shapes (compound shape)最接近组合几何形状(复合形状)的点
【发布时间】:2012-02-20 15:05:55
【问题描述】:

我有一个点和一组形状。我需要知道该点是否包含在这些形状的复合形状中。也就是说,所有形状相交的地方。
但这是容易的部分。 如果该点在复合形状之外,我需要在该复合形状中找到最接近该点的位置。

这些形状可以是以下类型:

  • 方形
  • 圈子
  • 环(圆形,中心切出另一个圆形)
  • 反圆(基本上只是圆形孔和该孔之外的永无止境的填充,或者到画布的末端必须对其大小进行限制)
  • 圆的一部分(如饼图)
  • 环的一部分(如上,但

下面的示例有一个倒圆(最大的圆,周围有灰色)、一个环(左上角)、一个正方形和一条线。 如果我们不考虑这条线,那么橙色部分就是要约束的形状。如果考虑到线条,则线条的饱和橙色部分就是要约束的形状。

黑色小点代表需要约束的点。蓝点代表所需的结果。 (a 1、b 2 等) 点“f”没有相应的约束结果,因为它已经在橙色区域中。 就本例而言,只有点“e”被限制在直线上,所有其他点都被限制在橙色区域。

如果没有任何形状相交,则无法约束该点。如果约束由两条相互交叉的线组成,那么每个点都将被约束到相同的位置(线交叉的确切位置)。

我找到了接近此的方法,但没有一种方法可以结合起来产生上述功能。 我发现了一些类似的问题:

半圆内的点 What algorithm can I use to determine points within a semi-circle?

离影片剪辑最近的点 Flash: Closest point to MovieClip

通过 Minkowski Sum 的最近点(如果我可以将复合形状转换为多边形,这将起作用) http://www.codezealot.org/archives/153

选择最接近点的多边形边缘(类似于上面) For a point in an irregular polygon, what is the most efficient way to select the edge closest to the point?

PS:我注意到橙色区域实际上可能在某些屏幕上显示为黄色。无论如何,它是彩色区域。

【问题讨论】:

  • 你有多少种形状?您关心的效率是多少?
  • 至少 1 个正方形(通常等于 flash 中的舞台),但除此之外,形状的数量和类型会有所不同。在大多数情况下,我希望有大约 2-4 个形状,但对于更复杂的情况,可能会达到 15 个。不过理论上是无限的。它们可以是任何类型的组合。效率几乎无关紧要,我什至考虑过绘制形状,然后使用生成的位图数据。
  • 所有的形状都是通过动作脚本绘制的,所以我可以使用它们的数学属性/描述。

标签: actionscript-3 algorithm geometry computational-geometry trigonometry


【解决方案1】:

这不是一个很好的答案,但它有点太长了,无法放入评论中......

很容易想到,因此建议您在每个形状中找到离兴趣点最近的点,并找到这些最近点中的最近点。

但是

你感兴趣的区域是由其他区域的并、交、差构成的,因此,原始形状的最近点与组合形状的最近点之间没有一般的关系。如果你明白我的意思。例如,虽然A union B 的最近点是集合{closest point of A, closest point of B} 的最近点,但A intersection B 的最近点不是同一集合的简单函数;至少不适合一般情况。

因此,我建议您必须计算表示感兴趣区域的(复杂)形状,并使用您已经发现的算法之一来找到离您感兴趣的点最近的点。

我期待有更精通计算几何的人证明我错了。

【讨论】:

  • 确实没有直接关系(在纸上画了不同的场景来发现这一点)。我想这给我留下了两个选择:1. 以某种方式计算组合形状的复杂形状数据 2. 绘制形状并以逐像素的方式接近它。两者都是有效的,性能方面,但我对后一种方法能否计算距离表示怀疑。第一个:Minkowski Sum 方法很好用,但我需要先将组合形状作为一个复杂的多边形。我应该把它作为一个单独的问题发布吗? (我是新来的)
【解决方案2】:

我们称 I 为所有形状的交点,C 为 I 的轮廓,p 为要约束的点,r 为结果点。我们有:

  • 如果 p 在 I 中,则 r = p
  • 如果 p 不在 I 中,则 r 在 C 中。所以 r 是 C 中离 p 最近的点。

所以我认为你应该做的是:

  1. 如果 p 在所有形状中,则返回 p。
  2. 计算所有形状相交的轮廓 C,它由零件列表(线段、弧线、...)定义。
  3. 在 C 的每个部分(计算在 2.)中找到离 p 最近的点,并将其中最近的点返回到 p。

【讨论】:

  • 是的,所有 C 中最近的点肯定是我需要的点。如果我使用您的选项 3,则最接近的单独形状通常可能不等于最接近的组合形状(正如高性能标记所指出的那样)。也许我应该更具体地提出这个问题:如何以我可以计算其最近点的形式获得轮廓 C(从这些形状中)。我有我绘制的所有形状的数学数据,所以我可以使用它们: - (as3) GraphicsPath - 数学定义 - BitmapData(例如在 Sprite 中绘制它们之后)
  • 其实建议的三个点T是算法的三个步骤,而不是三个选项之一。
  • 啊,谢谢你的澄清。我认为这归结为一个单独的问题。正如我对 Mark 的回答,一旦我将组合/复杂/复合/轮廓形状以我可以处理的形式存在,Minkowski Sum 方法就可以很好地工作。无论是作为部分(如您所建议的那样)还是作为一个整体。但是如何从不同形状的数学定义转变为它们组合的复杂多边形。或者组合的数学定义(但我认为这会产生一个可怕且难以处理的公式)。我不确定这是否完全是一个不同的问题。
  • @Koert - 可能就像你说你应该在另一个问题中发布它,以便它变得清晰并且可以帮助你的人可以理解你在寻找什么。
【解决方案3】:

我已经与我的兄弟详细讨论了这个问题,我们一起得出结论,任何结果点都将始终位于两个形状相交的点上,或者一个形状与该形状垂直于原点。

在圆形约束的情况下,垂直线等于到其中心的线。在线形约束的情况下,垂直线(当然)是垂直于自身的线。在矩形的情况下,垂直线是垂直于最近边缘的线。 (理论上,对于复杂的多边形约束也是如此。)

因此,一种新方法(我还得测试)将是:

  1. 计算所有相交点(使用形状约束或使用从原始点到形状约束的垂线)点
  2. 只保留那些有效的:位于(遵守)所有约束的范围内
  3. 选择离原点最近的一个

如果这可行,那么另一种优化可能是首先确定哪些相交点最近并检查它们是否有效,然后从原始点向外工作,直到找到有效的点。

如果这不起作用,我将再看看多边形裁剪方法。对于这种方法,我遇到了这个有用的帖子:
Compute union of two arbitrary shapes
通过http://code.google.com/p/gpcas/

可以更轻松地裁剪复杂的多边形

该方法适用于上述所有案例(所有点及其结果),也适用于我们测试过的许多其他场景(在纸上)。
明天上班时我会试试现场版。

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 2021-08-23
    • 2012-06-08
    • 2022-11-24
    • 2018-04-11
    • 2016-02-04
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多