姓名:卜凡
学号:2020211066
指导老师:符强
日期:2022-05-17 ~ 23
为了求解多边形的法线,在坐标点类中增加以下运算支持:
@
运算符( __matmul__
方法)提供两个点表示向量之间的向量积。~
运算符( __invert__
方法)提供一个点求标准化的方法。# 表示三维坐标中的点。
class Point(object):
# ... 见上次作业或 "附录 · 完整代码"
# 定义 @ 运算符: Point 之间的向量积
def __matmul__(self, other) -> object:
return Point(self.y * other.z - self.z * other.y,
self.z * other.x - self.x * other.z,
self.x * other.y - self.y * other.x)
# 定义 ~ 运算符: Point 标准化(方向不变,模长归一)
def __invert__(self) -> object:
length = self.dist(Point(0.0, 0.0, 0.0)) # dist 是求两点间长度的方法
return Point(self.x / length, self.y / length, self.z / length)
根据向量积的定义,可以求得三角形 $\triangle ABC$ 面(顶点逆时针排布为正面)的法向量(其中 ${\bold {norm}}$ 表示标准化函数),如下图:
$$ \boldsymbol n = {\bold {norm}} (\overrightarrow{\boldsymbol {BC}} \times \overrightarrow{\boldsymbol {BA}}) $$
因而假设已经有坐标点对象 A, B, C
,法向量用代码表示便是 ~((B - C) @ (B - A))
(运算符在 1.1 节中定义)。
对于任意多边形面,选择其中任意三个按顺序排布的顶点即可通过上述方法求解法向量。
在多边形网格模型类中,定义绘制多边形面的方法。