编码实现 多边形Gouraud 明暗处理方法(注释详细)
时间: 2024-02-06 09:02:25 浏览: 157
以下是Python语言实现多边形Gouraud明暗处理方法的代码,注释详细解释了每一步的实现过程。
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义顶点列表
vertices = np.array([[0,0],[0,4],[4,4],[4,0]])
# 定义每个顶点的颜色
colors = np.array([[0,0,1],[0,1,0],[1,0,0],[1,1,0]])
# 定义光源方向
light_dir = np.array([1,-1,1])
# 定义计算顶点颜色的函数
def vertex_color(v):
# 计算顶点到光源的方向向量
v_dir = v - np.mean(vertices, axis=0)
# 计算顶点法向量
normal = np.cross(v_dir, light_dir)
# 计算顶点颜色
color = np.clip(np.dot(normal, light_dir), 0, 1)
return color
# 计算每个顶点的颜色
vertex_colors = np.apply_along_axis(vertex_color, 1, vertices)
# 定义插值函数
def lerp(a, b, t):
return (1 - t) * a + t * b
# 定义绘制多边形函数
def draw_polygon(vertices, vertex_colors):
# 将多边形顶点按顺序两两配对
pairs = list(zip(vertices, np.roll(vertices, -1, axis=0)))
# 遍历每条边
for (v1,v2),(c1,c2) in zip(pairs, np.roll(vertex_colors, -1, axis=0)):
# 计算边上的颜色
edge_colors = [lerp(c1, c2, t) for t in np.linspace(0,1,int(np.linalg.norm(v2-v1))+1)]
# 绘制边上的颜色
for i,(r,g,b) in enumerate(edge_colors):
plt.plot(*lerp(v1, v2, i/len(edge_colors)), 'o', markersize=10, markerfacecolor=(r,g,b), markeredgecolor=(0,0,0))
# 绘制多边形
draw_polygon(vertices, vertex_colors)
plt.axis('equal')
plt.show()
```
首先定义了一个四边形的顶点列表和每个顶点的颜色,以及一个光源方向。
接下来定义了一个计算顶点颜色的函数,该函数需要一个顶点作为输入,返回该顶点的颜色。该函数首先计算出从该顶点指向光源的方向向量,然后通过叉积计算出该顶点所在平面的法向量。最后计算出该顶点颜色的强度,即该顶点所对应颜色向量和光源方向向量的点积,再对结果进行取值范围限制,得到最终的颜色强度。其中,使用了`np.mean`函数计算四个顶点的中心点。
然后,使用`np.apply_along_axis`函数对顶点列表应用`vertex_color`函数,得到每个顶点的颜色。
接下来定义了一个插值函数`lerp`,该函数需要两个值和一个插值因子作为输入,返回两个值的插值结果。
最后,定义了一个绘制多边形的函数`draw_polygon`,该函数需要一个顶点列表和一个顶点颜色列表作为输入。该函数首先将多边形的每条边按顺序两两配对,然后计算出每条边上的颜色列表,使用`plt.plot`函数绘制每个颜色点,最后调用`plt.show`函数显示结果。
在主程序中,调用`draw_polygon`函数绘制多边形。
阅读全文