algorithm - 沿已知轴在外部路径边缘内查找内部路径的位置

标签 algorithm math graphics sprite-kit trigonometry

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

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

这些例子更好地说明了:

enter image description here

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

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

是否有通用的方法来实现这一点,还是我需要针对特定​​形状分别计算它?

(第三个例子在只处理圆圈时显然很容易解决,但这只是一个具体案例)

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

最佳答案

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

这会浮现在脑海中,而且会非常简单,因为您只有一个参数,即一维问题。然后,您可以简单地描述 P 在 [0,1] 中具有实数 t 的位置:P = A + t * (B - A),因此可能的空间很小

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

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

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

关于algorithm - 沿已知轴在外部路径边缘内查找内部路径的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27509278/

相关文章:

ruby - 这种方法如何确定最大公约数?

c++ - 什么是保卫王国的好算法?

java - 查找以下代码的时间复杂度和大O

python - 裁剪图像中的黑色边框

javascript - 执行二进制搜索时如何正确显示数组中不存在值

math - 数学函数不可逆吗?

javascript - 在 JavaScript 中从一组数字中获取公因数

javascript - 如何使用交替 if 语句创建可重用函数

java - 清除 Swing 绘图面板的前景

android - 如何使用 BitmapFactory.decodeByteArray() 捕获 "png error"?