我有一个点和一组形状。我需要知道这个点是否包含在这些形状的复合形状中。也就是说,所有形状都相交 但这很容易。 如果该点在复合形状之外,我需要找到该复合形状中最接近该点的位置。
这些形状可以是以下类型:
下面的示例有一个倒圆(最大的圆圈,周围有灰色),一个圆环(topleft),一个正方形和一条直线。 如果我们不考虑该线,那么橙色部分就是要约束的形状。如果考虑该线,则该线的饱和橙色部分是要约束的形状。
黑色小点代表需要约束的点。蓝点代表所需的结果。 (a 1,b 2等) 点“f”没有相应的约束结果,因为它已经在橙色区域。 出于此示例的目的,只有点“e”被约束到该行,所有其他点被约束到橙色橙色区域。
如果没有任何形状相交,则无法约束该点。如果约束由两条相互交叉的线组成,那么每个点都会被约束到相同的位置(线交叉的确切位置)。
我找到了接近这个的方法,但没有一个我可以结合起来产生上述功能。 我发现了一些类似的问题:
半圆内的点数 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:我注意到橙色区域在某些屏幕上实际上可能会显示为黄色。无论如何,它都是彩色区域。答案 0 :(得分:1)
这不是一个很好的答案,但是它有点太长了以至于不适合评论...
很有想法,因此建议你找到每个形状中最近的点到感兴趣的点,并找到最近的点。
BUT
您感兴趣的区域是由其他区域的并集,交叉和差异构成的,因此,原始形状的最近点与组合形状的最近点之间不存在一般关系。如果你明白我的意思。例如,虽然A union B
的最近点是集合{closest point of A, closest point of B}
中最接近的点,但A intersection B
的最近点不是该集合的简单函数;至少不是一般情况。
因此,我建议您必须计算代表感兴趣区域的(复杂)形状,并使用您已发现的算法之一来找到与您兴趣点最近的点。 / p>
我期待有更精通计算几何的人证明我错了。
答案 1 :(得分:1)
让我称之为所有形状的交集,C是I的轮廓,p是要约束的点,r是结果点。我们有:
所以我认为你应该做的是以下几点:
答案 2 :(得分:0)
我和我的兄弟详细讨论了这个问题,我们一起得出结论,任何结果点总是位于两个形状相交的点,或者形状与垂直于该形状的线相交的点。原点。
在圆形约束的情况下,垂直线等于其中心线。在线形约束的情况下,垂直线(当然)是垂直于其自身的线。在矩形的情况下,垂直线是垂直于最近边缘的线。 (理论上,对于复杂的多边形约束也是如此。)
所以一种新的方法(我将不得不测试)将是:
如果这样做,那么可以先确定另一个优化,哪个相交点最近并检查它们是否有效,然后向外远离原点,直到找到有效点。
如果这不起作用,我将再看一下多边形裁剪方法。对于这种方法,我遇到了这个有用的帖子:
Compute union of two arbitrary shapes
通过http://code.google.com/p/gpcas/
该方法适用于上述所有情况(所有点及其结果),也适用于我们测试的许多其他情况(纸上)。
我明天会在工作中尝试现场版。