Доработать код с диаграммой Вороного, импортировав визуализацию в gmsh

500 руб. за проект
04 декабря 2024, 09:13 • 3 отклика • 44 просмотра
есть такой код:
import numpy as np
import pyvista as pv
from scipy.spatial import Voronoi
import matplotlib.colors as mcolors

# Установка seed для воспроизводимости результатов
np.random.seed(14)
# Количество генераторов
n_points = 10
# Толщина стенок ячейки
wall_thickness = 1.0

def generate_points(n_points, cube_size=1.0):
"""
Генерация случайных точек внутри куба
:param n_points: количество точек
:param cube_size: размер куба
:return: массив точек размером (n_points, 3)
"""
return np.random.random((n_points, 3)) * cube_size

def create_voronoi_diagram(points):
"""
Создание диаграммы Вороного
:param points: массив точек
:return: объект Voronoi
"""
# Добавляем далекие точки для ограничения диаграммы
center = np.mean(points, axis=0)
radius = 2.0
extra_points = []
for d in range(3):
for sign in [-1, 1]:
point = np.copy(center)
point[d] = center[d] + radius * sign
extra_points.append(point)

points_with_extras = np.vstack((points, extra_points))
return Voronoi(points_with_extras)

def analyze_voronoi_cells(vor):
"""
Анализ ячеек Вороного
:param vor: объект Voronoi
"""
print("\nАнализ ячеек Вороного:")
for i, region in enumerate(vor.regions):
if len(region) > 0 and -1 not in region: # Пропускаем пустые регионы и регионы с бесконечными вершинами
print(f"\nЯчейка {i}:")
print("Вершины:")
vertices = vor.vertices[region]
for j, vertex in enumerate(vertices):
print(f" Вершина {j}: ({vertex[0]:.3f}, {vertex[1]:.3f}, {vertex[2]:.3f})")

# Проверка пересечения с границами куба
if np.any(vertices < 0) or np.any(vertices > 1):
print(" Ячейка пересекает границы куба")

def visualize_voronoi_3d(vor, points, wall_thickness=1.0):
"""
Визуализация 3D диаграммы Вороного
:param vor: объект Voronoi
:param points: исходные точки
:param wall_thickness: толщина стенок ячеек (float, по умолчанию 1.0)
"""
# Создаем плоттер
plotter = pv.Plotter()

# Создаем куб
cube = pv.Box(bounds=(0, 1, 0, 1, 0, 1))
plotter.add_mesh(cube, style='wireframe', color='black', line_width=2)

# Добавляем исходные точки
point_cloud = pv.PolyData(points)
plotter.add_mesh(point_cloud, color='red', point_size=10, render_points_as_spheres=True)

# Добавляем ячейки Вороного
colors = list(mcolors.TABLEAU_COLORS.values())
for i, region in enumerate(vor.regions):
if len(region) > 0 and -1 not in region: # Пропускаем пустые регионы и регионы с бесконечными вершинами
vertices = vor.vertices[region]
# Создаем выпуклую оболочку для ячейки
cell = pv.PolyData(vertices).delaunay_3d()
# Обрезаем ячейку по границам куба
cell = cell.clip_box((0, 1, 0, 1, 0, 1), invert=False)
if cell.n_points > 0: # Проверяем, осталась ли ячейка после обрезки
# Добавляем ячейку с случайным цветом и прозрачностью
plotter.add_mesh(cell, color=colors[i % len(colors)], opacity=0.3)
# Добавляем каркас ячейки с заданной толщиной
edges = cell.extract_feature_edges()
plotter.add_mesh(edges, color='black', line_width=wall_thickness)

# Настройка камеры и отображение
plotter.camera_position = 'iso'
plotter.show()

def main():
# Генерация точек
points = generate_points(n_points)

# Создание диаграммы Вороного
vor = create_voronoi_diagram(points)

# Анализ ячеек
analyze_voronoi_cells(vor)

# Визуализация
visualize_voronoi_3d(vor, points, wall_thickness)

if __name__ == "__main__":
main()

надо сделать так чтобы визуализация этого кода была в gmsh