计算点与矩形之间的有符号距离

时间:2015-05-30 10:35:19

标签: geometry glsl shader euclidean-distance

我正在尝试在GLSL中编写一个函数,该函数返回到矩形的符号距离。矩形是轴对齐的。我觉得有点卡住;我无法绕过我需要做的事情来使它发挥作用。

我想出的最好的是:

float sdAxisAlignedRect(vec2 uv, vec2 tl, vec2 br)
{
    // signed distances for x and y. these work fine.
    float dx = max(tl.x - uv.x, uv.x - br.x);
    float dy = max(tl.y - uv.y, uv.y - br.y);
    dx = max(0.,dx);
    dy = max(0.,dy);
    return sqrt(dx*dx+dy*dy);
}

生成一个看起来像的矩形:

enter image description here

线条显示距矩形的距离。它工作正常,但只适用于矩形外的距离。在矩形内部,距离是静态的0.

如何使用统一的公式在矩形内获得准确的距离?

1 个答案:

答案 0 :(得分:15)

这个怎么样......

const

这里是result,其中绿色标记为正距离,红色标记为红色(代码如下):

enter image description here

故障:

  1. 获取x和y边框的签名距离。 constfloat sdAxisAlignedRect(vec2 uv, vec2 tl, vec2 br) { vec2 d = max(tl-uv, uv-br); return length(max(vec2(0.0), d)) + min(0.0, max(d.x, d.y)); } 是两个x轴距离。取这些值的最大值可得到最近边界的符号距离。查看u - leftright - u会在下面的图片中单独显示。

  2. 合并x和y:

    1. 如果两个值均为负数,则取最大值(即最接近边界)。这是通过d.x完成的。

    2. 如果只有一个值是正数,那就是我们想要的距离。

    3. 如果两个值都是正数,则最近的点是一个角,在这种情况下我们需要长度。这可以与上述情况相结合,无论如何都要考虑长度并确保两个值均为正值:d.y

    4. 等式中的这两部分是互斥的,即只有一部分会产生非零值,并且可以求和。

      enter image description here enter image description here

      min(0.0, max(d.x, d.y))