我有一个八叉树计算网格,如附图所示。
蓝色网格是边长为1的立方体,红色网格边长为0.5,绿色网格边长为0.25。每个网格的单元中心坐标如下所示。
细胞中心.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
现在,我想仅根据单元中心坐标自动计算每个网格的大小并可视化网格。我写了下面的Python代码,但是可视化结果不正确,如附件所示。
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()
如果您知道从单元中心坐标计算网格大小的任何算法或方法,我将非常感谢您的建议。预先感谢您。
好吧,再想一想,我可以想到一个自下而上的算法:
x[i]-x[j]
:您可以从八叉树的底层获得单元格的大小。n(8-1)
),以识别上层的单元,依此类推。这样,您将确定原始列表中每个单元格的大小。