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

修正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()

核心修改点

  1. 初始位置校准:前两个方块设置为(0,0)和(1,0),确保水平紧密贴合,作为螺旋的起始基准。
  2. 方向循环逻辑:新增placement_dirs数组,严格按照「下、右、上、左」的顺序循环放置后续方块,匹配目标螺旋的缠绕方向。
  3. 位置偏移计算:每个方向的方块位置都基于已有方块的边缘尺寸计算,确保新方块完全贴合已有结构,不会出现错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:17:04