Я работаю над плагином в QGIS, который создает 3d модель из растровых данных. В этом случае мне нужно создать триангуляцию только в вертикальной плоскости (без соединения вертикальных граней с соседними точками).
Это мой код и пример с текущим эффектом.
def delaunay_ogolny(self):
import math
X=[]
Y=[]
Z=[]
for x in self.listqa:
dada=x[0]
X.append(dada)
uu=x[1]
Y.append(uu)
dede=x[2]
Z.append(dede)
u = np.array(X)
v = np.array(Y)
x = u
y = v
z = np.array(Z)
#Delaunay
tri = Delaunay(np.array([u, v]).T,qhull_options="QJn") #,furthest_site=True #i put there QJn option
#tri=Delaunay(self.listqa)
self.faces = []
self.points = []
for vert in tri.simplices:
self.faces.append([vert[0], vert[1], vert[2]])
#print(self.faces)
for i in range(x.shape[0]):
self.points.append([x[i], y[i], z[i]])
#print(self.points)
return self.faces, self.points
После функции Делоне я создаю файл stl из точек и граней. Ниже то, что мне нужно, но алгоритм работает правильно только тогда, когда я получил одну прямую линию. Мне это нужно для всех точек.
EDIT1: @ Ripi2
Я попробовал вашу идею, но она не сработала.
Это мой код итеративной функции, где я перебираю все пиксели, и когда у пикселя есть значение, мой алгоритм добавляет его в список. После этого я использую этот список в триангуляции Делоне.
Это код:
def iterator_shape(self):
#selectedLayerIndex = self.dlg.comboBox.currentIndex()
path=os.path.join(r'default\python\plugins\print_your_3d\TRASH\shape_to_raster.tif')
layer = iface.addRasterLayer(sciezka, "qtaz")
provider = layer.dataProvider()
extent = provider.extent()
rows = layer.height()
cols = layer.width()
block = provider.block(1, extent, cols, rows)
xmin = extent.xMinimum()
ymax = extent.yMaximum()
xsize = layer.rasterUnitsPerPixelX()
ysize = layer.rasterUnitsPerPixelY()
k=1
xinit = xmin + xsize / 2
yinit = ymax - ysize / 2
self.listqa = []
for i in range(rows):
for j in range(cols):
x = xinit + j * xsize
y = yinit
k += 1
if block.value(i, j) == -3.4028234663852886e+38:
continue
elif block.value(i,j)>=self.dlg.doubleSpinBox.value():
self.listqa.append([x, y, block.value(i, j)])
self.listqa.append([x,y,block.value(i,j)-1])
self.listqa.append([x,y+0.01,block.value(i,j)-1]) # @Ridi2 you mean that?
xinit = xmin + xsize / 2
yinit -= ysize
return self.listqa
Это пример растра, который я хотел бы преобразовать в 3D STL MODEL. 1 пиксель имеет значения X, Y и высоты (в коде это block.value)
Edit2: мне нужно сделать грани между ними. Это лучшая визуализация, сделанная в ArcScene.