# Noise 年輪：接得起來的不規則圈

正式網址：https://newmediaart.course.monolab.world/snippets/noise-ring

一個 noiseRing(x, y, r, amp, k, z) 函式，用 noise 讓圓的半徑忽大忽小，起點跟終點接得起來；範例疊 30 圈變年輪，按 R 換一棵樹。

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

複製 noiseRing() 進自己的 sketch，先 noFill() 再呼叫；想畫年輪就用迴圈，每圈的 r 加大、z 加一點；k 越大越碎，amp 越大起伏越誇張。

```js
// Noise 年輪：每圈用 noise 擾動半徑，一圈一圈往外疊。按 R 換一組形狀
function setup() {
  createCanvas(640, 420);
  noiseSeed(1);
}

function draw() {
  background(30, 22, 18);
  noFill();
  strokeWeight(1.5);
  for (let i = 0; i < 30; i++) {
    stroke(lerpColor(color(240, 215, 170), color(105, 62, 32), i / 30)); // 淺到深
    // 半徑隨圈數變大；越外圈越不規則；z 用 i * 0.05：相鄰兩圈像、但不一樣
    noiseRing(width / 2, height / 2, 10 + i * 4.5, 6 + i * 0.9, 0.8, i * 0.05);
  }
}

function keyPressed() {
  if (key === 'r' || key === 'R') {
    noiseSeed(floor(random(99999)));
  }
}

// 畫一圈不規則的圈。x y 圓心，r 基本半徑，amp 起伏多大，k 起伏多碎，z 第三軸（換圈就換它）
function noiseRing(x, y, r, amp, k, z) {
  beginShape();
  for (let a = 0; a < TWO_PI; a += 0.05) {
    // 用 cos 和 sin 當 noise 的座標：走完一圈剛好回到起點，圈才接得起來
    let n = noise(cos(a) * k + 1, sin(a) * k + 1, z);
    let rr = r + n * amp;
    vertex(x + cos(a) * rr, y + sin(a) * rr);
  }
  endShape(CLOSE);
}
```

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

- [海龜繪圖：照字串畫線](https://newmediaart.course.monolab.world/snippets/turtle-draw)
- [L-System：規則換字長出一棵樹](https://newmediaart.course.monolab.world/snippets/lsystem-grow)
- [遞迴樹：branch 自己呼叫自己](https://newmediaart.course.monolab.world/snippets/recursive-branch)
- [Boid 三條規則：分離、對齊、聚合](https://newmediaart.course.monolab.world/snippets/boid-rules)

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

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