三角形的插值

Fro*_*bot 13 geometry interpolation

我有一个单位直角三角形和3个顶点的每个顶点的值.我需要插值以在三角形内的某个点找到值.几个小时的搜索没有发现实际上告诉我如何做到这一点.这是我最接近的尝试,实际上非常接近但不太正确 -

                result = 
                v1 * (1 - x) * (1 - y) +
                v2 * x * (1 - y) +
                v3 * x * y;
Run Code Online (Sandbox Code Playgroud)

v1,v2和v3是三角形的3个顶点处的值.(x,y)是您尝试查找值的三角形中的点.

任何一种方法都会对我有所帮助.它不一定需要是单位/右三角形.

更新的信息:我有一个均匀间隔点的网格和每个点的值.我在网格上最近的3个点做了一个三角形.这是一张图片来说明它 - 在此输入图像描述
所以我必须在5,3和7之间进行插值以找到x的值.该点也可以位于另一个三角形内,这意味着您将在5,7之间进行插值,并在该方块的左下角进行插值.

在我展示的代码中,v1 = 5,v2 = 3,v3 = 7.x
是"x"方向的分数距离(范围[0-1]),y是"y"方向的分数距离.
在图片的例子中,x可能约为0.75,y约为0.2

这是我最接近的尝试 -
在此输入图像描述
使用 - 创建 -

        if (x > y) //if x > y then the point is in the upper right triangle
            return
                v1 * (1 - x) * (1 - y) +
                v2 * x * (1 - y) +
                v3 * x * y;
        else //bottom left triangle
            return
                v1 * (1 - x) * (1 - y) +
                v4 * (1 - x) * y +
                v3 * x * y;
Run Code Online (Sandbox Code Playgroud)

另一种尝试 -
在此输入图像描述
使用 - 创建 -

if (x > y)
            return
                (1 - x) * v1 + (x - y) * v2 + y * v3;
        else
            return
                (1 - y) * v1 + (y - x) * v4 + x * v3;
Run Code Online (Sandbox Code Playgroud)

他们都接近我的需要,但显然不太正确.

小智 11

你应该使用重心坐标.这里有一个非常详尽的文章,也讨论了替代解决方案以及为什么重心坐标最佳:CodePlea - 三角形内插

基本上,权重最终看起来像这样:

在此输入图像描述

  • 这应该是公认的答案,因为它纯粹是 2d 而不是 3d (2认同)

Fro*_*bot 2

我三年前就问过这个问题,并且一直在想办法做到这一点。我确实相信除非使用等边三角形,否则不可能在没有伪影的情况下做到这一点。这是一种不错的方法,使用重心坐标,然后添加消除大部分伪影的技术。v1、v2、v3 是三角形三点处的值。x, y 是您要为其查找值的点。

if (x > y)
        {
            b1 = -(x - 1);
            b2 = (x - 1) - (y - 1);
            b3 = 1 - b1 - b2;
        }
        else
        {
            b1 = -(y - 1);
            b2 = -((x - 1) - (y - 1));
            b3 = 1 - b1 - b2;
        }

        float
            abs = x - y;
        if (abs < 0) abs *= -1;
        if (abs < 0.25f)
        {
            abs = 0.25f - abs;
            abs *= abs;
            b1 -= abs;
            b3 -= abs;
        }

        b1 *= b1;
        b2 *= b2;
        b3 *= b3;
        float fd = 1 / (b1 + b2 + b3);
        b1 *= fd;
        b2 *= fd;
        b3 *= fd;

        return
                v1 * b1 +
                v2 * b2 +
                v3 * b3;
Run Code Online (Sandbox Code Playgroud)

  • 话说,你能把结果的图片发来对比一下吗? (5认同)