正二十面体(icosahedron)三角边中点计算及icosphere生成问题排查
问题:正二十面体细分生成Icosphere时顶点缺失、分布不均
我尝试计算正二十面体各三角形边的中点,通过6级及以上细分生成球面网格(icosphere)。但计算新生成的边顶点时出现部分点缺失,即使对中点做了归一化,点的分布仍然不均匀且存在缺失。
正二十面体实现代码
import matplotlib.pyplot as plt import numpy as np num_points = 12 indices = np.arange(0, num_points, dtype='float') r = 1 vertices = [ [0.0, 0.0, -1.0], [0.0, 0.0, 1.0] ] # 极点 # 生成正二十面体顶点 for i in range(num_points): theta = np.arctan(1 / 2) * (180 / np.pi) # 约26度角 phi = np.deg2rad(i * 72) if i >= (num_points / 2): theta = -theta phi = np.deg2rad(36 + i * 72) x = r * np.cos(np.deg2rad(theta)) * np.cos(phi) y = r * np.cos(np.deg2rad(theta)) * np.sin(phi) z = r * np.sin(np.deg2rad(theta)) vertices.append([x, y, z]) vertices = np.array(vertices)
正二十面体效果:
三角细分代码
# 三角形细分 for _ in range(2): for j in range(0, len(vertices), 3): v1 = vertices[j] v2 = vertices[j + 1] v3 = vertices[j + 2] m1_2 = ((v1 + v2) / 2) m2_3 = ((v2 + v3) / 2) m1_3 = ((v1 + v3) / 2) m1_2 /= np.linalg.norm(m1_2) m2_3 /= np.linalg.norm(m2_3) m1_3 /= np.linalg.norm(m1_3) vertices = np.vstack([vertices, m1_2, m2_3, m1_3,]) print(vertices) plt.figure().add_subplot(projection='3d').scatter(vertices[:, 0], vertices[:, 1], vertices[:, 2]) plt.show()
Icosphere尝试效果:
预期效果
我参考相关实现正二十面体,预期实现测地多面体(Geodesic polyhedron)效果:
2D调试代码(运行正常)
import numpy as np import matplotlib.pyplot as plt vertices = [[1, 1], [2, 3], [3, 1]] vertices = np.array(vertices) for j in range(2): for i in range(0, len(vertices), 3): v1 = vertices[i] v2 = vertices[i + 1] v3 = vertices[i + 2] m1_2 = (v1 + v2) / 2 m1_3 = (v1 + v3) / 2 m2_3 = (v2 + v3) / 2 vertices = np.vstack([vertices, m1_2, m1_3, m2_3]) plt.figure().add_subplot().scatter(vertices[:, 0], vertices[:, 1]) plt.plot(vertices[:, 0], vertices[:, 1], '-ok') plt.show()
各边中点效果:
内容的提问来源于stack exchange,提问作者Sengeki
相关产品推荐
相关产品推荐

