Я хочу создать сетку из облака точек в Python - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть облако точек из разных частей человеческого тела, например, глаз, и я хочу создать сетку.Я пытался использовать Mayavi и Delaunay, но у меня не получается хорошая сетка.Точки облака находятся в полном беспорядке.У меня есть облако точек в файле .npz

enter image description here

Использование Mayavi

enter image description here

Затем я хочу сохранить свою модель в файле obj или stl, но сначала я хочу сгенерировать сетку.Что вы рекомендуете мне использовать, нужна ли мне специальная библиотека?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Вы пробовали этот пример?https://docs.enthought.com/mayavi/mayavi/auto/example_surface_from_irregular_data.html

Соответствующая часть здесь

# Visualize the points
pts = mlab.points3d(x, y, z, z, scale_mode='none', scale_factor=0.2)

# Create and visualize the mesh
mesh = mlab.pipeline.delaunay2d(pts)
surf = mlab.pipeline.surface(mesh)
0 голосов
/ 13 марта 2019

enter image description here Данные

Давайте использовать столицы Европы.Мы читаем их из Excel с Пандами:

import pandas as pd
dg0 = pd.read_excel('psc_StaedteEuropa_coord.xlsx')  # ,header=None
dg0.head()

    City    Inhabit     xK          yK
0   Andorra 24574.0     42.506939   1.521247
1   Athen   664046.0    37.984149   23.727984
2   Belgrad 1373651.0   44.817813   20.456897
3   Berlin  3538652.0   52.517037   13.388860
4   Bern    122658.0    46.948271   7.451451

Сетка триангуляцией

Для этого мы используем Сципи .Для 3-мерного примера см. ЗДЕСЬ и ЗДЕСЬ или здесь (CGAL имеет оболочку Python)

import numpy as np
from scipy.spatial import Delaunay
yk, xk, city = np.array(dg0['xK']), np.array(dg0['yK']), np.array(dg0['City'])
X1 = np.vstack((xk,yk)).T
tri = Delaunay(X1)

Графика

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
#--- grafics -------
figX = 25; figY = 18
fig1 = plt.figure(figsize=(figX, figY), facecolor='white')

myProjection = ccrs.PlateCarree()
ax = plt.axes(projection=myProjection)
ax.stock_img()
ax.set_extent([-25, 40, 35, 65], crs=myProjection)

plt.triplot(X1[:,0], X1[:,1], tri.simplices.copy(), color='r', linestyle='-',lw=2)
plt.plot(X1[:,0], X1[:,1], 's', color='w')

plt.scatter(xk,yk,s=1000,c='w')
for i, txt in enumerate(city):
    ax.annotate(txt, (X1[i,0], X1[i,1]), color='k', fontweight='bold')

plt.savefig('Europe_A.png')
plt.show()
0 голосов
/ 27 февраля 2019

Если ваши точки «находятся в полном беспорядке», и если вы хотите сгенерировать сетку, вам потребуется некоторая интерполяция из облака точек к каким-то структурированным точкам сетки сетки.

В 2-мерном случае может помочь триангуляция matplotlib: триангуляция matplotlib 2dim .

В 3-мерном случае есть 2 варианта.В зависимости от данных вы можете захотеть интерполировать их на трехмерную поверхность.Тогда trisurf3d matplotlib может помочь.

Если вам нужна трехмерная сетка объема, то вам, вероятно, нужно искать сетку FEM (конечный элемент), например FEnics

Пример интерполяции трехмерного поля с помощью scipy для контурирования можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...