Что я хочу сделать
Для граничного метеорологического приложения на сложной местности я хотел бы проверить, попадает ли солнечный луч на топографию, чтобы рассматриваемая ячейка была затенена (см. фото).
Что я сделал и в чем проблема
В PyVista есть облегченная процедура трассировки лучей, идеальный шаблон для моих нужд. Его можно найти здесь и здесь. Эти примеры основаны на sphere = pv.Sphere().
Но я использую структурированную сетку myMesh = pv.StructuredGrid(), и появляется сообщение об ошибке: AttributeError: 'StructuredGrid' object has no attribute 'ray_trace'
Мой вопрос
Есть ли обходной путь, позволяющий использовать PyVista.ray_trace со структурированной сеткой?
@Андрас Деак -- Слава Украины : Большое СПАСИБО! Это сделало свою работу.






Благодаря подсказке @Andras Deak -- Слава Украины мне удалось найти решение.
pv.StructuredGrid(xx,yy,zz) не имеет ray_trace() функциональностиpv.PolyData(xyz) перекресток не распознается.pv.StructuredGrid(xx,yy,zz) с помощью mesh.ray_trace(): https://docs.pyvista.org/version/stable/examples/01-filter/extract-surface#extract-surface-example , https://docs.pyvista.org/version/stable/api/core/_autosummary/pyvista.datasetfilters.extract_surface. Это сработало для меня.mesh.extract_surface().triangulate() тоже можно использоватьПоскольку я потратил на это некоторое время, привожу всю часть кода. Возможно, кому-то это тоже будет полезно.
import numpy as np
import matplotlib.pyplot as plt
import pyvista as pv
#---- 1. define a ray
start = [0.0, 0.0, -1]
stop = [0.0, 0.0, 1]
ray = pv.Line(start, stop)
#---- 2. generate a 2-dimensional numpy grid (x,y,z)
nx, ny = 4, 4
ix = np.linspace(-1, 1, nx)
iy = np.linspace(-1, 1, ny)
xx, yy = np.meshgrid(ix, iy, indexing='ij')
zz = np.zeros_like(xx)
xyz = np.hstack((xx.reshape(-1,1),
yy.reshape(-1,1),
zz.reshape(-1,1)))
#---- 3. build the different pyvista data objects
cMesh = pv.PolyData(xyz) # cloud of data
sMesh = pv.StructuredGrid(xx,yy,zz) # structured data
eMesh = sMesh.extract_surface() # <<---- important MAGIC surface extracting
#---- 4. run the ray tracing/intersection
iPoints, ind = eMesh.ray_trace(start, stop, first_point=True) # Runing the ray tracing gives the intersection points
ipMesh = pv.PolyData(iPoints) # wrap the intersection points in a mesh
#---- 5. plot
p = pv.Plotter()
p.set_background('navy', top='teal')
p.add_mesh(ray, color = "orange", line_width=5) # add the ray
p.add_mesh(cMesh, color = "red", point_size=15) # add the data as a cloud
p.add_mesh(sMesh, color = "lightgrey", show_edges=True) # add the structured grid
p.add_mesh(ipMesh,color = "yellow", point_size=30) # add the computed intersetion points
p.camera.zoom(1.5)
p.show()
print('Intersection points:'); print(iPoints)
Обновлять
Вычисление ray_trace() кажется очень быстрым (графический дисплей, зависящий от оборудования, использует больше ресурсов).
Если у вас есть двухмерная структурированная сетка с размерами
(n, m, 1), как кажется, вы можете вызвать extract_surface() на своей сетке, чтобы превратить ее в PolyData без потери информации.