Доработать код с диаграммой Вороного, импортировав визуализацию в gmsh
есть такой код:import numpy as npimport pyvista as pvfrom scipy.spatial import Voronoiimport matplotlib.colors as mcolors# Установка seed для воспроизводимости результатовnp.random.seed(14)# Количество генераторовn_points = 10# Толщина стенок ячейкиwall_thickness = 1.0def 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_sizedef 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
Scripts