从三维索引列表中识别含孔洞长方体原点与尺寸的实现方案
三维索引列表的长方体拆分识别问题
需求说明
我持有一组三维索引列表,用来标记尺寸为 nx, ny, nz = 35, 35, 45 的三维定义域内,一个或多个长方体覆盖的位置。
我需要从这组索引中计算出所有长方体的原点坐标和对应尺寸,退而求其次也可以输出任意一种可行的长方体拆分分布方案,即所有长方体拼接后恰好覆盖所有索引点、无重叠、无遗漏排除孔洞区域。
现有实现效果
针对无孔洞的长方体索引数据集,现有代码可以正确识别出全部2个长方体,输出结果如下:
origin : (0, 3, 3) size: (3, 29, 39) origin : (22, 11, 9) size: (3, 13, 27)
对应实现代码:
bounds = [_np.unique([0, *(_np.where(abs(_np.diff(pcc[:, i], axis=0)) > 1)[0] + 1), pcc.shape[0]]) for i in range(3)] #print(bounds) while all(len(b) > 1 for b in bounds): x = [(k, len(list(g))) for k, g in _it.groupby(pcc[bounds[0][0]:bounds[0][1], 0])] y = [(k, len(list(g))) for k, g in _it.groupby(pcc[bounds[1][0]:bounds[1][1], 1])] z = [(k, len(list(g))) for k, g in _it.groupby(pcc[bounds[2][0]:bounds[2][1], 2])] #print('x:', x) #print('y:', y) #print('z:', z) origin = x[0][0], y[0][0], z[0][0] size = len(x), len(y), len(z) print(f'origin : {origin}\nsize: {size}\n') bounds = [b[int(_np.argwhere(b == bounds[0][1])):] for b in bounds]
存在的缺陷
现有代码无法处理长方体内部带孔洞的场景:如果长方体中部存在孔洞,需要将带孔区域拆分为4个环绕孔洞的实心长方体,才能准确描述覆盖范围,但现有代码会输出错误的识别结果。
用带孔洞的长方体索引数据集测试时,代码输出如下错误结果:
origin : (0, 3, 3) size: (3, 29, 39) origin : (22, 8, 3) size: (3, 19, 28)
上述结果的问题在于,识别出的第二个长方体内部包含未被索引覆盖的孔洞区域,不符合实心长方体的要求。
调试过程中发现,孔洞位置在x、y、z三个维度的索引统计中都存在明显的不连续特征,但暂时没有找到简洁高效的方案,适配这类带孔洞的长方体识别拆分场景。
内容的提问来源于stack exchange,提问作者Ipse Lium
相关产品推荐
相关产品推荐

