PyVista ray_trace для структурированных сеток?

Что я хочу сделать

Для граничного метеорологического приложения на сложной местности я хотел бы проверить, попадает ли солнечный луч на топографию, чтобы рассматриваемая ячейка была затенена (см. фото).

Что я сделал и в чем проблема

В PyVista есть облегченная процедура трассировки лучей, идеальный шаблон для моих нужд. Его можно найти здесь и здесь. Эти примеры основаны на sphere = pv.Sphere().

Но я использую структурированную сетку myMesh = pv.StructuredGrid(), и появляется сообщение об ошибке: AttributeError: 'StructuredGrid' object has no attribute 'ray_trace'

Мой вопрос

Есть ли обходной путь, позволяющий использовать PyVista.ray_trace со структурированной сеткой?

Если у вас есть двухмерная структурированная сетка с размерами (n, m, 1), как кажется, вы можете вызвать extract_surface() на своей сетке, чтобы превратить ее в PolyData без потери информации.

Andras Deak -- Слава Україні 19.05.2024 01:23

@Андрас Деак -- Слава Украины : Большое СПАСИБО! Это сделало свою работу.

pyano 22.05.2024 13:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря подсказке @Andras Deak -- Слава Украины мне удалось найти решение.

Поскольку я потратил на это некоторое время, привожу всю часть кода. Возможно, кому-то это тоже будет полезно.

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() кажется очень быстрым (графический дисплей, зависящий от оборудования, использует больше ресурсов).

Другие вопросы по теме