假设您有以下三点A,B和C,如下图所示:
点总是根据它们的垂直偏移进行排序,因此最高点总是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;
如下图所示:
答案 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) < delta
,delta
的数量级为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
b = A.y - A.x * m
你需要从y计算x,所以交换函数。
mx = y -b
x =(y -b)/ m
这是从三角形的y侧找到y的三个步骤。 请注意,您无需进行任何插值即可找到Dy。简单地说,D.y = B.y。
请注意,您可以优化我刚刚编写的一系列较小步骤。我认为编写更易于阅读的代码会更好。