You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从三维索引列表中识别含孔洞长方体原点与尺寸的实现方案

三维索引列表的长方体拆分识别问题

需求说明

我持有一组三维索引列表,用来标记尺寸为 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:24:24