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