【问题标题】:Finding position of inner path within outer path edges along known axis沿已知轴在外部路径边缘内查找内部路径的位置
【发布时间】:2014-12-16 16:25:54
【问题描述】:

我正在寻找一种算法来计算包含在另一个闭合路径中的闭合路径的位置,以便它的中心点沿着已知轴并且它尽可能靠近外部路径的边缘(不相交) .

路径最有可能是简单的形状(椭圆形、矩形),但如果有更通用的算法可以处理更复杂的路径(即由 CGPath/BezierPath 表示),那就更好了。

这些例子可以更好地说明:

在所有三种情况下,我都有A点B点路径1/路径2

我正在寻找P点的位置,它是Path 2的中心,并放置在最靠近Path 1边缘的位置> 沿轴 A-B

有没有通用的方法来实现这一点,还是我需要为特定的形状单独计算它?

(第三个例子在只处理圆圈时显然很容易解决,但这只是一种特殊情况)

我在 iOS 上使用 SpriteKit,所以如果有任何现有的 API 可以利用,那就太好了。但是指向通用算法的指针也会有所帮助。

【问题讨论】:

  • 没有解决方案,但可能是其中的一部分:Separate Axis Theorem
  • 这也可能是计算机科学堆栈交换的东西。

标签: algorithm math graphics sprite-kit trigonometry


【解决方案1】:

为了尽可能保持一般性,我会进行二分搜索。这样你就可以完全不知道你的路径,只要你有一个告诉你路径是否相交的黑盒函数。

想到这一点并且非常简单,因为您只有一个参数,即一维问题。然后,您可以用 [0,1] 中的实数 t 简单地描述 P 的位置:P = A + t * (B - A),因此 P 的可能性空间很小。

我假设您有一个函数contained,它在给定路径 A 和 P 的情况下返回 true,当且仅当 Shape2 完全包含在 Shape1 中(如您定义的“没有交集”)。

那么这个算法的一些伪代码可能如下:

Point find_P(Path1, Path2, A, B)
{
    if( !contained(Path1,A,Path2,P) )
        throw ("Impossible for P == A !");
    else if( contained(Path1,B,Path2,P) )
        return B;

    double dt = 0.5;
    Point P=A, V = B-A;

    while(dt > eps) // where eps is your precision parameter
    {
        if( contained(Path1,A,Path2, P+dt*V ) )
             P += dt * V;
        dt /= 2;
    }
    return P;
}

【讨论】:

  • 再补充一点,当您移动到更复杂的形状时,使用简单的边界路径(框、圆或其他简单的东西)可能会有所帮助,只要您可以生成围绕您的复杂形状合理紧密地限制),直到您有一个良好的估计,然后使用实际形状将估计细化为解决方案。这将有助于节省计算时间...此外,您可以使用与上述类似的沿 A-B 的二进制搜索,在某些情况下可能会更快收敛,但不一定总是...
  • 该特定项目目前处于暂停状态,但这看起来是一种可以处理各种形状的合理方法。一旦我恢复该项目的工作,我会尝试一下。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多