# 海龜繪圖：照字串畫線

正式網址：https://newmediaart.course.monolab.world/snippets/turtle-draw

一個 turtle(cmds, len, angle) 函式，讀一串指令照著走：F 前進畫線、+ 和 - 轉向、[ 記住位置、] 回到位置，改字串就改圖形。

- **分類**：自然的演算法
- **行數**：32 行（p5.js 1.x／2.x）
- **在哪一堂用到**：[第 3 堂](https://newmediaart.course.monolab.world/lesson/03)

只把最底下的 turtle() 整個複製進自己的 sketch，在 draw() 裡先 translate() 到出發點，再呼叫 turtle(字串, 步長, 角度)；字串裡的 [ ] 一定要成對。

```js
// 海龜繪圖：照字串畫。F 前進畫線，+ 右轉，- 左轉，[ 記住位置，] 回到位置
function setup() {
  createCanvas(640, 420);
}

function draw() {
  background(18, 25, 40);
  stroke(135, 218, 160);
  strokeWeight(2);
  push();
  translate(110, 150); // 海龜從這裡出發，預設朝右
  turtle('F+F+F+F+F', 110, 144); // 五角星：走一邊轉 144 度，共五次
  pop();
  push();
  translate(470, 400);
  rotate(-HALF_PI); // 先轉成朝上
  turtle('FF[+F[+F]-F][-F[-F]+F]', 40, 25); // 小樹：括號裡是分枝，畫完回到分岔點
  pop();
}

// 海龜：cmds 是指令字串，len 是每步長度，angle 是每次轉幾度
function turtle(cmds, len, angle) {
  for (let c of cmds) {
    if (c === 'F') {
      line(0, 0, len, 0);
      translate(len, 0); // 往前走一步：座標原點跟著海龜移動
    } else if (c === '+') rotate(radians(angle));
    else if (c === '-') rotate(-radians(angle));
    else if (c === '[') push(); // 記住現在的位置和方向
    else if (c === ']') pop(); // 回到上一次記住的地方
  }
}
```

## 同類常用指令・自然的演算法

- [L-System：規則換字長出一棵樹](https://newmediaart.course.monolab.world/snippets/lsystem-grow)
- [遞迴樹：branch 自己呼叫自己](https://newmediaart.course.monolab.world/snippets/recursive-branch)
- [Noise 年輪：接得起來的不規則圈](https://newmediaart.course.monolab.world/snippets/noise-ring)
- [Boid 三條規則：分離、對齊、聚合](https://newmediaart.course.monolab.world/snippets/boid-rules)

[回到全部常用指令](https://newmediaart.course.monolab.world/snippets)

[到 Hahow 報名](https://hahow.in/cr/creative-code)。價格與優惠以 Hahow 頁面為準。
