找到沿着已知轴的外部路径边缘内部路径的位置

时间:2014-12-16 16:25:54

标签: algorithm math graphics sprite-kit trigonometry

我正在寻找一种算法来计算另一个闭合路径中包含的闭合路径的位置,以便其中心点沿着已知轴,并且尽可能地将壁橱连接到外部路径的边缘(不与其交叉)

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

这些例子更好地说明了:

enter image description here

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

我正在寻找点P 的位置,它是路径2 的中心,并且它最接近路径1的边缘沿轴 AB

是否有通用的方法来实现这一目标,还是需要分别针对特定形状进行计算?

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

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

1 个答案:

答案 0 :(得分:1)

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

这是我想到的并且非常简单,因为你只有一个参数,这是一维问题。然后你可以用[0,1]:P = A + t * (B - A)中的实数t来简单描述P的位置,从而为P提供一小部分可能性。

我假设你有一个函数contained,当给定两个路径A和P时,返回true当且仅当Shape2完全包含在Shape1中时("没有交集& #34;正如你定义的那样)。

然后,此算法的一些伪代码可能如下:

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;
}