R语言查找六边形网格相邻六边形坐标组合的实现方法
R语言六边形网格相邻坐标最优实现方案

你推导的结论成立:任意坐标为(x,y)的六边形,相邻格一定落在x∈{x-1,x,x+1}、y∈{y-1,y,y+1}的3*3组合范围内,但不需要先生成全组合再筛选,直接基于网格偏移规则预定义偏移量一步生成邻点,是效率最高的实现方式,时间复杂度为O(1),批量处理大规模坐标也无性能压力。
实现逻辑
示意图采用通用的**偶数行右偏移(even-r offset)**六边形坐标规则,邻接偏移量随当前点所在行的奇偶性变化:
- 若当前点y坐标为偶数,6个邻点相对当前点的偏移为:
(-1,0)、(0,-1)、(1,-1)、(1,0)、(1,1)、(0,1) - 若当前点y坐标为奇数,6个邻点相对当前点的偏移为:
(-1,0)、(-1,-1)、(0,-1)、(1,0)、(0,1)、(-1,1)
代码实现
get_hex_neighbors <- function(x, y) { # 根据行奇偶性匹配偏移规则 if (y %% 2 == 0) { offset_mat <- matrix(c( -1, 0, 0, -1, 1, -1, 1, 0, 1, 1, 0, 1 ), ncol = 2, byrow = TRUE) } else { offset_mat <- matrix(c( -1, 0, -1, -1, 0, -1, 1, 0, 0, 1, -1, 1 ), ncol = 2, byrow = TRUE) } # 返回邻点坐标数据框 data.frame( x = x + offset_mat[,1], y = y + offset_mat[,2] ) }
用法示例
# 单个点查询:获取坐标(2,2)的所有邻点 get_hex_neighbors(x = 2, y = 2) # x y # 1 1 2 # 2 2 1 # 3 3 1 # 4 3 2 # 5 3 3 # 6 2 3 # 批量查询:对坐标表中所有点批量生成邻点 point_df <- data.frame(x = c(1, 3, 2), y = c(1, 3, 2)) neighbor_list <- mapply(get_hex_neighbors, x = point_df$x, y = point_df$y, SIMPLIFY = FALSE) all_neighbors <- do.call(rbind, neighbor_list)
如果你使用的是奇数行偏移的六边形网格,只需要把代码中奇偶分支的偏移矩阵互换即可,不需要修改其他逻辑。
内容的提问来源于stack exchange,提问作者locket
相关产品推荐
相关产品推荐

