Участок неструктурированных три angular поверхностей Python - PullRequest
3 голосов
/ 10 июля 2020

Я пытаюсь построить поверхность, состоящую из> 10000 неструктурированных треугольников. У меня есть координаты точек треугольника и список точек каждого треугольника. Мои данные следующие:

0,1 0,2 0,1 0,2 0,4 0,6 0,4 0,6 0,4 . . . 1 2 3 . . .

Первые три строки - это координаты (-X, Y, Z COORDINATES-) точек (точка 1 в строке 1, точка 2 в строке 2 и et c). Число точек превышает 10000. «1 2 3» означает, что у нас есть треугольник, в котором его угловые точки равны 1, 2 и 3. Итак, я хочу построить поверхность, начав с 1-го треугольника и построив их. по одному. Я попытался выполнить описанную выше процедуру, но не получил нужного числа и, наконец, получил следующее сообщение об ошибке.

Размер рисунка 432x288 с 0 осями

I попробовали следующий код.

import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
from matplotlib.tri import Triangulation
# from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits import mplot3d
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

fileName = open('surface.txt','r')
print(fileName.readline())
dummy = fileName.readline().split()
npo = int(dummy[2])
nel = int(dummy[4])

xp = np.zeros([npo])
yp = np.zeros([npo])
zp = np.zeros([npo])


el1 = np.zeros([nel])
el2 = np.zeros([nel])
el3 = np.zeros([nel])

for i in range(0,npo):
    dummy = fileName.readline().split()
    xp[i] = float(dummy[0])
    yp[i] = float(dummy[1])
    zp[i] = float(dummy[2])
    # print(i,xp[i],yp[i],zp[i])
for i in range(0,nel):
    dummy = fileName.readline().split()
    el1[i] = int(dummy[0])
    el2[i] = int(dummy[1])
    el3[i] = int(dummy[2])


fig2 = plt.figure()
ax2 = fig2.add_subplot(111, projection='3d')
for i in range(0,nel):
    x1 = xp[int(el1[i])-1]
    y1 = yp[int(el1[i])-1]
    z1 = zp[int(el1[i])-1]
    
    x2 = xp[int(el2[i])-1]
    y2 = yp[int(el2[i])-1]
    z2 = zp[int(el2[i])-1]

    x3 = xp[int(el3[i])-1]
    y3 = yp[int(el3[i])-1]
    z3 = zp[int(el3[i])-1]

    xarr = [x1,x2,x3,x1]
    yarr = [y1,y2,y3,y1]
    zarr = [z1,z2,z3,z1]
    
  
    verts = [list(zip(xarr,yarr,zarr))]
    ax2.add_collection3d(Poly3DCollection(verts))

ax2.set_xbound(0,1)
ax2.set_ybound(0,1)
ax2.set_zbound(0,3)

Буду признателен за ваше мнение.

1 Ответ

1 голос
/ 10 июля 2020

Функция plo_trisurf делает именно то, что вы хотите.

  • x, y, z - это узлы ваших треугольников
  • tri содержит индексы узлов вашего треугольника

Небольшой пример:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x = np.array([0, -1, 1, 1])
y = np.array([0, 1, -1, 1])
z = np.array([0, 1, 1, -1])

tri = np.array([[0, 1, 2],
                [0, 1, 3],
                [0, 2, 3]])

fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_trisurf(x, y, z, triangles=tri)

Пример трисёрфа

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