你这里有一个2d bilinear blended surface。为简单起见,让我们将其坐标更改为从零到一的范围:
u = 0.5 * (ξ + 1)
v = 0.5 * (η + 1)
在这种情况下,表面评估器可以表示为
F(u, v) = P1 + u * (P2 - P1) + v * ((P4 + u * (P3 - P4)) - (P1 + u * (P2 - P1)))
即,对于给定的u,构造一条通过以下两点的线:
Pv0 = P1 + u * (P2 - P1);
Pv1 = P4 + u * (P3 - P4);
然后在给定的v之间插值
F(u, v) = Pv0 + v * (Pv1 - Pv0)
您寻求的是值(u,v) 使得F(u, v) = P5。对于给定的u,当从Pv0 到Pv1 的线经过P5 时会发生这种情况,当P5 - Pv0 与Pv1 - Pv0 平行时会发生这种情况——即当它们的2d cross 为零时:
cross2d(P5 - Pv0, Pv1 - Pv0) = 0
⇒
cross2d(P5 - (P1 + u * (P2 - P1)),
P4 + u * (P3 - P4) - (P1 + u * (P2 - P1))) = 0
现在,两个二维向量A ⨯ B 的2d cross 由Ax*By - Ay*Bx 给出,所以方程变为
(x5 - (x1 + u * (x2 - x1))) * (y4 + u * (y3 - y4) - (y1 + u * (y2 - y1))) - (y5 - (y1 + u * (y2 - y1))) * (x4 + u * (x3 - x4) - (x1 + u * (x2 - x1))) = 0
Expanding this expression out and collecting collecting together terms in u,我们得到
u^2 * (x1*y3 - x1*y4 - x2*y3 + x2*y4 + (-x3)*y1 + x3*y2 + x4*y1 - x4*y2)
+ u * (-x1*y3 + 2*x1*y4 - x1*y5 - x2*y4 + x2*y5 + x3*y1 - x3*y5 - 2*x4*y1 + x4*y2 + x4*y5 + x5*y1 - x5*y2 + x5*y3 - x5*y4)
+ (-x1*y4 + x1*y5 + x4*y1 - x4*y5 - x5*y1 + x5*y4)
= 0
现在这是u 上的二次方程,因此可以是solved。请注意,如果四边形的顶部和底部边缘平行,则二次方会演变为线性方程;你的二次方程求解器必须处理这个问题。
double a = (x1 * y3 - x1 * y4 - x2 * y3 + x2 * y4 + (-x3) * y1 + x3 * y2 + x4 * y1 - x4 * y2);
double b = (-x1 * y3 + 2 * x1 * y4 - x1 * y5 - x2 * y4 + x2 * y5 + x3 * y1 - x3 * y5 - 2 * x4 * y1 + x4 * y2 + x4 * y5 + x5 * y1 - x5 * y2 + x5 * y3 - x5 * y4);
double c = (-x1 * y4 + x1 * y5 + x4 * y1 - x4 * y5 - x5 * y1 + x5 * y4);
double[] solutions = Quadratic.Solve(a, b, c);
可能有不止一种解决方案。退化四边形也可能没有解决方案。
解决了u 的值,找到等价的v 很简单。给定点
Pv0 = P1 + u * (P2 - P1);
Pv1 = P4 + u * (P3 - P4);
你寻找v这样
v * (Pv1 - Pv0) = P5 - Pv0;
选择坐标索引 0 或 1 以使 |(Pv1 - Pv0)[index]|最大化。 (如果两个坐标都几乎为零,那就放弃——这个特定的u没有解决方案。然后设置
v = (P5 - Pv0)[index] / (Pv1 - Pv0)[index];
最后,如果您有多个解决方案,则更喜欢混合的[u, v] 边界内的解决方案。然后最后设置
ξ = 2 * u - 1;
η = 2 * v - 1;