C++ 求三角形坐标的线性插值法

C++ 求三角形坐标的线性插值法,c++,geometry,sdl,interpolation,linear-interpolation,C++,Geometry,Sdl,Interpolation,Linear Interpolation,假设您有以下三个点A、B和C,如下图所示: 这些点总是根据其垂直偏移进行排序,因此最上面的点总是A。有时B和C可能具有相同的y坐标 我试图找到点D的x坐标。我可以通过在(B.Y/(C.Y-A.Y))处插入点A.Y和C.Y来找到点D的Y坐标。我使用以下公式(在C++中)进行插值 换句话说,D.y=linearInterpolation(A.y,C.y,(B.y-A.y)/(C.y-A.y)) 总之,我的问题是:如何找到D.x 谢谢 -- 答复: 为了澄清这一点,我们提出了一个可行的解决方案: D

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

这些点总是根据其垂直偏移进行排序,因此最上面的点总是A。有时B和C可能具有相同的y坐标

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

换句话说,
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;
如下图所示:

需要插值的是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)
,而
delta
的数量级为1像素。

直线AC的函数是
y=mx+b

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

然后,您可以将A替换为:
A.y=A.x*m+b

b=A.y-A.x*m

您需要从y计算x,因此交换函数

mx=y-b

x=(y-b)/m

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


请注意,您可能可以通过一系列较小的步骤来优化我刚刚编写的内容。我认为编写更容易阅读的代码更好。

这是反向的。D的y坐标等于B的y坐标(将公式替换为线性插值,您会发现所有内容都被取消,只剩下B.y)。你只需要对x进行线性插值……相当确定第一行应该是
A.x+(A.y-D.y)*(A.x-C.x)/(A.y-C.y)。
@EthanSteinberg,如果斜率为正且D.y大于A.y,那么D.x必须大于A.x。因此,第一项应该是(B.y-A.y)。在斜率计算(或任何一对术语)上切换符号没有任何区别。你可以用直线函数或单位取消来考虑它。然后您立即知道x偏移是另一个x偏移与两个y偏移的比率的乘积。:)
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
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