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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:18:20