我在 Javascript here 中做了一个示例。下面是它背后的数学解释。
命名点,顺时针方向,从(0, 0)开始,A、B、C、D。然后我们可以将左侧的点 Q 定义为 A 和 B 的线性组合:
Qx = Ax * (1 - v) + Bx * v
Qy = Ay * (1 - v) + By * v
或者
Qx = Ax + dx1 * v
Qy = Ay + dy1 * v
dx1 = Bx - Ax 和 dy1 = By - Ay 在哪里
沿右侧的一点,R,作为 D 和 C 的线性组合:
Rx = Dx + dx2 * v
Ry = Dy + dy2 * v
dx2 = Cx - Dx 和 dy2 = Cy - Dy 在哪里
然后我们可以画一条从 Q 到 R 的线。当 v = 0 时,我们有线 AD,当 v = 1 时,我们有线 BC。随着 v 从 0 变为 1,我们得到覆盖整个梯形的线(假设它是凸的)。
所以梯形内的任意一点P都可以是Q和R的线性组合:
Px = Qx * (1 - u) + Rx * u
Py = Qy * (1 - u) + Ry * u
所以可以写一个点(Px, Py):
Px = (Ax + dx1 * v) * (1 - u) + (Dx + dx2 * v) * u
Py = (Ay + dy1 * v) * (1 - u) + (Dy + dy2 * v) * u
现在我们有两个未知数的两个方程。
展开收集vs
v = (Px - Ax + u.Ax - u.Dx) / (dx1 - u.dx1 + u.dx2)
v = (Py - Ay + u.Ay - u.Dy) / (dy1 - u.dy1 + u.dy2)
更多的替换来简化计算:
dx3 = Ax - Dx
dy3 = Ay - Dy
dx4 = dx2 - dx1
dy4 = dy2 - dy1
dx5 = Px - Ax
dy5 = Py - Ay
获得:
v = (dx5 + u.dx3) / (dx1 + u.dx4)
v = (dy5 + u.dy3) / (dy1 + u.dy4)
设置它们相等
(dx5 + u.dx3) / (dx1 + u.dx4) = (dy5 + u.dy3) / (dy1 + u.dy4)
交叉乘法
(dx5 + u.dx3) * (dy1 + u.dy4) = (dy5 + u.dy3) * (dx1 + u.dx4)
展开
dx5 * dy1 + dx5 * dy4 * u + dx3 * dy1 * u + dx3 * dy4 * u^2 = dy5 * da1 + dy5 * dx4 * u + dy3 * dx1 * u + dy3 * dx4 * u^2
收集条款
(dx3 * dy4 - dy3 * dx4)u^2 + (dx5 * dy4 - dy5 * dx4 + dx3 * dy1 - dy3 * dx1)u + dx5 * dy1 - dy5 * dx1 = 0
这是ax^2 + bx + c = 0 形式的二次方
用二次公式求解
a = dx3 * dy4 - dy3 * dx4
b = dx5 * dy4 - dy5 * dx4 + dx3 * dy1 - dy3 * dx1
c = dx5 * dy1 - dy5 * dx1;
determinant = b * b - 4 * a * c
如果行列式 >= 0
u = (-B + sqrt(determinant)) / (2 * A)
然后将u 代入这个方程得到v:
v = (dx5 + u.dx3) / (dx1 + u.dx4)