You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正二十面体(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尝试效果:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:39:52