调用Delaunay4Points出现下标越界错误,是否为Bug?
分析
DatabionicSwarm中Delaunay4Points函数的下标越界错误 首先直接给出结论:这大概率是DatabionicSwarm包中Delaunay4Points函数的Bug。下面拆解原因和验证过程:
问题复现与错误本质
你构建的是一组合法的无重复3D点集:
v <- rbind( c( -5, -5, 16 ), c( -5, 8, 3 ), c( 4, -1, 3 ), c( 4, -5, 7 ), c( 4, -1, -10 ), c( 4, -5, -10 ), c( -5, 8, -10 ), c( -5, -5, -10 ) )
调用Delaunay4Points(v, IsToroid = FALSE)触发的subscript out of bounds错误,本质是函数内部索引处理逻辑出错:Uniq2DataInd向量中的索引值超出了UniqDelaunay矩阵的行列范围,导致无法正确完成矩阵子集化操作。
验证预期结果
你提到的邻接矩阵预期结果可以用其他成熟工具验证,比如用rgl包的delaunayn函数手动构建邻接关系:
library(rgl) # 计算Delaunay三角剖分 triangles <- delaunayn(v) # 初始化空的邻接矩阵 adj_matrix <- matrix(0, nrow = nrow(v), ncol = nrow(v)) # 遍历每个三角形,标记两两相邻的点 for (tri in 1:nrow(triangles)) { pts <- triangles[tri, ] adj_matrix[pts[1], pts[2]] <- 1 adj_matrix[pts[2], pts[1]] <- 1 adj_matrix[pts[1], pts[3]] <- 1 adj_matrix[pts[3], pts[1]] <- 1 adj_matrix[pts[2], pts[3]] <- 1 adj_matrix[pts[3], pts[2]] <- 1 } # 查看最终邻接矩阵 adj_matrix
运行这段代码得到的结果,和你描述的预期结构完全一致,说明你的输入点集完全可以正确计算Delaunay邻接关系,问题出在Delaunay4Points的实现上。
后续处理建议
由于该包没有公开的GitHub仓库提交Issue,你可以尝试:
- 通过CRAN包页面上的作者邮箱联系开发者,反馈这个具体的Bug场景;
- 用
rgl、deldir等包的相关函数替代Delaunay4Points,完成Delaunay三角剖分的邻接矩阵计算。
内容的提问来源于stack exchange,提问作者Stéphane Laurent
相关产品推荐
相关产品推荐

