
Синяя сетка представляет собой куб с длиной стороны 1, красная сетка имеет длину стороны 0,5, а зеленая сетка имеет длину стороны 0,25. . Координаты центров ячеек для каждой сетки указаны ниже.
cellcenters.csv
Код: Выделить всё
0.5,0.5,0.5
0.5,1.5,0.5
1.5,1.5,0.5
1.5,0.5,0.5
0.5,0.5,1.5
0.5,1.5,1.5
1.5,1.5,1.5
1.5,0.5,1.5
1.25,0.25,1.25
1.25,0.25,1.75
1.25,0.75,1.25
1.25,0.75,1.75
1.75,0.25,1.25
1.75,0.25,1.75
1.75,0.75,1.25
1.75,0.75,1.75
1.125,0.125,1.125
1.125,0.125,1.375
1.125,0.375,1.125
1.125,0.375,1.375
1.375,0.125,1.125
1.375,0.125,1.375
1.375,0.375,1.125
1.375,0.375,1.375
Код: Выделить всё
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import cKDTree
file_path = 'cellcenters.csv'
cell_centers_df = pd.read_csv(file_path, header=None, names=['x', 'y', 'z'])
def plot_cell_boundaries(ax, boundaries, color='b', label=None):
for boundary in boundaries:
x_min, x_max, y_min, y_max, z_min, z_max = boundary
ax.plot([x_min, x_max], [y_min, y_min], [z_min, z_min], color=color)
ax.plot([x_min, x_max], [y_max, y_max], [z_min, z_min], color=color)
ax.plot([x_min, x_max], [y_min, y_min], [z_max, z_max], color=color)
ax.plot([x_min, x_max], [y_max, y_max], [z_max, z_max], color=color)
ax.plot([x_min, x_min], [y_min, y_max], [z_min, z_min], color=color)
ax.plot([x_max, x_max], [y_min, y_max], [z_min, z_min], color=color)
ax.plot([x_min, x_min], [y_min, y_max], [z_max, z_max], color=color)
ax.plot([x_max, x_max], [y_min, y_max], [z_max, z_max], color=color)
ax.plot([x_min, x_min], [y_min, y_min], [z_min, z_max], color=color)
ax.plot([x_max, x_max], [y_min, y_min], [z_min, z_max], color=color)
ax.plot([x_min, x_min], [y_max, y_max], [z_min, z_max], color=color)
ax.plot([x_max, x_max], [y_max, y_max], [z_min, z_max], color=color)
kdtree = cKDTree(cell_centers_df[['x', 'y', 'z']])
distances, indices = kdtree.query(cell_centers_df[['x', 'y', 'z']], k=2)
cell_sizes = distances[:, 1] / 2
def calculate_variable_size_cell_boundaries(df, sizes):
cell_boundaries = []
for i, row in df.iterrows():
x_center, y_center, z_center = row['x'], row['y'], row['z']
cell_size = sizes[i]
x_min, x_max = x_center - cell_size, x_center + cell_size
y_min, y_max = y_center - cell_size, y_center + cell_size
z_min, z_max = z_center - cell_size, z_center + cell_size
cell_boundaries.append([x_min, x_max, y_min, y_max, z_min, z_max])
return np.array(cell_boundaries)
variable_cell_boundaries = calculate_variable_size_cell_boundaries(cell_centers_df, cell_sizes)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
plot_cell_boundaries(ax, variable_cell_boundaries, color='b')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('Cell Boundaries (Wrong)')
plt.show()

Если вам известен какой-либо алгоритм или метод расчета размера сетки по координатам центра ячейки, я был бы очень признателен за ваш совет. Заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/790 ... oordinates