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
相关产品推荐
相关产品推荐

