From 747fe0f7ee5da08a2285aa5a0701111fd9b16679 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:02:27 +0000 Subject: [PATCH 01/17] =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=E2=80=94=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=20=EC=97=B0=EA=B5=AC=2098=ED=8C=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 From 9756783dd5d41db66f0cc861f6fa45c19b569223 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:16:18 +0000 Subject: [PATCH 02/17] =?UTF-8?q?great-wave=2098=ED=8C=90:=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EC=99=80=20=EC=84=B8=EB=A1=9C=20=EA=B5=AC=EB=8F=84=20?= =?UTF-8?q?=EC=95=88=20=EB=84=B7=20=E2=80=94=20=EB=A6=AC=EA=B7=B8=201?= =?UTF-8?q?=EB=93=B1=EC=9D=80=20=EB=91=90=20=ED=8C=8C=EB=8F=84=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=20=EA=B3=A8=EC=97=90=20=ED=9B=84=EC=A7=80=EA=B0=80=20?= =?UTF-8?q?=EC=95=89=EB=8A=94=20=EC=95=88=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- .../pattern-study/craft/great-wave/brief.md | 21 ++++++++++++++++++ .../craft/great-wave/compose-98.png | Bin 0 -> 9840 bytes 2 files changed, 21 insertions(+) create mode 100644 incoming/pattern-study/craft/great-wave/brief.md create mode 100644 incoming/pattern-study/craft/great-wave/compose-98.png diff --git a/incoming/pattern-study/craft/great-wave/brief.md b/incoming/pattern-study/craft/great-wave/brief.md new file mode 100644 index 00000000..39038826 --- /dev/null +++ b/incoming/pattern-study/craft/great-wave/brief.md @@ -0,0 +1,21 @@ +slug: great-wave +작품: 3 + +# Great Wave + +가쓰시카 호쿠사이의 「가나가와 해변의 높은 파도 아래」(1831 무렵)예요. 「후가쿠 36경」 연작의 목판화이고, 원작은 `craft/masterpieces/ref/great-wave.jpg` 예요. + +11월 2일 98판에 작품 3 의 첫 그림으로 시작했어요. 「별이 빛나는 밤」은 Brushstrokes 가 있어서 고르지 않았고, 같이 도는 바퀴가 없어서 기법이 겹칠 그림도 없었어요. + +- 기법: 목판 여러 장을 맞춰 찍은 평면 색이에요. 색마다 판 하나라 한 구역 안은 한 색이고, 쪽빛 윤곽선(주판)이 밝은 모양을 둘러요. 하늘만 수평선 쪽으로 회색을 흐리게 찍었어요(보카시). 패턴은 판을 다시 찍지 않아요. 판 안의 물이 흘러요. 쪽빛 혀를 따라 흰 물방울이 마루 쪽으로 올라가고, 혀 사이 옅은 이음선이 일렁이고, 마루 끝 손톱이 오므렸다 펴지고, 떨어진 물보라가 후지산 위로 눈처럼 내려요. +- 구역: 크림 하늘과 수평선 쪽 회색 보카시 세 단, 왼쪽의 큰 파도(쪽빛 혀, 옅은 이음선, 흰 마루 테, 손톱), 오른쪽에서 솟는 둘째 너울, 두 파도 사이 골의 후지산(흰 눈머리, 쪽빛 몸), 골을 가로지르는 배와 사공, 맨 아래 후지산 꼴로 솟은 작은 앞 물결이에요. +- 색: 프러시안 블루 두 단(짙은 쪽빛 혀, 중간 쪽빛 이음선)과 옅은 물빛, 흰 물보라, 크림 하늘, 회색 보카시, 배의 살구색이에요. 채도는 쪽빛에 몰고 하늘과 배는 낮게 둬요. +- 세로로 다시 짠 방법: 원작의 큰 파도를 왼쪽 벽으로 세워 패널 꼭대기에서 오른쪽으로 말리게 하고, 원작 오른쪽의 둘째 너울을 오른쪽 아래에서 솟게 했어요. 두 파도가 만드는 V자 골 바닥에 후지산이 작게 앉아요. 파도 마루가 산을 내려누르는 크기 차이가 원작의 심장이라 그걸 세로 화면에 세웠어요. 구도 안 넷의 리그에서 이 안(안 4)이 1등이에요. + +노브 넷과 버튼이에요. + +- K1 빛: 범위 [0, 1]. 0 은 원작의 낮 하늘이에요. 올리면 하루가 흘러요. 1/3 은 새벽(분홍 하늘, 붉은 기 도는 산), 2/3 는 해 질 녘(주황 하늘, 붉은 후지), 1 은 달밤(쪽빛 하늘, 달빛에 뜬 물보라)이고, 그 사이는 이웃한 두 벌을 섞어요. +- K2 흐름: 범위 [0, 3]. 0 은 벽에 건 판화처럼 멈추고, 2 가 기본이에요. 물방울, 이음선, 손톱, 물보라, 배가 다 같은 시계로 빨라져요. +- K3 결: 범위 [0, 1]. 판에 판 선의 굵기예요. 0 은 원작처럼 가는 이음선과 잔 혀이고, 올리면 혀와 줄이 넓어져 굵은 칼 자국 판이 돼요. +- K4 부서짐: 범위 [0, 1]. 마루가 얼마나 세게 부서지는지예요. 바닥 근처(기본)는 원작처럼 손톱이 움켜쥔 채 물보라가 드문드문 떨어지고, 올리면 손톱이 더 멀리 뻗고 물보라가 후지산 위로 함박눈처럼 쏟아져요. +- 버튼: K1 탭은 파도가 덮치는 한 순간이에요. 손톱이 끝까지 뻗고 물보라가 한꺼번에 터져 골로 쏟아졌다가 가라앉아요. diff --git a/incoming/pattern-study/craft/great-wave/compose-98.png b/incoming/pattern-study/craft/great-wave/compose-98.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1dbd117c39c9f40703fee4a3649b8fd5c02f4a GIT binary patch literal 9840 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 wlMOL@PAegPbfsQ9O#;)fxqNV|$@ Date: Mon, 2 Nov 2026 17:20:59 +0000 Subject: [PATCH 03/17] =?UTF-8?q?great-wave=2098=ED=8C=90:=20=EB=91=90=20?= =?UTF-8?q?=ED=8C=8C=EB=8F=84=20=EC=82=AC=EC=9D=B4=20=EA=B3=A8=EC=9D=98=20?= =?UTF-8?q?=ED=9B=84=EC=A7=80=20=EC=9C=84=EB=A1=9C=20=EB=AC=BC=EB=B3=B4?= =?UTF-8?q?=EB=9D=BC=EA=B0=80=20=EB=82=B4=EB=A6=AC=EB=8A=94=20=EC=B2=AB=20?= =?UTF-8?q?=ED=8C=90=EC=9D=B4=20=EC=84=A0=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/README.md | 1 + .../pattern-study/craft/great-wave/log.md | 11 + incoming/pattern-study/patterns/great-wave.js | 467 ++++++++++++++++++ 3 files changed, 479 insertions(+) create mode 100644 incoming/pattern-study/craft/great-wave/log.md create mode 100644 incoming/pattern-study/patterns/great-wave.js diff --git a/incoming/pattern-study/README.md b/incoming/pattern-study/README.md index f1aaedca..61999d9d 100644 --- a/incoming/pattern-study/README.md +++ b/incoming/pattern-study/README.md @@ -21,6 +21,7 @@ | [Tollard](patterns/tollard.js) | 작품 2 | 무너진 종탑 계단을 백 년째 지키는 저주받은 갑옷 기사가 종 모양 청동 투구 아래로 미늘창을 세워 들고 숨 쉬다가, 머리 위로 치켜든 창을 허리 높이로 길게 내지르고 다시 머리 뒤로 젖혀 앞 바닥을 내려찍어요. | | [Ardith](patterns/ardith.js) | 작품 2 | 마을 묘지기 처녀가 이끼 녹색 두건 망토 차림으로 날개 달린 멧돼지 창을 세워 들고 숨 쉬다가, 창을 수평으로 내뻗어 돌진해 찌르고, 한 박 쉰 뒤 창을 머리 위로 들어 앞 땅에 꽂아 눌러요. | | [Kennick](patterns/kennick.js) | 작품 2 | 백작의 사냥개 우리를 지키다 늑대가 된 개지기가 끊어진 쇠 목줄을 단 채 몸을 앞으로 숙이고 숨 쉬다가, 두 앞발을 어깨 뒤로 젖혔다 몸을 던져 발톱으로 패널 끝까지 할퀴고, 한 박 쉰 뒤 머리를 어깨 밑으로 당겼다 턱을 벌려 앞을 물어요. | +| [Great Wave](patterns/great-wave.js) | 작품 3 | 호쿠사이의 큰 파도를 세로 패널에 목판화의 평면 색으로 다시 짜서, 왼쪽 벽으로 솟은 파도가 꼭대기에서 말려 흰 손톱을 늘어뜨리고, 두 파도 사이 골의 작은 후지산 위로 물보라가 눈처럼 내려요. | ## 추려 보기 diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md new file mode 100644 index 00000000..7e810fbb --- /dev/null +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -0,0 +1,11 @@ +상태: a 깎는 중 + +## 98판 (바퀴 96) · 길 a · 시작 995fd98 +- 정지 프레임 t=2 · 노브 [0, 2, 0, 0.06] +- 같이 도는 바퀴: 없음. 열린 패턴 바퀴 PR 은 이 바퀴 하나였어요. 앞 바퀴 PR 에 따를 창작자 글도 없어요(#356 의 MEMBER 글은 작품 2 로 바꾼 일이라 ROUND.md 에 이미 들어감) +- 그림 고르기: 「출처.md」 표에서 「별이 빛나는 밤」 다음 줄의 큰 파도. 기법은 판화의 평면 색과 선 +- 리그(첫 바퀴만, 큐레이터 렌즈, 원작과 함께): 안 4 2.5승 · 안 1 1.5승 · 안 2 1승 · 안 3 1승 → 길 a 안 4, 길 b 안 1 +- 안 1~4(compose-98.png 왼쪽부터): 꼭대기에서 말린 아치 밑 골 바닥에 후지, 마루를 화면 위 2/3 로 키우고 후지를 오른쪽 아래 구석에, 하늘을 위로 크게 두고 파도를 가운데로 내린 원작 비율, 왼쪽 벽 파도와 오른쪽에서 솟는 둘째 너울 사이 V자 골에 후지 +- 리그 판정 말: 안 4 「두 물결 사이 골에 후지가 작게」 · 안 1 「물마루가 위 가장자리까지 솟고 발톱이 후지 위로 덮침」 · 안 2 「파도가 후지를 압도하는 크기 대비」, 「위쪽을 꽉 채운 돔이라 갈고리가 사라짐」 · 안 3 「위쪽 40% 가 원작에 없는 빈 하늘」 +- 만들기: 파도는 등과 얼굴 두 곡선으로 잡고, 얼굴에서 떨어진 거리로 쪽빛 혀와 옅은 이음선을 나눔. 손톱은 처음에 손바닥 원과 손가락 셋으로 찍었더니 흰 덩어리로 뭉쳐서, 마루 아랫면을 따라 5 칸마다 끝이 굽은 손가락 하나와 짧은 곁가지로 바꿈. 물보라 방울이 LED 모서리를 한 프레임씩 스쳐 한 프레임 깜빡임이 149 개라, 방울이 한 줄 내려갈 때만 옆으로 옮기게 해서 5 개로 줄임. K4 가 0.0093 으로 검사를 못 넘어 부서질수록 혀의 흰 물방울과 너울 마루의 거품이 늘게 함 +- 선 판: 16색 · 노브 K1 0.34 · K2 0.07 · K3 0.08 · K4 0.04 · 한 프레임 깜빡임 5 diff --git a/incoming/pattern-study/patterns/great-wave.js b/incoming/pattern-study/patterns/great-wave.js new file mode 100644 index 00000000..7cf798a5 --- /dev/null +++ b/incoming/pattern-study/patterns/great-wave.js @@ -0,0 +1,467 @@ +// ===== Patternflow pattern ===== +// Title: Great Wave +// Family: print +// Idea: Hokusai's great wave stood up on the tall panel as a woodblock print in flat colours: the wave rises as a wall up the left edge and curls over at the top, its claws of foam hanging over the trough, a second swell climbs in from the lower right, and small Mount Fuji sits in the V between them under a grey band of sky. The blocks stay put and the water in them runs: white flecks ride up the dark tongues, the pale seams between them sway, the claws open and close, spray drifts down over the mountain like snow, and the boat rides the swell. +// Author: patternflow-lab +// Date: 2026-11-02 +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Lineage: after Katsushika Hokusai's Under the Wave off Kanagawa (about 1831), cut again for a tall panel as flat colour blocks with an indigo key line +// Round: 98 +// =============================== +// @matrix 64x128 +// @knobs Light=0..1, Flow=0..3, Grain=0..1, Break=0..1 +// +// Knob 1: Light. The time of day: 0 is the print's own cream daylight, 1/3 a pink dawn, 2/3 an orange dusk with a red mountain, 1 a moonlit night in indigo; between them two neighbouring printings are mixed. +// Knob 2: Flow. How fast the water in the blocks runs, the flecks, the seams, the claws, the spray and the boat on one clock: 2 is as cut, 0 stops it like a print on the wall. +// Knob 3: Grain. How broad the cutter's lines are: 0 keeps the print's fine seams and narrow tongues, 1 widens tongues and stripes into bold gouges. +// Knob 4: Break. How hard the crest breaks: near the bottom the claws keep their grip and spray falls now and then; turned up, they reach further and spray pours over the mountain. +// Buttons: K1 tap is the moment the wave comes down: every claw reaches out at once and a burst of spray falls into the trough, then the sea settles. + +const W = 64; +const H = 128; +const N = W * H; + +// Blocks. Each is one colour in each printing below. +const SKY = 0; +const SKY2 = 1; +const SKY3 = 2; +const SKY4 = 3; +const DEEP = 4; +const MID = 5; +const PALE = 6; +const FOAM = 7; +const LINE = 8; +const BOAT = 9; +const BOATD = 10; +const ROWER = 11; +const HEAD = 12; +const FUJI = 13; +const SNOW = 14; +const SPRAY = 15; + +// Four printings of the same blocks, in block order: day (the print's own), +// dawn, dusk and night. Light walks through them. +const PRINTINGS = [ + [ + [228, 218, 190], [206, 200, 180], [172, 168, 154], [134, 132, 124], + [24, 50, 108], [62, 108, 164], [158, 190, 204], [242, 240, 228], + [22, 32, 66], [228, 190, 140], [168, 122, 86], [34, 52, 98], + [232, 222, 196], [62, 84, 120], [246, 246, 238], [250, 250, 244], + ], + [ + [236, 202, 196], [222, 178, 182], [186, 150, 166], [142, 118, 142], + [34, 46, 112], [84, 104, 172], [178, 182, 216], [246, 234, 236], + [30, 28, 72], [234, 182, 152], [170, 112, 98], [44, 46, 104], + [238, 214, 206], [126, 74, 106], [250, 236, 236], [252, 242, 244], + ], + [ + [238, 178, 112], [222, 148, 92], [186, 114, 78], [142, 84, 68], + [24, 42, 92], [72, 92, 142], [192, 172, 170], [250, 228, 198], + [28, 24, 54], [238, 172, 112], [172, 102, 64], [36, 40, 84], + [244, 206, 166], [176, 64, 46], [250, 222, 192], [252, 236, 214], + ], + [ + [36, 50, 104], [48, 60, 112], [62, 72, 120], [78, 86, 128], + [16, 30, 76], [42, 72, 132], [112, 142, 172], [204, 216, 232], + [8, 12, 30], [152, 132, 112], [100, 84, 74], [20, 30, 66], + [176, 176, 184], [44, 56, 90], [212, 222, 238], [224, 232, 246], + ], +]; + +// The cut, on the panel's LEDs. The great wave: its back from the foot of +// the panel up over the crest to the lip, then its face from the lip back +// down to the foot. The second swell's crest, from off the right edge down +// to the foot. The small wave in front, shaped like the mountain. The boat. +const HORIZON = 97; +const MOUNT = [31, 87, 1.5, 4]; +const BACK = [[-6, 128], [-4, 90], [0, 56], [8, 30], [18, 14], [30, 8], [42, 10], [50, 18], [52, 28], [48, 35]]; +const FACE = [[48, 35], [45, 28], [40, 23], [32, 23], [24, 29], [18, 41], [14, 58], [13, 80], [15, 104], [18, 128], [22, 140]]; +const CREST = 30; +const SWELL = [[70, 72], [62, 77], [54, 85], [46, 97], [39, 112], [33, 128], [30, 140]]; +const FRONT = [[4, 140], [12, 124], [19, 113], [24, 108], [29, 112], [35, 121], [42, 140]]; +const HULL = [17, 104, 43, 99]; + +// Where the pale seams between the dark tongues lie, across the wave from its face. +const SEAMS = [3.2, 6.8, 9.6, 13.4, 16.6, 20.4, 23.6, 27.2, 30.8, 34.4, 38]; + +function hash(a, b) { + let h = Math.imul(a, 374761393) ^ Math.imul(b, 668265263); + h = Math.imul(h ^ (h >>> 13), 1274126177); + return ((h ^ (h >>> 16)) >>> 0) / 4294967296; +} + +// A curve through the cut's points, sampled every half LED. +const STEP = 0.5; +function spline(pts) { + const out = []; + for (let i = 0; i < pts.length - 1; i++) { + const p0 = pts[Math.max(0, i - 1)]; + const p1 = pts[i]; + const p2 = pts[i + 1]; + const p3 = pts[Math.min(pts.length - 1, i + 2)]; + const n = Math.max(2, Math.ceil(Math.hypot(p2[0] - p1[0], p2[1] - p1[1]) / STEP)); + for (let j = 0; j < n; j++) { + const t = j / n; + const f = (a, b, c, d) => 0.5 * (2 * b + (c - a) * t + (2 * a - 5 * b + 4 * c - d) * t * t + (3 * b - a - 3 * c + d) * t * t * t); + out.push([f(p0[0], p1[0], p2[0], p3[0]), f(p0[1], p1[1], p2[1], p3[1])]); + } + } + out.push(pts[pts.length - 1].slice()); + return out; +} + +function inside(poly, x, y) { + let c = false; + for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) { + const a = poly[i]; + const b = poly[j]; + if (a[1] > y !== b[1] > y && x < ((b[0] - a[0]) * (y - a[1])) / (b[1] - a[1]) + a[0]) c = !c; + } + return c; +} + +// The nearest sample of a curve to (x, y): its index and the distance. +const NEAR = [0, 0]; +function nearest(curve, x, y) { + let bi = 0; + let bd = 1e9; + for (let i = 0; i < curve.length; i++) { + const dx = curve[i][0] - x; + const dy = curve[i][1] - y; + const d = dx * dx + dy * dy; + if (d < bd) { + bd = d; + bi = i; + } + } + NEAR[0] = bi; + NEAR[1] = Math.sqrt(bd); + return NEAR; +} + +// Unit normals along a curve, each pointing out of the shape it bounds. +function normals(curve, poly) { + const out = []; + for (let i = 0; i < curve.length; i++) { + const a = curve[Math.max(0, i - 1)]; + const b = curve[Math.min(curve.length - 1, i + 1)]; + const l = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1; + let nx = -(b[1] - a[1]) / l; + let ny = (b[0] - a[0]) / l; + if (inside(poly, curve[i][0] + nx * 1.5, curve[i][1] + ny * 1.5)) { + nx = -nx; + ny = -ny; + } + out.push([nx, ny]); + } + // At the very end of a curve the test above can land on the wrong side. + out[0] = out[3].slice(); + out[1] = out[3].slice(); + return out; +} + +// Zones of the cut. +const Z_SKY = 0; +const Z_SEA = 1; +const Z_SWELL = 2; +const Z_FRONT = 3; +const Z_WAVE = 4; + +export function setup(params) { + const P = params; + P.base = new Uint8Array(N); + P.zone = new Uint8Array(N); + P.along = new Float32Array(N); + P.across = new Float32Array(N); + P.back = new Float32Array(N); + P.frame = new Uint8Array(N); + P.lined = new Uint8Array(N); + P.rgb = new Float32Array(48); + const back = spline(BACK); + const face = spline(FACE); + const wave = back.concat(face.slice(1)); + const swell = spline(SWELL); + const swellPoly = swell.concat([[SWELL[SWELL.length - 1][0], 200], [80, 200]]); + const front = spline(FRONT); + const frontPoly = front.concat([[FRONT[FRONT.length - 1][0], 200], [FRONT[0][0], 200]]); + P.face = face; + P.faceN = normals(face, wave); + P.swell = swell; + P.swellN = normals(swell, swellPoly); + P.front = front; + P.frontN = normals(front, frontPoly); + P.peak = nearest(front, FRONT[3][0], FRONT[3][1])[0] * STEP; + const [fx, fy, fs, snow] = MOUNT; + for (let y = 0; y < H; y++) { + for (let x = 0; x < W; x++) { + const p = y * W + x; + const cx = x + 0.5; + const cy = y + 0.5; + let v; + let zone = Z_SKY; + if (y >= HORIZON) { + // The trough: indigo water with darker streaks lying along it. + v = hash(Math.floor((x + 0.6 * (y - HORIZON)) / 5), y) < 0.35 || y === HORIZON ? DEEP : MID; + zone = Z_SEA; + } else { + // The bokashi: the sky greys in three steps down to the horizon. + const d = HORIZON - y; + v = d <= 3 ? SKY4 : d <= 8 ? SKY3 : d <= 15 ? SKY2 : SKY; + } + if (y >= fy && y < HORIZON) { + const half = (y - fy + 0.5) * fs; + if (Math.abs(cx - fx) < half) v = y - fy < snow + 1.5 * Math.sin(cx * 1.7) + (Math.abs(cx - fx) < 2 ? 1 : 0) ? SNOW : FUJI; + } + if (inside(swellPoly, cx, cy)) { + zone = Z_SWELL; + const n = nearest(swell, cx, cy); + P.along[p] = n[0] * STEP; + P.across[p] = n[1]; + } + if (inside(frontPoly, cx, cy)) { + zone = Z_FRONT; + const n = nearest(front, cx, cy); + P.along[p] = n[0] * STEP; + P.across[p] = n[1]; + } + if (inside(wave, cx, cy)) { + zone = Z_WAVE; + const n = nearest(face, cx, cy); + P.along[p] = n[0] * STEP; + P.across[p] = n[1]; + P.back[p] = nearest(back, cx, cy)[1]; + } + P.base[p] = v; + P.zone[p] = zone; + } + } + // Claws: along the great wave's lip, along the top of the swell, and on + // the small wave's peak, as [curve, sample, length, side]. + P.claws = []; + for (let s = 0.5; s < CREST; s += 5) P.claws.push([0, Math.round(s / STEP), 6.5 * (1.25 - (0.6 * s) / CREST) * (P.claws.length % 2 ? 0.8 : 1), 1]); + for (let s = 9; s < 24; s += 4) P.claws.push([1, Math.round(s / STEP), 3.2, -1]); + for (const s of [-3.5, 0, 3.5]) P.claws.push([2, Math.round((P.peak + s) / STEP), 2.6, s < 0 ? -1 : 1]); + P.spray = []; + P.t = 0; + P.flow = 2; + P.grain = 0; + P.brk = 0.06; + P.light = 0; + P.crash = 0; + P.debt = 0; + P.started = false; +} + +function curveOf(P, c) { + return c === 0 ? [P.face, P.faceN] : c === 1 ? [P.swell, P.swellN] : [P.front, P.frontN]; +} + +// Where a claw's fingertip is now, for the spray to fall from. +function tip(P, i, out) { + const [c, j, len] = P.claws[i]; + const [curve, nr] = curveOf(P, c); + out[0] = curve[j][0] + nr[j][0] * len; + out[1] = curve[j][1] + nr[j][1] * len + 1; +} + +const TIP = [0, 0]; +function spawn(P, burst) { + const n = P.claws.length; + // Most spray leaves the great wave's lip. + let i = Math.floor(Math.random() * n); + if (P.claws[i][0] !== 0 && Math.random() < 0.7) i = Math.floor(Math.random() * 8); + tip(P, i, TIP); + const x = Math.floor(TIP[0] + (Math.random() - 0.5) * 2); + P.spray.push([x, TIP[1], (Math.random() - 0.3) * (burst ? 5 : 2), burst ? 2 + Math.random() * 3 : Math.random(), x + 0.5]); +} + +function fall(P, dt) { + const g = 5; + const keep = []; + for (const s of P.spray) { + // A drop moves a whole LED at a time, and sideways only as it drops a + // row, so it never cuts the corner of an LED for a single frame. + s[3] = Math.min(s[3] + g * dt, 8); + s[4] += s[2] * dt + 1.2 * dt; + const row = Math.floor(s[1]); + s[1] += s[3] * dt; + if (Math.floor(s[1]) !== row) s[0] = Math.floor(s[4]); + const x = s[0]; + const y = Math.floor(s[1]); + if (x < 0 || x >= W || y >= H) continue; + if (y >= 0 && P.zone[y * W + x] !== Z_SKY && s[1] > 40) continue; + keep.push(s); + } + P.spray = keep; +} + +export function update(dt, input, params) { + const P = params; + const k = input.knobValues || [0, 2, 0, 0.06]; + dt = Math.min(dt, 0.1); + P.light = Math.max(0, Math.min(1, k[0])); + P.flow = Math.max(0, Math.min(3, k[1])); + P.grain = Math.max(0, Math.min(1, k[2])); + P.brk = Math.max(0, Math.min(1, k[3])); + if (input.btnPressed && input.btnPressed[0]) { + P.crash = 1; + for (let i = 0; i < 70; i++) spawn(P, true); + } + const step = dt * P.flow * 0.5; + if (!P.started) { + // The panel opens on a sea already moving: three seconds of spray. + P.started = true; + for (let i = 0; i < 90; i++) { + P.debt += 0.033 * (2 + 14 * P.brk); + while (P.debt >= 1) { + P.debt -= 1; + spawn(P, false); + } + fall(P, 0.033); + } + } + P.t += step * 2; + P.crash = Math.max(0, P.crash - dt * 0.5); + P.debt += step * (2 + 14 * P.brk + 20 * P.crash); + while (P.debt >= 1) { + P.debt -= 1; + spawn(P, false); + } + fall(P, step); +} + +function put(P, x, y, v) { + x = Math.floor(x); + y = Math.floor(y); + if (x >= 0 && x < W && y >= 0 && y < H) P.frame[y * W + x] = v; +} + +// The great wave: a foam rim along its back at the crest, then dark tongues +// with pale seams that sway along their length, and white flecks riding up +// them, more of them the harder it breaks; its face is pale low down and darker under the lip. +function wave(P, p) { + const s = P.along[p]; + const d = P.across[p]; + const g = 1 + P.grain * 0.9; + if (s < CREST + 6 && P.back[p] < 2.6 - s * 0.03) return FOAM; + if (d < 1.2) return s < CREST ? MID : PALE; + const w = d / g + 0.9 * Math.sin(s * 0.16 - P.t * 0.7); + for (let i = 0; i < SEAMS.length; i++) if (Math.abs(w - SEAMS[i]) < 0.55) return s > CREST * 2.2 && i < 2 ? PALE : MID; + if (hash(Math.floor((s + P.t * 3) / (1.1 * g)), Math.floor(d / (1.2 * g))) < 0.045 + 0.2 * P.brk) return FOAM; + return DEEP; +} + +// The swell and the small wave: pale water banded with dark stripes that +// run along them, a foam line on the crest, and a cap of foam on the small +// wave's peak like the mountain's snow. +function swell(P, p, front) { + const s = P.along[p]; + const d = P.across[p]; + if (d < 1.3 + 1.6 * P.brk) return FOAM; + if (front && d < 3.6 && Math.abs(s - P.peak) < 4 - d * 0.6) return FOAM; + const g = 1 + P.grain * 0.9; + const q = d / (5 * g) + 0.15 * Math.sin(s * 0.2 - P.t * 0.8); + const f = q - Math.floor(q); + return f < 0.3 ? DEEP : f < 0.45 ? MID : PALE; +} + +function boat(P) { + const [x0, y0, x1, y1] = HULL; + const bob = Math.round(0.9 * Math.sin(P.t * 0.6)); + const L = Math.hypot(x1 - x0, y1 - y0); + const ux = (x1 - x0) / L; + const uy = (y1 - y0) / L; + for (let s = 0; s <= L; s += 0.5) { + const x = x0 + ux * s; + const y = y0 + uy * s + bob; + put(P, x, y, BOAT); + put(P, x, y + 1, s < 1.5 || s > L - 1.5 ? BOATD : BOAT); + put(P, x, y + 2, BOATD); + // The rowers bent over their oars: a dark back and a pale head. + if (s > L * 0.14 && s < L * 0.86 && Math.floor(s) % 3 === 0) { + put(P, x, y - 1, ROWER); + put(P, x, y - 2, HEAD); + } + } +} + +// A claw: a finger of foam that reaches out from the crest and hooks back at +// the tip, with a shorter finger either side of it. +function claw(P, i) { + const [c, j, len0, side] = P.claws[i]; + const [curve, nr] = curveOf(P, c); + const [ax, ay] = curve[j]; + const [nx, ny] = nr[j]; + // Each claw opens and closes on its own beat, in steps of a fifth of a second. + const beat = Math.floor(P.t * 5) / 5; + const grow = 0.85 + 0.2 * Math.sin(beat * 0.6 + i * 1.7) + P.brk * 0.6 + P.crash * 0.6; + // The finger: two LEDs wide at the root, one at the end, hooking back. + const len = len0 * grow; + let ang = Math.atan2(ny, nx) - side * 0.5; + let x = ax - nx * 0.6; + let y = ay - ny * 0.6; + for (let s = 0; s < len + 0.6; s += 0.4) { + put(P, x, y, FOAM); + if (s < len * 0.45) put(P, x - Math.sin(ang) * side, y + Math.cos(ang) * side, FOAM); + ang += side * (s < len * 0.5 ? 0.02 : 0.17); + x += Math.cos(ang) * 0.4; + y += Math.sin(ang) * 0.4; + } + // A short finger on its far side. + ang = Math.atan2(ny, nx) - side * 1.3; + x = ax - nx * 0.3 - Math.sin(ang) * side; + y = ay - ny * 0.3 + Math.cos(ang) * side; + for (let s = 0; s < len * 0.4; s += 0.4) { + put(P, x, y, FOAM); + ang += side * 0.2; + x += Math.cos(ang) * 0.4; + y += Math.sin(ang) * 0.4; + } +} + +const LIGHT = (v) => v === FOAM || v === SNOW || v === BOAT || v === PALE || v === HEAD; + +export function draw(display, params) { + const P = params; + const fr = P.frame; + const zone = P.zone; + for (let p = 0; p < N; p++) { + const z = zone[p]; + fr[p] = z === Z_WAVE ? wave(P, p) : z === Z_SWELL ? swell(P, p, false) : z === Z_FRONT ? -1 : P.base[p]; + } + boat(P); + for (let p = 0; p < N; p++) if (zone[p] === Z_FRONT) fr[p] = swell(P, p, true); + for (let i = 0; i < P.claws.length; i++) claw(P, i); + // The key line: one LED of indigo round every light shape that meets the sky. + const out = P.lined; + for (let y = 0; y < H; y++) { + for (let x = 0; x < W; x++) { + const p = y * W + x; + const v = fr[p]; + out[p] = v; + if (v > SKY4) continue; + if ((x > 0 && LIGHT(fr[p - 1])) || (x < W - 1 && LIGHT(fr[p + 1])) || (y > 0 && LIGHT(fr[p - W])) || (y < H - 1 && LIGHT(fr[p + W]))) out[p] = LINE; + } + } + // Spray falls in front of the sky and the mountain, unlined. + for (const s of P.spray) { + const x = Math.floor(s[0]); + const y = Math.floor(s[1]); + if (x < 0 || x >= W || y < 0 || y >= H) continue; + const p = y * W + x; + if (zone[p] === Z_SKY && out[p] !== LINE) out[p] = SPRAY; + } + // The printing: Light walks from one set of colours to the next. + const l = P.light * 3; + const a = Math.min(2, Math.floor(l)); + const m = l - a; + const A = PRINTINGS[a]; + const B = PRINTINGS[a + 1]; + const rgb = P.rgb; + for (let i = 0; i < 16; i++) + for (let c = 0; c < 3; c++) rgb[i * 3 + c] = A[i][c] + (B[i][c] - A[i][c]) * m; + for (let p = 0; p < N; p++) { + const v = out[p] * 3; + display.setPixel(p % W, (p / W) | 0, rgb[v], rgb[v + 1], rgb[v + 2]); + } +} From 429309ac1a6ec2609b90be6f4c6c343e140abed9 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:28:41 +0000 Subject: [PATCH 04/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=201=20=ED=9B=84=EB=B3=B4:=20=ED=81=B0=20=ED=8C=8C?= =?UTF-8?q?=EB=8F=84=20=EC=95=84=EB=9E=98=EC=AA=BD=EC=9D=84=20=EA=B3=A7?= =?UTF-8?q?=EC=9D=80=20=EA=B8=B0=EB=91=A5=EC=97=90=EC=84=9C=20=EA=B3=A8?= =?UTF-8?q?=EB=A1=9C=20=ED=8D=BC=EC=A7=80=EB=8A=94=20=EB=AC=BC=20=EC=82=B0?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B6=80=ED=92=80=EB=A6=B0=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 8 ++++++++ incoming/pattern-study/patterns/great-wave.js | 8 +++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index 7e810fbb..807279d1 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -9,3 +9,11 @@ - 리그 판정 말: 안 4 「두 물결 사이 골에 후지가 작게」 · 안 1 「물마루가 위 가장자리까지 솟고 발톱이 후지 위로 덮침」 · 안 2 「파도가 후지를 압도하는 크기 대비」, 「위쪽을 꽉 채운 돔이라 갈고리가 사라짐」 · 안 3 「위쪽 40% 가 원작에 없는 빈 하늘」 - 만들기: 파도는 등과 얼굴 두 곡선으로 잡고, 얼굴에서 떨어진 거리로 쪽빛 혀와 옅은 이음선을 나눔. 손톱은 처음에 손바닥 원과 손가락 셋으로 찍었더니 흰 덩어리로 뭉쳐서, 마루 아랫면을 따라 5 칸마다 끝이 굽은 손가락 하나와 짧은 곁가지로 바꿈. 물보라 방울이 LED 모서리를 한 프레임씩 스쳐 한 프레임 깜빡임이 149 개라, 방울이 한 줄 내려갈 때만 옆으로 옮기게 해서 5 개로 줄임. K4 가 0.0093 으로 검사를 못 넘어 부서질수록 혀의 흰 물방울과 너울 마루의 거품이 늘게 함 - 선 판: 16색 · 노브 K1 0.34 · K2 0.07 · K3 0.08 · K4 0.04 · 한 프레임 깜빡임 5 +- 커밋 fdccd9a + +### 패스 1 +- 비평 1: 큐레이터 6 · 판화가 7 · 벽에 거는 사람 7 · 블라인드 읽기 3/3(「호쿠사이의 가나가와 앞바다 높은 파도 아래, 우키요에 목판화처럼 윤곽 안을 납작한 색으로」) +- 확인 차례: ① 큰 파도 아래 절반이 폭 16 의 곧은 기둥(큐레이터 가장 약한 것, 판화가) 예 · ① 배가 기울어진 주황 막대라 배로 안 읽힘(벽에 거는 사람 가장 약한 것) 예 +- 고칠 것: ① 큰 파도 얼굴 · y 40~127 에서 안쪽 벽이 x 15~16 의 곧은 선이라 지팡이 손잡이처럼 보임 · (15,48)~(15,92) +- 짚은 렌즈: 큐레이터 6점 「물 산이 아니라 지팡이 손잡이로 읽힌다」 · 판화가 7점 「폭이 거의 같은 세로 기둥」 +- 기대: pair-zoom 과 pair-led 에서 큰 파도 안쪽 벽이 y 56 부터 아래로 갈수록 오른쪽으로 부풀어 y 100 언저리에서 x 26 까지 골로 퍼지고, 후지산 왼쪽 발이 파도 뒤로 조금 가려짐 diff --git a/incoming/pattern-study/patterns/great-wave.js b/incoming/pattern-study/patterns/great-wave.js index 7cf798a5..c141482a 100644 --- a/incoming/pattern-study/patterns/great-wave.js +++ b/incoming/pattern-study/patterns/great-wave.js @@ -70,15 +70,15 @@ const PRINTINGS = [ // The cut, on the panel's LEDs. The great wave: its back from the foot of // the panel up over the crest to the lip, then its face from the lip back -// down to the foot. The second swell's crest, from off the right edge down +// down into the hollow and out again as its foot spreads into the trough. The second swell's crest, from off the right edge down // to the foot. The small wave in front, shaped like the mountain. The boat. const HORIZON = 97; const MOUNT = [31, 87, 1.5, 4]; const BACK = [[-6, 128], [-4, 90], [0, 56], [8, 30], [18, 14], [30, 8], [42, 10], [50, 18], [52, 28], [48, 35]]; -const FACE = [[48, 35], [45, 28], [40, 23], [32, 23], [24, 29], [18, 41], [14, 58], [13, 80], [15, 104], [18, 128], [22, 140]]; +const FACE = [[48, 35], [45, 28], [40, 23], [32, 23], [24, 29], [18, 41], [15, 56], [16, 70], [19, 82], [23, 93], [26, 104], [26, 116], [24, 128], [22, 140]]; const CREST = 30; const SWELL = [[70, 72], [62, 77], [54, 85], [46, 97], [39, 112], [33, 128], [30, 140]]; -const FRONT = [[4, 140], [12, 124], [19, 113], [24, 108], [29, 112], [35, 121], [42, 140]]; +const FRONT = [[12, 140], [20, 124], [27, 115], [32, 110], [37, 114], [43, 123], [50, 140]]; const HULL = [17, 104, 43, 99]; // Where the pale seams between the dark tongues lie, across the wave from its face. @@ -374,6 +374,8 @@ function boat(P) { for (let s = 0; s <= L; s += 0.5) { const x = x0 + ux * s; const y = y0 + uy * s + bob; + // The boat's stern slips behind the great wave's foot. + if (P.zone[Math.floor(y) * W + Math.floor(x)] === Z_WAVE) continue; put(P, x, y, BOAT); put(P, x, y + 1, s < 1.5 || s > L - 1.5 ? BOATD : BOAT); put(P, x, y + 2, BOATD); From 254d35cf123d8da850b7c9d625bb4a53b4a20765 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:30:01 +0000 Subject: [PATCH 05/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=201=20=EB=90=98=EB=8F=8C=EB=A6=BC:=20=EB=84=93?= =?UTF-8?q?=ED=9E=8C=20=EB=B2=BD=EC=97=90=20=ED=9D=B0=20=EB=AC=BC=EB=B0=A9?= =?UTF-8?q?=EC=9A=B8=EC=9D=B4=20=EB=8A=98=EC=96=B4=20=ED=8C=90=EC=A0=95?= =?UTF-8?q?=EB=8B=A8=EC=9D=B4=20=EC=98=9B=20=ED=8C=90=EC=9D=84=20=EA=B3=A8?= =?UTF-8?q?=EB=9E=90=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 11 +++++++++++ incoming/pattern-study/patterns/great-wave.js | 8 +++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index 807279d1..cc6eae89 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -17,3 +17,14 @@ - 고칠 것: ① 큰 파도 얼굴 · y 40~127 에서 안쪽 벽이 x 15~16 의 곧은 선이라 지팡이 손잡이처럼 보임 · (15,48)~(15,92) - 짚은 렌즈: 큐레이터 6점 「물 산이 아니라 지팡이 손잡이로 읽힌다」 · 판화가 7점 「폭이 거의 같은 세로 기둥」 - 기대: pair-zoom 과 pair-led 에서 큰 파도 안쪽 벽이 y 56 부터 아래로 갈수록 오른쪽으로 부풀어 y 100 언저리에서 x 26 까지 골로 퍼지고, 후지산 왼쪽 발이 파도 뒤로 조금 가려짐 +- 바뀐 LED: 정지 1274 · 10초 2188 · 노브 2065 · 팔레트 16→16색 +- A/B: 큐레이터 옛 이하(역순 옛 「옅은 줄이 약해지고 흰 점이 눈발처럼」 둘 다) · 판화가 정순 잡기 실패 · 벽에 거는 사람 같음(정순 새, 역순 옛 「흰 점이 흩뿌려져 잡티처럼 지글거림」) +- 버린 판정: 잡기 실패 1(판화가 정순). 큐레이터가 새가 될 수 없어 더 받지 않음 +- 되돌림. 판정단은 넓힌 벽의 줄보다 그 위에 늘어난 흰 물방울을 먼저 봤어요 + +### 패스 2 +- 비평 1 그대로(패스 1 되돌림) +- 확인 차례: ① 배가 기울어진 주황 막대라 배로 안 읽힘(벽에 거는 사람 가장 약한 것, 판화가 ③ 「먹판 윤곽선 없는 황토 판자」, 큐레이터 ⑤ 「노꾼 없는 주황 막대」) 예(패스 1 에서 받음) +- 고칠 것: ① 배 · 뱃머리도 사람 줄도 없는 주황 막대 · (18,105)~(41,99) +- 짚은 렌즈: 벽에 거는 사람 7점 「물에 뜬 널빤지 같아요」 · 판화가 7점 「윤곽선 없이 파란 물에 바로 닿고 뱃전도 노꾼도 없이」 · 큐레이터 6점 「배는 노꾼 없는 주황 막대」 +- 기대: pair-zoom 과 pair-led 에서 배 아래에 쪽빛 먹선이 깔리고, 오른쪽 끝 뱃머리가 두 칸 치켜 올라가 뾰족해지고, 배 위에 남색 등과 옅은 머리의 노꾼이 혹처럼 한 줄로 늘어섬 diff --git a/incoming/pattern-study/patterns/great-wave.js b/incoming/pattern-study/patterns/great-wave.js index c141482a..7cf798a5 100644 --- a/incoming/pattern-study/patterns/great-wave.js +++ b/incoming/pattern-study/patterns/great-wave.js @@ -70,15 +70,15 @@ const PRINTINGS = [ // The cut, on the panel's LEDs. The great wave: its back from the foot of // the panel up over the crest to the lip, then its face from the lip back -// down into the hollow and out again as its foot spreads into the trough. The second swell's crest, from off the right edge down +// down to the foot. The second swell's crest, from off the right edge down // to the foot. The small wave in front, shaped like the mountain. The boat. const HORIZON = 97; const MOUNT = [31, 87, 1.5, 4]; const BACK = [[-6, 128], [-4, 90], [0, 56], [8, 30], [18, 14], [30, 8], [42, 10], [50, 18], [52, 28], [48, 35]]; -const FACE = [[48, 35], [45, 28], [40, 23], [32, 23], [24, 29], [18, 41], [15, 56], [16, 70], [19, 82], [23, 93], [26, 104], [26, 116], [24, 128], [22, 140]]; +const FACE = [[48, 35], [45, 28], [40, 23], [32, 23], [24, 29], [18, 41], [14, 58], [13, 80], [15, 104], [18, 128], [22, 140]]; const CREST = 30; const SWELL = [[70, 72], [62, 77], [54, 85], [46, 97], [39, 112], [33, 128], [30, 140]]; -const FRONT = [[12, 140], [20, 124], [27, 115], [32, 110], [37, 114], [43, 123], [50, 140]]; +const FRONT = [[4, 140], [12, 124], [19, 113], [24, 108], [29, 112], [35, 121], [42, 140]]; const HULL = [17, 104, 43, 99]; // Where the pale seams between the dark tongues lie, across the wave from its face. @@ -374,8 +374,6 @@ function boat(P) { for (let s = 0; s <= L; s += 0.5) { const x = x0 + ux * s; const y = y0 + uy * s + bob; - // The boat's stern slips behind the great wave's foot. - if (P.zone[Math.floor(y) * W + Math.floor(x)] === Z_WAVE) continue; put(P, x, y, BOAT); put(P, x, y + 1, s < 1.5 || s > L - 1.5 ? BOATD : BOAT); put(P, x, y + 2, BOATD); From 5456595a74246457190f65969a79dce8551e0160 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:30:56 +0000 Subject: [PATCH 06/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=202=20=ED=9B=84=EB=B3=B4:=20=EB=B0=B0=EC=97=90=20?= =?UTF-8?q?=EC=B9=98=EC=BC=9C=20=EC=98=AC=EB=9D=BC=EA=B0=84=20=EB=B1=83?= =?UTF-8?q?=EB=A8=B8=EB=A6=AC=EC=99=80=20=EC=9A=A9=EA=B3=A8=20=EB=A8=B9?= =?UTF-8?q?=EC=84=A0,=20=EB=85=B8=EA=BE=BC=20=EC=A4=84=EC=9D=84=20?= =?UTF-8?q?=EB=8B=A8=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- .../pattern-study/craft/great-wave/log.md | 4 +-- incoming/pattern-study/patterns/great-wave.js | 28 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index cc6eae89..e8a877a4 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -18,8 +18,8 @@ - 짚은 렌즈: 큐레이터 6점 「물 산이 아니라 지팡이 손잡이로 읽힌다」 · 판화가 7점 「폭이 거의 같은 세로 기둥」 - 기대: pair-zoom 과 pair-led 에서 큰 파도 안쪽 벽이 y 56 부터 아래로 갈수록 오른쪽으로 부풀어 y 100 언저리에서 x 26 까지 골로 퍼지고, 후지산 왼쪽 발이 파도 뒤로 조금 가려짐 - 바뀐 LED: 정지 1274 · 10초 2188 · 노브 2065 · 팔레트 16→16색 -- A/B: 큐레이터 옛 이하(역순 옛 「옅은 줄이 약해지고 흰 점이 눈발처럼」 둘 다) · 판화가 정순 잡기 실패 · 벽에 거는 사람 같음(정순 새, 역순 옛 「흰 점이 흩뿌려져 잡티처럼 지글거림」) -- 버린 판정: 잡기 실패 1(판화가 정순). 큐레이터가 새가 될 수 없어 더 받지 않음 +- A/B: 큐레이터 같음(정순 새 「x 16 에서 x 23 까지 휘어 내려가 휘감기는 파도」, 역순 옛 「옅은 줄이 약해지고 흰 점이 눈발처럼」) · 판화가 역순 옛 「부채꼴로 넓혀 결이 계단처럼 꺾이고 ∧ 물결을 덮음」, 정순 잡기 실패 · 벽에 거는 사람 같음(정순 새, 역순 옛 「흰 점이 흩뿌려져 잡티처럼 지글거림」) +- 버린 판정: 잡기 실패 1(판화가 정순). 짚은 큐레이터가 같음이라 결과가 정해져 더 받지 않음 - 되돌림. 판정단은 넓힌 벽의 줄보다 그 위에 늘어난 흰 물방울을 먼저 봤어요 ### 패스 2 diff --git a/incoming/pattern-study/patterns/great-wave.js b/incoming/pattern-study/patterns/great-wave.js index 7cf798a5..e2c522e3 100644 --- a/incoming/pattern-study/patterns/great-wave.js +++ b/incoming/pattern-study/patterns/great-wave.js @@ -365,22 +365,24 @@ function swell(P, p, front) { return f < 0.3 ? DEEP : f < 0.45 ? MID : PALE; } +// The boat, a column at a time: a long hull whose prow sweeps up into a +// point, a key line under its keel, and the rowers hunched over their oars +// in a row of dark backs and pale heads. function boat(P) { const [x0, y0, x1, y1] = HULL; const bob = Math.round(0.9 * Math.sin(P.t * 0.6)); - const L = Math.hypot(x1 - x0, y1 - y0); - const ux = (x1 - x0) / L; - const uy = (y1 - y0) / L; - for (let s = 0; s <= L; s += 0.5) { - const x = x0 + ux * s; - const y = y0 + uy * s + bob; - put(P, x, y, BOAT); - put(P, x, y + 1, s < 1.5 || s > L - 1.5 ? BOATD : BOAT); - put(P, x, y + 2, BOATD); - // The rowers bent over their oars: a dark back and a pale head. - if (s > L * 0.14 && s < L * 0.86 && Math.floor(s) % 3 === 0) { - put(P, x, y - 1, ROWER); - put(P, x, y - 2, HEAD); + const k = (y1 - y0) / (x1 - x0); + for (let x = x0; x <= x1; x++) { + const top = Math.round(y0 + (x - x0) * k) + bob; + const bow = x1 - x; + const rise = bow < 3 ? 3 - bow : x === x0 ? 1 : 0; + const keel = top + 2 - Math.max(0, rise - 1); + for (let y = top - rise; y <= keel; y++) put(P, x, y, y === keel && rise < 2 ? BOATD : BOAT); + put(P, x, keel + 1, LINE); + const r = x - x0; + if (r >= 4 && bow >= 5 && r % 3 !== 2) { + put(P, x, top - 1, ROWER); + if (r % 3 === 0) put(P, x, top - 2, HEAD); } } } From 7c694019a368fba55c30468c7b89e996b0c6bfd4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:33:06 +0000 Subject: [PATCH 07/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=202=20=EC=B1=84=ED=83=9D:=20=EB=B1=83=EB=A8=B8?= =?UTF-8?q?=EB=A6=AC=EC=99=80=20=EC=9A=A9=EA=B3=A8=20=EB=A8=B9=EC=84=A0?= =?UTF-8?q?=EC=9D=84=20=EB=8B=A8=20=EB=B0=B0=EB=A5=BC=20=EC=84=B8=20?= =?UTF-8?q?=EB=A0=8C=EC=A6=88=EA=B0=80=20=EB=8B=A4=20=EC=83=88=20=ED=8C=90?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EA=B3=A8=EB=9E=90=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index e8a877a4..5dba5227 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -28,3 +28,7 @@ - 고칠 것: ① 배 · 뱃머리도 사람 줄도 없는 주황 막대 · (18,105)~(41,99) - 짚은 렌즈: 벽에 거는 사람 7점 「물에 뜬 널빤지 같아요」 · 판화가 7점 「윤곽선 없이 파란 물에 바로 닿고 뱃전도 노꾼도 없이」 · 큐레이터 6점 「배는 노꾼 없는 주황 막대」 - 기대: pair-zoom 과 pair-led 에서 배 아래에 쪽빛 먹선이 깔리고, 오른쪽 끝 뱃머리가 두 칸 치켜 올라가 뾰족해지고, 배 위에 남색 등과 옅은 머리의 노꾼이 혹처럼 한 줄로 늘어섬 +- 바뀐 LED: 정지 100 · 10초 191 · 노브 156 · 팔레트 16→16색 +- A/B: 큐레이터 새(정순은 패널 짝 같음, 8배 짝 「뱃머리가 x 43, y 97 쯤까지 비스듬히 들려」 · 역순 「오시오쿠리부네처럼 파도 비탈을 타고 올라가는 배」) · 판화가 새(「배 밑을 따라 먹판 같은 짙은 남색 윤곽선」) · 벽에 거는 사람 새(「용골 그림자가 깔리고 이물이 솟아 물 위에 놓인 배」) +- 버린 판정: 없음 +- 채택. 커밋 5456595 From 8e40bd1516cfd81e413445ae65c7076d5eb0adf1 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:40:12 +0000 Subject: [PATCH 08/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=203=20=ED=9B=84=EB=B3=B4:=20=ED=81=B0=20=ED=8C=8C?= =?UTF-8?q?=EB=8F=84=20=EB=B0=9C=EC=9D=84=20=EA=B3=A8=20=EC=AA=BD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=80=EB=93=9C=EB=9F=BD=EA=B2=8C=20=EB=B6=80?= =?UTF-8?q?=ED=92=80=EB=A6=AC=EA=B3=A0=20=EC=95=84=EB=9E=98=20=EB=AA=B8?= =?UTF-8?q?=ED=86=B5=EC=9D=98=20=ED=9D=B0=20=EC=A0=90=EC=9D=84=20=EA=B1=B7?= =?UTF-8?q?=EB=8A=94=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 8 ++++++++ incoming/pattern-study/patterns/great-wave.js | 14 ++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index 5dba5227..41cb540b 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -32,3 +32,11 @@ - A/B: 큐레이터 새(정순은 패널 짝 같음, 8배 짝 「뱃머리가 x 43, y 97 쯤까지 비스듬히 들려」 · 역순 「오시오쿠리부네처럼 파도 비탈을 타고 올라가는 배」) · 판화가 새(「배 밑을 따라 먹판 같은 짙은 남색 윤곽선」) · 벽에 거는 사람 새(「용골 그림자가 깔리고 이물이 솟아 물 위에 놓인 배」) - 버린 판정: 없음 - 채택. 커밋 5456595 + +### 패스 3 +- 비평 2: 큐레이터 6 · 판화가 7 · 벽에 거는 사람 7 · 블라인드 읽기 3/3(「가나가와 앞바다의 높은 파도 아래를 세로 화면으로, 우키요에 목판화 결」) +- 확인 차례: ① 큰 파도 왼쪽 몸통이 x 0~15 폭으로 곧게 내려감(큐레이터 가장 약한 것, 벽에 거는 사람) 예 +- 고칠 것: ① 큰 파도 얼굴 · 패스 1 과 같은 지적의 둘째 고침. 패스 1 은 발을 x 26 까지 넓혀 결이 계단으로 꺾이고 앞 물결을 덮었고, 늘어난 벽에 흰 물방울이 잡티로 보였어요. 이번엔 발을 x 21 까지만 부드럽게 부풀리고, 흰 물방울은 마루 쪽 위 몸통에만 두고, 앞 물결과 배를 3~4 칸 오른쪽으로 비켜 온전히 남김 · (8,60) (8,95) (8,125) +- 짚은 렌즈: 큐레이터 6점 「지팡이 손잡이나 촉수로 읽혀요」 · 벽에 거는 사람 7점 「물마루가 덮치는 덩어리보다 갈고리 지팡이에 가깝다」 +- 기대: pair-zoom 과 pair-led 에서 큰 파도 안쪽 벽이 y 68 부터 아래로 부드럽게 부풀어 y 100 언저리 x 21 까지 골로 퍼지고, 아래 몸통의 흰 점이 사라져 줄만 남고, 앞 물결의 ∧ 는 다 보임 +- 바뀐 LED: 정지 1246 · 10초 2154 · 노브 2014 · 팔레트 16→16색 diff --git a/incoming/pattern-study/patterns/great-wave.js b/incoming/pattern-study/patterns/great-wave.js index e2c522e3..35c1288d 100644 --- a/incoming/pattern-study/patterns/great-wave.js +++ b/incoming/pattern-study/patterns/great-wave.js @@ -70,16 +70,16 @@ const PRINTINGS = [ // The cut, on the panel's LEDs. The great wave: its back from the foot of // the panel up over the crest to the lip, then its face from the lip back -// down to the foot. The second swell's crest, from off the right edge down +// down into the hollow and out again where its foot swells into the trough. The second swell's crest, from off the right edge down // to the foot. The small wave in front, shaped like the mountain. The boat. const HORIZON = 97; const MOUNT = [31, 87, 1.5, 4]; const BACK = [[-6, 128], [-4, 90], [0, 56], [8, 30], [18, 14], [30, 8], [42, 10], [50, 18], [52, 28], [48, 35]]; -const FACE = [[48, 35], [45, 28], [40, 23], [32, 23], [24, 29], [18, 41], [14, 58], [13, 80], [15, 104], [18, 128], [22, 140]]; +const FACE = [[48, 35], [45, 28], [40, 23], [32, 23], [24, 29], [18, 41], [15, 56], [15, 68], [17, 80], [20, 92], [22, 102], [21, 114], [19, 128], [18, 140]]; const CREST = 30; const SWELL = [[70, 72], [62, 77], [54, 85], [46, 97], [39, 112], [33, 128], [30, 140]]; -const FRONT = [[4, 140], [12, 124], [19, 113], [24, 108], [29, 112], [35, 121], [42, 140]]; -const HULL = [17, 104, 43, 99]; +const FRONT = [[7, 140], [15, 124], [22, 113], [27, 108], [32, 112], [38, 121], [45, 140]]; +const HULL = [21, 103, 44, 98]; // Where the pale seams between the dark tongues lie, across the wave from its face. const SEAMS = [3.2, 6.8, 9.6, 13.4, 16.6, 20.4, 23.6, 27.2, 30.8, 34.4, 38]; @@ -338,7 +338,7 @@ function put(P, x, y, v) { // The great wave: a foam rim along its back at the crest, then dark tongues // with pale seams that sway along their length, and white flecks riding up -// them, more of them the harder it breaks; its face is pale low down and darker under the lip. +// the upper wave towards the crest, more of them the harder it breaks; its face is pale low down and darker under the lip. function wave(P, p) { const s = P.along[p]; const d = P.across[p]; @@ -347,7 +347,7 @@ function wave(P, p) { if (d < 1.2) return s < CREST ? MID : PALE; const w = d / g + 0.9 * Math.sin(s * 0.16 - P.t * 0.7); for (let i = 0; i < SEAMS.length; i++) if (Math.abs(w - SEAMS[i]) < 0.55) return s > CREST * 2.2 && i < 2 ? PALE : MID; - if (hash(Math.floor((s + P.t * 3) / (1.1 * g)), Math.floor(d / (1.2 * g))) < 0.045 + 0.2 * P.brk) return FOAM; + if (hash(Math.floor((s + P.t * 3) / (1.1 * g)), Math.floor(d / (1.2 * g))) < (0.045 + 0.2 * P.brk) * Math.min(1, Math.max(0, (90 - s) / 30))) return FOAM; return DEEP; } @@ -374,6 +374,8 @@ function boat(P) { const k = (y1 - y0) / (x1 - x0); for (let x = x0; x <= x1; x++) { const top = Math.round(y0 + (x - x0) * k) + bob; + // The stern slips behind the great wave's foot. + if (P.zone[top * W + x] === Z_WAVE) continue; const bow = x1 - x; const rise = bow < 3 ? 3 - bow : x === x0 ? 1 : 0; const keel = top + 2 - Math.max(0, rise - 1); From 6ce73b6611c209f40f6e510ad932da91ca98278f Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:43:04 +0000 Subject: [PATCH 09/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=203=20=EC=B1=84=ED=83=9D:=20=EB=B0=9C=EC=9D=B4=20?= =?UTF-8?q?=EA=B3=A8=EB=A1=9C=20=EB=B6=80=ED=91=BC=20=ED=81=B0=20=ED=8C=8C?= =?UTF-8?q?=EB=8F=84=EB=A5=BC=20=EC=84=B8=20=EB=A0=8C=EC=A6=88=EA=B0=80=20?= =?UTF-8?q?=EB=8B=A4=20=EC=83=88=20=ED=8C=90=EC=9C=BC=EB=A1=9C=20=EA=B3=A8?= =?UTF-8?q?=EB=9E=90=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index 41cb540b..7d9426cf 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -40,3 +40,6 @@ - 짚은 렌즈: 큐레이터 6점 「지팡이 손잡이나 촉수로 읽혀요」 · 벽에 거는 사람 7점 「물마루가 덮치는 덩어리보다 갈고리 지팡이에 가깝다」 - 기대: pair-zoom 과 pair-led 에서 큰 파도 안쪽 벽이 y 68 부터 아래로 부드럽게 부풀어 y 100 언저리 x 21 까지 골로 퍼지고, 아래 몸통의 흰 점이 사라져 줄만 남고, 앞 물결의 ∧ 는 다 보임 - 바뀐 LED: 정지 1246 · 10초 2154 · 노브 2014 · 팔레트 16→16색 +- A/B: 큐레이터 새(「호쿠사이 원작처럼 아래가 묵직한 오목한 몸통」, 「옛 판은 흰 점을 흩뿌려 잡티처럼」) · 판화가 새(「줄이 끊기지 않은 채 부푼 몸을 따라 흘러내려 목판의 끌 자국처럼」) · 벽에 거는 사람 새(「기둥이 아래로 갈수록 넓어지며 바다에 내려앉음」, 「벽과 배 사이에 물이 한 줄 남아 배가 따로 읽힘」) +- 버린 판정: 없음 +- 채택. 커밋 8e40bd1 From 6c5745e32f774feaefaba6ab68860e0a6f1a0da8 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:50:22 +0000 Subject: [PATCH 10/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=204=20=ED=9B=84=EB=B3=B4:=20=ED=81=B0=20=ED=8C=8C?= =?UTF-8?q?=EB=8F=84=20=EB=AA=B8=ED=86=B5=EC=9D=98=20=EC=9D=B4=EC=9D=8C?= =?UTF-8?q?=EC=84=A0=EC=9D=84=20=EC=95=84=EB=9E=98=20=EB=92=A4=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=A7=88=EB=A3=A8=20=EC=AA=BD=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=86=9F=EB=8A=94=20=EB=B9=84=EB=82=80=20=EC=A4=84=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=94=EA=BE=BC=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 8 ++++++++ incoming/pattern-study/patterns/great-wave.js | 10 ++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index 7d9426cf..c5aa6953 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -43,3 +43,11 @@ - A/B: 큐레이터 새(「호쿠사이 원작처럼 아래가 묵직한 오목한 몸통」, 「옛 판은 흰 점을 흩뿌려 잡티처럼」) · 판화가 새(「줄이 끊기지 않은 채 부푼 몸을 따라 흘러내려 목판의 끌 자국처럼」) · 벽에 거는 사람 새(「기둥이 아래로 갈수록 넓어지며 바다에 내려앉음」, 「벽과 배 사이에 물이 한 줄 남아 배가 따로 읽힘」) - 버린 판정: 없음 - 채택. 커밋 8e40bd1 + +### 패스 4 +- 비평 3: 큐레이터 6 · 판화가 6 · 벽에 거는 사람 7 · 블라인드 읽기 3/3(「가나가와 앞바다의 높은 파도 아래, 우키요에 목판화를 픽셀로 옮긴 결」) +- 확인 차례: ① 왼쪽 몸통이 같은 굵기로 곧게 내려가고 안의 옅은 줄도 세로로 곧아 기둥으로 보임(큐레이터 가장 약한 것, 벽에 거는 사람 가장 약한 것, 판화가 ①) 예 +- 고칠 것: ① 큰 파도 몸통 · 같은 지적의 셋째 고침(패스 1 되돌림, 패스 3 채택). 몸꼴은 두고, 마루 아래 혀의 이음선을 얼굴과 나란한 세로줄에서 아래 뒤쪽에서 솟아 얼굴 쪽으로 올라가는 비낀 줄로 바꿈 · (8,60)~(14,77) +- 짚은 렌즈: 큐레이터 6점 「갈고리나 촉수로 먼저 읽혀요」 · 벽에 거는 사람 7점 「안의 하늘색 줄도 세로로 곧아요」 · 판화가 6점 「x 14 의 줄은 y 51~71 동안 한 칸도 휘지 않아요」 +- 기대: pair-zoom 과 pair-led 에서 왼쪽 몸통 y 50~127 의 옅은 줄이 왼쪽 아래에서 오른쪽 위로 비껴 올라가 얼굴에 닿고, 세로로 곧은 줄이 사라짐 +- 바뀐 LED: 정지 635 · 10초 1429 · 노브 1463 · 팔레트 16→16색 diff --git a/incoming/pattern-study/patterns/great-wave.js b/incoming/pattern-study/patterns/great-wave.js index 35c1288d..3a753256 100644 --- a/incoming/pattern-study/patterns/great-wave.js +++ b/incoming/pattern-study/patterns/great-wave.js @@ -83,6 +83,7 @@ const HULL = [21, 103, 44, 98]; // Where the pale seams between the dark tongues lie, across the wave from its face. const SEAMS = [3.2, 6.8, 9.6, 13.4, 16.6, 20.4, 23.6, 27.2, 30.8, 34.4, 38]; +const SPAN = 41.2; function hash(a, b) { let h = Math.imul(a, 374761393) ^ Math.imul(b, 668265263); @@ -345,8 +346,13 @@ function wave(P, p) { const g = 1 + P.grain * 0.9; if (s < CREST + 6 && P.back[p] < 2.6 - s * 0.03) return FOAM; if (d < 1.2) return s < CREST ? MID : PALE; - const w = d / g + 0.9 * Math.sin(s * 0.16 - P.t * 0.7); - for (let i = 0; i < SEAMS.length; i++) if (Math.abs(w - SEAMS[i]) < 0.55) return s > CREST * 2.2 && i < 2 ? PALE : MID; + // Below the crest the tongues sweep: each rises from the back of the wave + // low down and reaches the face higher up, so the wall reads as water + // climbing towards the lip rather than a post. + const sweep = Math.max(0, s - CREST * 1.6) * 0.42; + let w = (d + sweep) / g + 0.9 * Math.sin(s * 0.16 - P.t * 0.7); + w -= Math.floor(w / SPAN) * SPAN; + for (let i = 0; i < SEAMS.length; i++) if (Math.abs(w - SEAMS[i]) < 0.55) return s > CREST * 2.2 && d < 7 ? PALE : MID; if (hash(Math.floor((s + P.t * 3) / (1.1 * g)), Math.floor(d / (1.2 * g))) < (0.045 + 0.2 * P.brk) * Math.min(1, Math.max(0, (90 - s) / 30))) return FOAM; return DEEP; } From 954ba480c2f77da5ed31ecdc7d02fcd19d9cc871 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:52:55 +0000 Subject: [PATCH 11/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=204=20=EB=90=98=EB=8F=8C=EB=A6=BC=EA=B3=BC=20?= =?UTF-8?q?=ED=8C=A8=EC=8A=A4=205=20=ED=9B=84=EB=B3=B4:=20=EB=B9=84?= =?UTF-8?q?=EB=82=80=20=EC=A4=84=EC=9D=80=20=EB=81=8A=EA=B8=B4=20=EB=B9=97?= =?UTF-8?q?=EA=B8=88=EC=9C=BC=EB=A1=9C=20=EC=9D=BD=ED=98=80=20=EB=A7=89?= =?UTF-8?q?=ED=9E=88=EA=B3=A0,=20=EB=B0=B0=EC=97=90=20=ED=8C=90=EC=9E=90?= =?UTF-8?q?=20=EC=9C=84=EB=A1=9C=20=EC=9B=85=ED=81=AC=EB=A6=B0=20=EB=85=B8?= =?UTF-8?q?=EA=BE=BC=EC=9D=84=20=EC=84=B8=EC=9A=B4=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 11 +++++++++++ incoming/pattern-study/patterns/great-wave.js | 17 +++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index c5aa6953..d51f95f9 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -51,3 +51,14 @@ - 짚은 렌즈: 큐레이터 6점 「갈고리나 촉수로 먼저 읽혀요」 · 벽에 거는 사람 7점 「안의 하늘색 줄도 세로로 곧아요」 · 판화가 6점 「x 14 의 줄은 y 51~71 동안 한 칸도 휘지 않아요」 - 기대: pair-zoom 과 pair-led 에서 왼쪽 몸통 y 50~127 의 옅은 줄이 왼쪽 아래에서 오른쪽 위로 비껴 올라가 얼굴에 닿고, 세로로 곧은 줄이 사라짐 - 바뀐 LED: 정지 635 · 10초 1429 · 노브 1463 · 팔레트 16→16색 +- A/B: 큐레이터 옛 이하(역순 옛 「짧은 빗금으로 끊겨 원작에 없는 엮은 결」 둘 다) · 판화가 정순 새(「y 60 아래로 오른쪽으로 휘며 벌어짐」), 역순 잡기 실패 · 벽에 거는 사람 같음(정순 새 「가장자리 열의 외딴 점」, 역순 옛 「빗금처럼 끊겼다 다시 시작해 벽이 어수선」) +- 버린 판정: 잡기 실패 1(판화가 역순, 잡기 짝에 진짜 짝 답을 그대로 옮겨 씀). 다시 받기에는 「짝마다 따로 보고 옮겨 쓰지 않아요」 한 줄을 더함 +- 되돌림. 같은 지적의 둘째 되돌림이라 막힘. 판정단은 비낀 줄을 물이 솟는 결보다 끊긴 빗금으로 봤어요 + +### 패스 5 +- 비평 3 그대로(패스 4 되돌림) +- 확인 차례: ① 배가 노꾼도 판자선도 없는 막대(판화가 ①, 큐레이터 ⑤ 「사공 없는 막대 한 척」과 ③ 「판에서 가장 진한 주황」, 벽에 거는 사람 ⑤ 「배는 주황 막대, 사공은 크림 점」) 예(패스 2 확인과 같은 지적이고 세 렌즈가 다시 짚음) +- 고칠 것: ① 배 · 패스 2 에 단 노꾼이 바다와 같은 남색이라 패널에서 안 보이고 선체가 진한 주황으로 뜸 · 노꾼을 선체 윗줄 안으로 들여 옅은 판자 위의 남색 등 두 칸과 뱃전 위 옅은 머리로 세우고, 선체를 원작의 옅은 살구색으로 낮춤 · (22,105)~(44,96) +- 짚은 렌즈: 판화가 6점 「노꾼도 판자선도 없는 막대 하나」 · 큐레이터 6점 「사공 없는 막대 한 척」 · 벽에 거는 사람 7점 「사공은 크림 점」 +- 기대: pair-zoom 과 pair-led 에서 배 위에 남색 등과 흰 머리의 노꾼 일곱이 판자 사이사이로 보이고, 선체가 주황에서 옅은 살구색으로 가라앉음 +- 바뀐 LED: 정지 73 · 10초 120 · 노브 97 · 팔레트 16→16색 diff --git a/incoming/pattern-study/patterns/great-wave.js b/incoming/pattern-study/patterns/great-wave.js index 3a753256..7c1f95a8 100644 --- a/incoming/pattern-study/patterns/great-wave.js +++ b/incoming/pattern-study/patterns/great-wave.js @@ -45,7 +45,7 @@ const PRINTINGS = [ [ [228, 218, 190], [206, 200, 180], [172, 168, 154], [134, 132, 124], [24, 50, 108], [62, 108, 164], [158, 190, 204], [242, 240, 228], - [22, 32, 66], [228, 190, 140], [168, 122, 86], [34, 52, 98], + [22, 32, 66], [224, 198, 164], [176, 140, 108], [34, 52, 98], [232, 222, 196], [62, 84, 120], [246, 246, 238], [250, 250, 244], ], [ @@ -83,7 +83,6 @@ const HULL = [21, 103, 44, 98]; // Where the pale seams between the dark tongues lie, across the wave from its face. const SEAMS = [3.2, 6.8, 9.6, 13.4, 16.6, 20.4, 23.6, 27.2, 30.8, 34.4, 38]; -const SPAN = 41.2; function hash(a, b) { let h = Math.imul(a, 374761393) ^ Math.imul(b, 668265263); @@ -346,13 +345,8 @@ function wave(P, p) { const g = 1 + P.grain * 0.9; if (s < CREST + 6 && P.back[p] < 2.6 - s * 0.03) return FOAM; if (d < 1.2) return s < CREST ? MID : PALE; - // Below the crest the tongues sweep: each rises from the back of the wave - // low down and reaches the face higher up, so the wall reads as water - // climbing towards the lip rather than a post. - const sweep = Math.max(0, s - CREST * 1.6) * 0.42; - let w = (d + sweep) / g + 0.9 * Math.sin(s * 0.16 - P.t * 0.7); - w -= Math.floor(w / SPAN) * SPAN; - for (let i = 0; i < SEAMS.length; i++) if (Math.abs(w - SEAMS[i]) < 0.55) return s > CREST * 2.2 && d < 7 ? PALE : MID; + const w = d / g + 0.9 * Math.sin(s * 0.16 - P.t * 0.7); + for (let i = 0; i < SEAMS.length; i++) if (Math.abs(w - SEAMS[i]) < 0.55) return s > CREST * 2.2 && i < 2 ? PALE : MID; if (hash(Math.floor((s + P.t * 3) / (1.1 * g)), Math.floor(d / (1.2 * g))) < (0.045 + 0.2 * P.brk) * Math.min(1, Math.max(0, (90 - s) / 30))) return FOAM; return DEEP; } @@ -387,8 +381,11 @@ function boat(P) { const keel = top + 2 - Math.max(0, rise - 1); for (let y = top - rise; y <= keel; y++) put(P, x, y, y === keel && rise < 2 ? BOATD : BOAT); put(P, x, keel + 1, LINE); + // Each rower crouches in the hull two LEDs wide, his dark back against + // the pale planks and his head above the gunwale, a plank's width apart. const r = x - x0; - if (r >= 4 && bow >= 5 && r % 3 !== 2) { + if (r >= 3 && bow >= 5 && r % 3 !== 2) { + put(P, x, top, ROWER); put(P, x, top - 1, ROWER); if (r % 3 === 0) put(P, x, top - 2, HEAD); } From 74598c1152a6296e2003faebbdd2173e258b04da Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:53:56 +0000 Subject: [PATCH 12/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=204=20=EA=B8=B0=EB=A1=9D:=20=EB=8A=A6=EA=B2=8C=20?= =?UTF-8?q?=EC=98=A8=20=ED=8C=90=EC=A0=95=EA=B9=8C=EC=A7=80=20=EC=A0=81?= =?UTF-8?q?=EB=8A=94=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index d51f95f9..cf8c6364 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -51,7 +51,7 @@ - 짚은 렌즈: 큐레이터 6점 「갈고리나 촉수로 먼저 읽혀요」 · 벽에 거는 사람 7점 「안의 하늘색 줄도 세로로 곧아요」 · 판화가 6점 「x 14 의 줄은 y 51~71 동안 한 칸도 휘지 않아요」 - 기대: pair-zoom 과 pair-led 에서 왼쪽 몸통 y 50~127 의 옅은 줄이 왼쪽 아래에서 오른쪽 위로 비껴 올라가 얼굴에 닿고, 세로로 곧은 줄이 사라짐 - 바뀐 LED: 정지 635 · 10초 1429 · 노브 1463 · 팔레트 16→16색 -- A/B: 큐레이터 옛 이하(역순 옛 「짧은 빗금으로 끊겨 원작에 없는 엮은 결」 둘 다) · 판화가 정순 새(「y 60 아래로 오른쪽으로 휘며 벌어짐」), 역순 잡기 실패 · 벽에 거는 사람 같음(정순 새 「가장자리 열의 외딴 점」, 역순 옛 「빗금처럼 끊겼다 다시 시작해 벽이 어수선」) +- A/B: 큐레이터 옛(정순 「y 40 아래에서 빗금으로 꺾이고 바닥에 짙은 띠」, 역순 「짧은 빗금으로 끊겨 원작에 없는 엮은 결」) · 판화가 같음(정순 새 「y 60 아래로 오른쪽으로 휘며 벌어짐」, 역순 다시 받아 옛 「결이 계단처럼 밀려 겹선」) · 벽에 거는 사람 같음(정순 새 「가장자리 열의 외딴 점」, 역순 옛 「빗금처럼 끊겼다 다시 시작해 벽이 어수선」) - 버린 판정: 잡기 실패 1(판화가 역순, 잡기 짝에 진짜 짝 답을 그대로 옮겨 씀). 다시 받기에는 「짝마다 따로 보고 옮겨 쓰지 않아요」 한 줄을 더함 - 되돌림. 같은 지적의 둘째 되돌림이라 막힘. 판정단은 비낀 줄을 물이 솟는 결보다 끊긴 빗금으로 봤어요 From f7a65dfade72fed49a7938fd4e700eaa665413bb Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:54:43 +0000 Subject: [PATCH 13/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=205=20=EB=90=98=EB=8F=8C=EB=A6=BC:=20=ED=8C=90?= =?UTF-8?q?=EC=9E=90=20=EC=9C=84=20=EB=82=A8=EC=83=89=20=EB=93=B1=EC=9D=B4?= =?UTF-8?q?=20=EB=85=B8=EA=BE=BC=EC=9D=B4=20=EC=95=84=EB=8B=88=EB=9D=BC=20?= =?UTF-8?q?=EA=B0=91=ED=8C=90=20=EC=96=BC=EB=A3=A9=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=BD=ED=98=94=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 2 ++ incoming/pattern-study/patterns/great-wave.js | 7 ++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index cf8c6364..01945e33 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -62,3 +62,5 @@ - 짚은 렌즈: 판화가 6점 「노꾼도 판자선도 없는 막대 하나」 · 큐레이터 6점 「사공 없는 막대 한 척」 · 벽에 거는 사람 7점 「사공은 크림 점」 - 기대: pair-zoom 과 pair-led 에서 배 위에 남색 등과 흰 머리의 노꾼 일곱이 판자 사이사이로 보이고, 선체가 주황에서 옅은 살구색으로 가라앉음 - 바뀐 LED: 정지 73 · 10초 120 · 노브 97 · 팔레트 16→16색 +- A/B: 벽에 거는 사람 같음(정순 옛 「옅은 황토색 위에 짙은 파란 물점이 박혀 얼룩져 보임」, 역순 같음) · 큐레이터와 판화가는 결과가 정해져 받은 것만 적음(아래) +- 되돌림. 패널에서 남색 등은 노꾼이 아니라 갑판의 얼룩으로 읽혔어요. 배의 첫 되돌림이에요 diff --git a/incoming/pattern-study/patterns/great-wave.js b/incoming/pattern-study/patterns/great-wave.js index 7c1f95a8..35c1288d 100644 --- a/incoming/pattern-study/patterns/great-wave.js +++ b/incoming/pattern-study/patterns/great-wave.js @@ -45,7 +45,7 @@ const PRINTINGS = [ [ [228, 218, 190], [206, 200, 180], [172, 168, 154], [134, 132, 124], [24, 50, 108], [62, 108, 164], [158, 190, 204], [242, 240, 228], - [22, 32, 66], [224, 198, 164], [176, 140, 108], [34, 52, 98], + [22, 32, 66], [228, 190, 140], [168, 122, 86], [34, 52, 98], [232, 222, 196], [62, 84, 120], [246, 246, 238], [250, 250, 244], ], [ @@ -381,11 +381,8 @@ function boat(P) { const keel = top + 2 - Math.max(0, rise - 1); for (let y = top - rise; y <= keel; y++) put(P, x, y, y === keel && rise < 2 ? BOATD : BOAT); put(P, x, keel + 1, LINE); - // Each rower crouches in the hull two LEDs wide, his dark back against - // the pale planks and his head above the gunwale, a plank's width apart. const r = x - x0; - if (r >= 3 && bow >= 5 && r % 3 !== 2) { - put(P, x, top, ROWER); + if (r >= 4 && bow >= 5 && r % 3 !== 2) { put(P, x, top - 1, ROWER); if (r % 3 === 0) put(P, x, top - 2, HEAD); } From 60873832a665efc2a59aa97ba8522d5d02abe75a Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:56:05 +0000 Subject: [PATCH 14/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=ED=8C=A8?= =?UTF-8?q?=EC=8A=A4=205=20=EA=B8=B0=EB=A1=9D:=20=ED=81=90=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EC=99=80=20=ED=8C=90=ED=99=94=EA=B0=80?= =?UTF-8?q?=EB=8A=94=20=EC=83=88,=20=EB=B2=BD=EC=97=90=20=EA=B1=B0?= =?UTF-8?q?=EB=8A=94=20=EC=82=AC=EB=9E=8C=EB=A7=8C=20=EA=B0=99=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index 01945e33..702727f1 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -62,5 +62,6 @@ - 짚은 렌즈: 판화가 6점 「노꾼도 판자선도 없는 막대 하나」 · 큐레이터 6점 「사공 없는 막대 한 척」 · 벽에 거는 사람 7점 「사공은 크림 점」 - 기대: pair-zoom 과 pair-led 에서 배 위에 남색 등과 흰 머리의 노꾼 일곱이 판자 사이사이로 보이고, 선체가 주황에서 옅은 살구색으로 가라앉음 - 바뀐 LED: 정지 73 · 10초 120 · 노브 97 · 팔레트 16→16색 -- A/B: 벽에 거는 사람 같음(정순 옛 「옅은 황토색 위에 짙은 파란 물점이 박혀 얼룩져 보임」, 역순 같음) · 큐레이터와 판화가는 결과가 정해져 받은 것만 적음(아래) -- 되돌림. 패널에서 남색 등은 노꾼이 아니라 갑판의 얼룩으로 읽혔어요. 배의 첫 되돌림이에요 +- A/B: 큐레이터 새(정순 「주황 뱃전 위에 노 젓는 사람들이 점으로 줄지어」, 역순 「옅은 살구빛 선체 위에 웅크린 뱃사공들」) · 판화가 새(「배 길이 내내 칼로 새긴 노꾼의 줄」, 「원작처럼 바랜 담황색」) · 벽에 거는 사람 같음(정순 옛 「옅은 황토색 위에 짙은 파란 물점이 박혀 얼룩져 보임」, 역순 같음) +- 버린 판정: 없음 +- 되돌림. 짚은 렌즈 셋 가운데 벽에 거는 사람이 새가 아니에요. 2m 패널에서 남색 등은 노꾼이 아니라 갑판의 얼룩으로 읽혔어요. 배의 첫 되돌림이에요 From 5ceffb519a81423037ef960e756c3ff1795370a6 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 17:56:25 +0000 Subject: [PATCH 15/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=EB=B0=94?= =?UTF-8?q?=ED=80=B4=20=EB=81=9D=20=EA=B7=B8=EB=A6=BC=20look-98.png?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- .../pattern-study/craft/great-wave/look-98.png | Bin 0 -> 77994 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 incoming/pattern-study/craft/great-wave/look-98.png diff --git a/incoming/pattern-study/craft/great-wave/look-98.png b/incoming/pattern-study/craft/great-wave/look-98.png new file mode 100644 index 0000000000000000000000000000000000000000..1e09c7002e29c57c0727b64f6f5ff9f8df3e6eda GIT binary patch literal 77994 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 Date: Mon, 2 Nov 2026 18:01:31 +0000 Subject: [PATCH 16/17] =?UTF-8?q?great-wave=2098=ED=8C=90=20=EB=B0=94?= =?UTF-8?q?=ED=80=B4=20=EB=81=9D:=20=EB=91=90=20=EB=B2=88=20=EC=B1=84?= =?UTF-8?q?=EC=A0=90=20=ED=81=90=EB=A0=88=EC=9D=B4=ED=84=B0=206=C2=B77,=20?= =?UTF-8?q?=ED=8C=90=ED=99=94=EA=B0=80=207=C2=B77,=20=EB=B2=BD=EC=97=90=20?= =?UTF-8?q?=EA=B1=B0=EB=8A=94=20=EC=82=AC=EB=9E=8C=207=C2=B77?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/craft/great-wave/log.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/incoming/pattern-study/craft/great-wave/log.md b/incoming/pattern-study/craft/great-wave/log.md index 702727f1..23737e86 100644 --- a/incoming/pattern-study/craft/great-wave/log.md +++ b/incoming/pattern-study/craft/great-wave/log.md @@ -65,3 +65,12 @@ - A/B: 큐레이터 새(정순 「주황 뱃전 위에 노 젓는 사람들이 점으로 줄지어」, 역순 「옅은 살구빛 선체 위에 웅크린 뱃사공들」) · 판화가 새(「배 길이 내내 칼로 새긴 노꾼의 줄」, 「원작처럼 바랜 담황색」) · 벽에 거는 사람 같음(정순 옛 「옅은 황토색 위에 짙은 파란 물점이 박혀 얼룩져 보임」, 역순 같음) - 버린 판정: 없음 - 되돌림. 짚은 렌즈 셋 가운데 벽에 거는 사람이 새가 아니에요. 2m 패널에서 남색 등은 노꾼이 아니라 갑판의 얼룩으로 읽혔어요. 배의 첫 되돌림이에요 + +## 바퀴 끝 +- 패스 5 (채택 2 · 되돌림 3 · 막힘 1). 끝 판은 패스 3 의 판(6ce73b6 의 파일)이에요 +- 두 번 채점: 큐레이터 6,7 · 판화가 7,7 · 벽에 거는 사람 7,7 · 블라인드 읽기 3/3(「가쓰시카 호쿠사이의 가나가와 해변의 높은 파도 아래, 우키요에 목판화의 평면 색면」) +- 두 번 채점의 가장 약한 것: 큐레이터 ① 「폭이 고른 가는 갈고리, 안쪽 빈 크림 구멍이 화면 3분의 1」, ⑤ 「갈퀴가 마루 안쪽 덩어리 서너 개, 바깥 테두리는 매끈한 흰 선」 · 판화가 ④ 「발톱이 K·W·종이 구멍이 번갈아 놓인 레이스」 둘 다 · 벽에 거는 사람 ① 배 「모래톱이나 붓자국」, ⑤ 배 「판자나 모래톱」 +- 장거리 A/B: 길 a 의 첫 바퀴라 건너뜀 +- 닮은꼴: 작품 3 은 원작을 닮는 것이 일이라 받지 않음 +- 걸린 멈춤: 없음(되돌림 이어짐 둘, 막힘 하나 · ① 큰 파도 몸통 기둥) +- 창작자에게: 큰 파도는 3초 안에 호쿠사이로 읽혀요. 판정이 갈린 곳은 배예요. 패스 5 의 노꾼은 큐레이터와 판화가가 새 판으로 골랐는데 2m 관객 눈에는 갑판 얼룩이었어요 From 4e9b6de8e8fa8e7add2a9dda79fea2dc0fb29ca8 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Nov 2026 18:41:47 +0000 Subject: [PATCH 17/17] =?UTF-8?q?great-wave=2098=ED=8C=90:=20index.html=20?= =?UTF-8?q?=EC=9D=84=20=EB=8B=A4=EC=8B=9C=20=EC=A7=93=EB=8A=94=EB=8B=A4(73?= =?UTF-8?q?6=20of=20736)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Bc4JkpqeAVmxK8AcbmaBt6 --- incoming/pattern-study/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/incoming/pattern-study/index.html b/incoming/pattern-study/index.html index afa4a7fa..850e30c4 100644 --- a/incoming/pattern-study/index.html +++ b/incoming/pattern-study/index.html @@ -210,8 +210,8 @@

패턴 연구

- - + +