Как вычислить середины ребер каждого треугольника икосаэдра ⇐ Python
Как вычислить середины ребер каждого треугольника икосаэдра
Я пытаюсь вычислить средние точки ребер каждого треугольника икосаэдра, чтобы получить икосферу, которая представляет собой композицию икосаэдра, разделенного на 6 или более уровней. Я пытался вычислить вновь созданные вершины каждого ребра, но некоторые точки отсутствовали. Я пытался нормализовать каждую среднюю точку, но точки все равно распределялись неравномерно, а некоторые точки отсутствовали.
импортировать matplotlib.pyplot как plt импортировать numpy как np num_points = 12 индексы = np.arange(0, num_points, dtype='float') р = 1 вершины = [[0,0, 0,0, -1,0], [0,0, 0,0, 1,0] ] # полюса # икосаэдр для меня в диапазоне (num_points): theta = np.arctan(1/2) * (180/np.pi) # угол 26 градусов фи = np.deg2rad(я * 72) если я >= (num_points/2): тета = -тета фи = np.deg2rad(36 + я * 72) x = r * np.cos(np.deg2rad(тета)) * np.cos(phi) y = r * np.cos(np.deg2rad(тета)) * np.sin(phi) z = r * np.sin(np.deg2rad(тета)) vertices.append([x, y, z]) вершины = np.array(вершины) икосаэдр
# Разделение треугольника для _ в диапазоне (2): для j в диапазоне (0, len(вершины), 3): v1 = вершины[j] v2 = вершины[j + 1] v3 = вершины[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) вершины = np.vstack([вершины, m1_2, m2_3, m1_3,]) печать (вершины) plt.figure().add_subplot(projection='3d').scatter(вершины[:, 0], вершины[:, 1], вершины[:, 2]) plt.show() попытка икосферы
Я использовал это как образец для создания икосаэдра https://www.songho.ca/opengl/gl_sphere.html и чего я ожидаю достичь: геодезический многогранник я попробовал отладить разделение каждого ребра, и все получилось хорошо:
импортировать numpy как np импортировать matplotlib.pyplot как plt вершины = [[1, 1], [2, 3], [3, 1]] вершины = np.array(вершины) для j в диапазоне (2): для i в диапазоне (0, len(вершины), 3): v1 = вершины[я] v2 = вершины[i + 1] v3 = вершины [я + 2] m1_2 = (v1 + v2)/2 m1_3 = (v1 + v3)/2 m2_3 = (v2 + v3)/2 вершины = np.vstack([вершины, m1_2, m1_3, m2_3]) plt.figure().add_subplot().scatter(вершины[:, 0], вершины[:, 1]) plt.plot(вершины[:, 0], вершины[:, 1], '-ok') plt.show() середины каждого края
Я пытаюсь вычислить средние точки ребер каждого треугольника икосаэдра, чтобы получить икосферу, которая представляет собой композицию икосаэдра, разделенного на 6 или более уровней. Я пытался вычислить вновь созданные вершины каждого ребра, но некоторые точки отсутствовали. Я пытался нормализовать каждую среднюю точку, но точки все равно распределялись неравномерно, а некоторые точки отсутствовали.
импортировать matplotlib.pyplot как plt импортировать numpy как np num_points = 12 индексы = np.arange(0, num_points, dtype='float') р = 1 вершины = [[0,0, 0,0, -1,0], [0,0, 0,0, 1,0] ] # полюса # икосаэдр для меня в диапазоне (num_points): theta = np.arctan(1/2) * (180/np.pi) # угол 26 градусов фи = np.deg2rad(я * 72) если я >= (num_points/2): тета = -тета фи = np.deg2rad(36 + я * 72) x = r * np.cos(np.deg2rad(тета)) * np.cos(phi) y = r * np.cos(np.deg2rad(тета)) * np.sin(phi) z = r * np.sin(np.deg2rad(тета)) vertices.append([x, y, z]) вершины = np.array(вершины) икосаэдр
# Разделение треугольника для _ в диапазоне (2): для j в диапазоне (0, len(вершины), 3): v1 = вершины[j] v2 = вершины[j + 1] v3 = вершины[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) вершины = np.vstack([вершины, m1_2, m2_3, m1_3,]) печать (вершины) plt.figure().add_subplot(projection='3d').scatter(вершины[:, 0], вершины[:, 1], вершины[:, 2]) plt.show() попытка икосферы
Я использовал это как образец для создания икосаэдра https://www.songho.ca/opengl/gl_sphere.html и чего я ожидаю достичь: геодезический многогранник я попробовал отладить разделение каждого ребра, и все получилось хорошо:
импортировать numpy как np импортировать matplotlib.pyplot как plt вершины = [[1, 1], [2, 3], [3, 1]] вершины = np.array(вершины) для j в диапазоне (2): для i в диапазоне (0, len(вершины), 3): v1 = вершины[я] v2 = вершины[i + 1] v3 = вершины [я + 2] m1_2 = (v1 + v2)/2 m1_3 = (v1 + v3)/2 m2_3 = (v2 + v3)/2 вершины = np.vstack([вершины, m1_2, m1_3, m2_3]) plt.figure().add_subplot().scatter(вершины[:, 0], вершины[:, 1]) plt.plot(вершины[:, 0], вершины[:, 1], '-ok') plt.show() середины каждого края
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение