如何从单元格中心坐标找到网格大小

问题描述 投票:0回答:1

我有一个八叉树计算网格,如附图所示。

enter image description here

蓝色网格是边长为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()

enter image description here

如果您知道从单元中心坐标计算网格大小的任何算法或方法,我将非常感谢您的建议。预先感谢您。

algorithm computational-geometry octree
1个回答
0
投票

好吧,再想一想,我可以想到一个自下而上的算法:

  1. 确定两个单元格之间的最小距离
    x[i]-x[j]
    :您可以从八叉树的底层获得单元格的大小。
  2. 重新组合该层的八联体,并用其父单元格替换它们,其中父单元格的中心是 8 个坐标的平均值。
  3. 使用新的单元列表迭代该过程(由于步骤 2,其值应减少
    n(8-1)
    ),以识别上层的单元,依此类推。

这样,您将确定原始列表中每个单元格的大小。

© www.soinside.com 2019 - 2024. All rights reserved.