修正R语言中斐波那契螺旋方块对齐以实现正确螺旋结构
修正斐波那契螺旋方块对齐问题
原代码的问题出在初始位置未贴合螺旋结构的中心逻辑,且后续方块的放置方向循环错误,导致整体错位。以下是修正后的完整代码,完全匹配你要的「前两个水平对齐,后续按下方、右侧、上方、左侧循环放置」的效果:
# 确保ggplot2已安装并加载 if (!requireNamespace("ggplot2", quietly = TRUE)) { install.packages("ggplot2") } library(ggplot2) # 生成斐波那契序列 fibonacci <- function(n) { fib_seq <- numeric(n) fib_seq[1:2] <- 1 for (i in 3:n) { fib_seq[i] <- fib_seq[i-1] + fib_seq[i-2] } fib_seq } fib_seq <- fibonacci(10) square_count <- length(fib_seq) # 初始化方块数据:存储每个方块的左下角坐标(x,y)和边长size squares <- data.frame( x = numeric(square_count), y = numeric(square_count), size = fib_seq ) # 前两个方块水平紧密对齐:第一个在(0,0),第二个接在其右侧 squares[1,] <- c(0, 0, fib_seq[1]) squares[2,] <- c(fib_seq[1], 0, fib_seq[2]) # 定义循环放置方向:下、右、上、左,按此顺序循环 placement_dirs <- c("down", "right", "up", "left") # 计算后续每个方块的位置 for (i in 3:square_count) { current_dir <- placement_dirs[(i - 3) %% 4 + 1] last_square <- squares[i-1,] second_last_square <- squares[i-2,] switch(current_dir, down = { # 下方方块:覆盖前两个方块的底部宽度,左下角x与第一个方块对齐,y向下偏移当前边长 squares[i, "x"] <- squares[1, "x"] squares[i, "y"] <- squares[1, "y"] - fib_seq[i] }, right = { # 右侧方块:覆盖前三个方块的右侧高度,左下角y向上偏移以贴合上方方块,x接在上一个方块右侧 squares[i, "x"] <- last_square$x + last_square$size squares[i, "y"] <- squares[1, "y"] - (fib_seq[i] - fib_seq[1]) }, up = { # 上方方块:覆盖前四个方块的顶部宽度,左下角x向左偏移以贴合左侧方块,y接在上一个方块顶部 squares[i, "x"] <- squares[1, "x"] - (fib_seq[i] - (last_square$x - squares[1, "x"])) squares[i, "y"] <- last_square$y + last_square$size }, left = { # 左侧方块:覆盖前五个方块的左侧高度,左下角x向左偏移当前边长,y向下偏移以贴合下方方块 squares[i, "x"] <- last_square$x - fib_seq[i] squares[i, "y"] <- squares[1, "y"] - (fib_seq[i] - (last_square$y - squares[1, "y"])) } ) } # 绘制方块并保持比例 ggplot(data = squares, aes(xmin = x, ymin = y, xmax = x + size, ymax = y + size)) + geom_rect(fill = "white", color = "black") + coord_fixed(ratio = 1) + theme_void()
核心修改点
- 初始位置校准:前两个方块设置为
(0,0)和(1,0),确保水平紧密贴合,作为螺旋的起始基准。 - 方向循环逻辑:新增
placement_dirs数组,严格按照「下、右、上、左」的顺序循环放置后续方块,匹配目标螺旋的缠绕方向。 - 位置偏移计算:每个方向的方块位置都基于已有方块的边缘尺寸计算,确保新方块完全贴合已有结构,不会出现错位。
内容的提问来源于stack exchange,提问作者Christy
相关产品推荐
相关产品推荐

