考虑下图,其中对角线 PS (假设)平行于 normal 向量(顺便说一句,这就是本教程所说的 AAB 案例)。这张图片代表了问题的 2D 版本,其中的想法更易于解释和理解。
根据定义,p-vertex 是与法线方向进一步对齐的那个。这意味着您必须决定以下四个向量中的哪一个与法线进一步对齐:
R - Q, Q - R, P - S or S - P (1)
在这种情况下,答案是S - P,这意味着S 是p-vertex,P 是n-vertex。但问题是如何以编程方式检测到这一点。
嗯,两个向量之间的dot product 测量其中一个向量到另一个向量的投影,因此问题可以重述为:(1) 中的哪个向量与正常(xn, yn) 的点积最大?
以下是四个点积:
(xn, yn).(R - Q) = xn(x1 - x2) + yn(y1 - y2)
(xn, yn).(Q - R) = xn(x2 - x1) + yn(y2 - y1)
(xn, yn).(P - S) = xn(x1 - x2) + yn(y2 - y1)
(xn, yn).(S - P) = xn(x2 - x1) + yn(y1 - y2)
所以,我们正在寻找的那个是使总和的两项都为正的那个,这是
- 如果
xn > 0 选择x2 - x1 (>0) 否则x1 - x2 (<0)
- 如果
yn > 0 选择y2 - y1 (>0) 否则y1 - y2 (<0)
原因是符号规则(+ 乘以 + = + 和 - 乘以 - = +。)
所有这些都转化为
- 以
p-vertex = (x1, y1)开头
- 如果
xn > 0,将x1 更改为x2(实际上是离开p-vertex = (x2, y1))
- 如果
yn > 0,将y1 更改为y2(实际上是离开p-vertex = (x*, y2))
(在步骤 3 中,x* 是 x1 或 x2,具体取决于 setp 2 的结果)
如果您处于 3 维中,这些参数仍然有效。唯一的区别是你必须在任何地方添加z 坐标。