线性插值以找到三角形中的坐标

时间:2012-01-16 23:41:52

标签: c++ geometry sdl interpolation linear

假设您有以下三点A,B和C,如下图所示:

enter image description here

点总是根据它们的垂直偏移进行排序,因此最高点总是A.有时B和C可以具有相同的y坐标。

我正在尝试找到点D的x坐标。我可以通过在(B.y /(C.y- A.y))处插入点A.y和C.y来找到D的Y坐标。我正在使用以下公式进行插值(在C ++中)

float linearInterpolation(float a, float b, float t)
{
    return a + (t * (b - a));
}

所以换句话说,D.y = linearInterpolation(A.y,C.y,(B.y - A.y)/(C.y - A.y))

总而言之,我的问题是:我如何找到D.x?

由于

-

答案:

只是为了澄清,这是建议和工作的解决方案:

D.x = A.x + (B.y - A.y) * (C.x - A.x) / (C.y - A.y);
D.y = B.y;

如下图所示:

enter image description here

3 个答案:

答案 0 :(得分:7)

x 坐标需要插值。 B D y 坐标在图上相等。

D.x = A.x + (B.y - A.y) * (C.x - A.x) / (C.y - A.y);
D.y = B.y;

您还应该为C.y == A.y的情况做出规定,其中D.x可以是A.x和C.x之间的任何地方。一种方法是不绘制三角形,abs(C.y - A.y) < deltadelta的数量级为1像素。

答案 1 :(得分:2)

D.y = B.y

delta_x = C.x - A.x 
delta_y = C.y - A.y 

dist_y = B.y - A.y

percent = dist_y / delta_y

D.x = A.x + percent * delta_x

答案 2 :(得分:1)

AC线的功能是y = mx + b

m =(A.y - C.y)/(A.x - C.x)

然后,您可以在:A.y = A.x * m + b

中替换A.

b = A.y - A.x * m

你需要从y计算x,所以交换函数。

mx = y -b

x =(y -b)/ m

这是从三角形的y侧找到y的三个步骤。 请注意,您无需进行任何插值即可找到Dy。简单地说,D.y = B.y。

请注意,您可以优化我刚刚编写的一系列较小步骤。我认为编写更易于阅读的代码会更好。