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

R语言如何在5×5网格矩阵中随机绘制连续相邻点位

5×5网格随机连续点位绘制实现

核心实现逻辑:

  • 封装通用连续点位生成函数,支持指定连续点数量,随机选择水平/垂直排布方向,自动过滤超出网格边界的非法位置
  • 按顺序生成点位:先生成3个连续点的分组,生成2个连续点的分组时自动校验避开已占用的坐标,避免两组点位重叠
  • 完全复用原有静态代码的画布、网格、点样式参数,不需要调整原有绘图的视觉效果

完整可运行代码:

# 连续相邻点位生成函数
# 参数block_len: 单组连续点的数量,grid_size: 网格边长,occupied: 已被占用的点位坐标矩阵
generate_consecutive_block <- function(block_len, grid_size = 5, occupied = NULL) {
  repeat {
    # 随机选择排布方向:1为水平,2为垂直
    dir <- sample(1:2, 1)
    if (dir == 1) {
      # 水平排布:x轴连续,y轴固定
      x_start <- sample(1:(grid_size - block_len + 1), 1)
      y_pos <- sample(1:grid_size, 1)
      block_coords <- cbind(
        x = x_start:(x_start + block_len - 1),
        y = rep(y_pos, block_len)
      )
    } else {
      # 垂直排布:y轴连续,x轴固定
      y_start <- sample(1:(grid_size - block_len + 1), 1)
      x_pos <- sample(1:grid_size, 1)
      block_coords <- cbind(
        x = rep(x_pos, block_len),
        y = y_start:(y_start + block_len - 1)
      )
    }
    # 无已占用点位直接返回,否则校验无重叠再返回
    if (is.null(occupied)) return(block_coords)
    is_overlap <- any(apply(block_coords, 1, function(p) {
      any(p[1] == occupied[,1] & p[2] == occupied[,2])
    }))
    if (!is_overlap) return(block_coords)
  }
}

# 以下为绘图逻辑,和原有静态代码的样式完全一致
par(xaxs = "i", yaxs = "i")
plot.new()
plot.window(xlim = c(0.5, 5.5), ylim = c(0.5, 5.5))
grid(nx = 5, ny = 5, col = "black", lty = "dashed")
box(lwd = 1)

# 生成两组随机点位
pink_points <- generate_consecutive_block(3)
blue_points <- generate_consecutive_block(2, occupied = pink_points)

# 绘制点位
points(blue_points[,1], blue_points[,2], pch = 16, col = "blue", cex = 1.5)
points(pink_points[,1], pink_points[,2], pch = 16, col = "pink", cex = 1.5)

补充说明:如果需要允许两组点位出现重叠,只要在生成2个连续点的蓝色组时,去掉occupied = pink_points参数即可。每次运行代码都会得到位置、排布方向完全随机的合法点位结果。

内容的提问来源于stack exchange,提问作者Geek_Nerdy93

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:36:19