最接近组合几何形状的点(复合形状)

时间:2012-02-20 15:05:55

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

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

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

  • 响(从中心切出另一个圆圈)
  • 反向圆圈(基本上只是圆形孔和在该孔外面的永无止境的填充,或者到画布的末端是否必须限制其大小)
  • 圆圈的一部分(如饼图中所示)
  • 戒指的一部分(如上所述
  • 线

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

黑色小点代表需要约束的点。蓝点代表所需的结果。 (a 1,b 2等) 点“f”没有相应的约束结果,因为它已经在橙色区域。 出于此示例的目的,只有点“e”被约束到该行,所有其他点被约束到橙色橙色区域。

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

enter image description here

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

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

最接近MovieClip的点 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:我注意到橙色区域在某些屏幕上实际上可能会显示为黄色。无论如何,它都是彩色区域。

3 个答案:

答案 0 :(得分:1)

这不是一个很好的答案,但是它有点太长了以至于不适合评论...

很有想法,因此建议你找到每个形状中最近的点到感兴趣的点,并找到最近的点。

BUT

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

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

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

答案 1 :(得分:1)

让我称之为所有形状的交集,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。

答案 2 :(得分:0)

我和我的兄弟详细讨论了这个问题,我们一起得出结论,任何结果点总是位于两个形状相交的点,或者形状与垂直于该形状的线相交的点。原点。

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

所以一种新的方法(我将不得不测试)将是:

  1. 计算所有相交(使用形状约束或使用从原始点到形状约束的垂直线)点
  2. 仅保留有效的内容:位于(遵守)所有约束
  3. 之内
  4. 选择最接近原始点的那个
  5. 如果这样做,那么可以先确定另一个优化,哪个相交点最近并检查它们是否有效,然后向外远离原点,直到找到有效点。

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

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

    该方法适用于上述所有情况(所有点及其结果),也适用于我们测试的许多其他情况(纸上)。
    我明天会在工作中尝试现场版。