386 lines
15 KiB
JavaScript
386 lines
15 KiB
JavaScript
|
|
/* ============================================================
|
||
|
|
qft-variations-perturb.mjs — sketch 08.
|
||
|
|
New mechanics — fields perturbed BY their own physics:
|
||
|
|
|
||
|
|
WAVEPACKETS — Gaussian local perturbation of the cubic
|
||
|
|
(and schlegel) lattice; vertices push radially outward
|
||
|
|
under a bell-curve falloff. The "particle" is now a
|
||
|
|
feature OF the field, not a separate object placed on it.
|
||
|
|
|
||
|
|
RIPPLES — concentric expanding wavefronts from a source
|
||
|
|
point. Each ring a many-segmented polyline; renderer
|
||
|
|
applies propagator decoration to each chord.
|
||
|
|
|
||
|
|
Plus DENSER cubic (cubicN=2 → 125 vertices / ~300 edges) so
|
||
|
|
more grid lines show the wavepacket distortion clearly.
|
||
|
|
Output → output/qft/sketch08/
|
||
|
|
============================================================ */
|
||
|
|
import { writeFileSync, mkdirSync } from 'node:fs';
|
||
|
|
import { generateQFTScene } from '../src/qft/scene.js';
|
||
|
|
import { paramsFromSeed } from '../src/qft/params.js';
|
||
|
|
import { renderQFTSVG } from '../src/qft/renderer.js';
|
||
|
|
|
||
|
|
const BASE_SEED = 'FEYNMAN-7167';
|
||
|
|
const OUT_DIR = 'output/qft/sketch08';
|
||
|
|
const SIZE = 1800;
|
||
|
|
mkdirSync(OUT_DIR, { recursive: true });
|
||
|
|
|
||
|
|
const F = (hueStart, hueEnd, saturation, lightness, opacity, stroke) => {
|
||
|
|
const f = { hueStart, hueEnd, saturation, lightness, opacity };
|
||
|
|
if (stroke != null) f.stroke = stroke;
|
||
|
|
return f;
|
||
|
|
};
|
||
|
|
const paper = (flat, glowInDelta = [16, 14, 12], glowOutDelta = [-22, -20, -18]) => ({
|
||
|
|
flat,
|
||
|
|
glowIn: [flat[0] + glowInDelta[0], flat[1] + glowInDelta[1], flat[2] + glowInDelta[2]],
|
||
|
|
glowOut: [flat[0] + glowOutDelta[0], flat[1] + glowOutDelta[1], flat[2] + glowOutDelta[2]],
|
||
|
|
});
|
||
|
|
|
||
|
|
// Wavepacket helper: pos + amp + sigma
|
||
|
|
const W = (x, y, amplitude, sigma) => ({ x, y, amplitude, sigma });
|
||
|
|
// Ripple helper: pos + ring count + r0 + dR + optional propagator
|
||
|
|
const R = (x, y, count = 6, r0 = 0.06, dR = 0.09, propagator = 'photon') =>
|
||
|
|
({ x, y, count, r0, dR, propagator });
|
||
|
|
|
||
|
|
const BASE = {
|
||
|
|
cubicN: 2, // DENSER cubic — more grid lines so wavepacket bulges read
|
||
|
|
photonCyclesPerUnit: 14,
|
||
|
|
segmentsPerEdge: 8, // fewer segments per edge — denser mesh + many circles
|
||
|
|
linkCount: 8,
|
||
|
|
e8Style: 'nautilus',
|
||
|
|
nautilusTurns: 2.4, nautilusPerTurn: 14, nautilusGrowth: 0.22,
|
||
|
|
};
|
||
|
|
|
||
|
|
const variations = [
|
||
|
|
{
|
||
|
|
name: '01_single-wavepacket-bulge',
|
||
|
|
label: 'Single wavepacket · lattice bulges around a centred particle',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([198, 198, 215]),
|
||
|
|
vignOverride: [60, 55, 75], featureOverride: [40, 40, 60],
|
||
|
|
cubicScale: 1.55, schlegelScale: 1.45,
|
||
|
|
schlegelInnerR: 0.40, schlegelRot3D: 0.45,
|
||
|
|
wavepackets: [W(0, 0, 0.085, 0.16)], // single positive bulge at centre
|
||
|
|
e8Origins: [], linkCount: 6,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.60, 0.70, 0.50, 0.40, 0.60, 1.1),
|
||
|
|
schlegel: F(0.62, 0.72, 0.55, 0.35, 0.78, 2.0),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0, 0, 0, 0.5, 0),
|
||
|
|
links: F(0.05, 0.12, 0.85, 0.50, 0.92, 2.2),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '02_two-wavepackets-interference',
|
||
|
|
label: 'Two wavepackets · interference bulges between them',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([180, 175, 195]),
|
||
|
|
vignOverride: [55, 50, 70], featureOverride: [40, 40, 55],
|
||
|
|
cubicScale: 1.60, schlegelScale: 1.30,
|
||
|
|
schlegelInnerR: 0.42, schlegelRot3D: 0.55,
|
||
|
|
wavepackets: [W(-0.32, 0, 0.075, 0.15), W(0.32, 0, 0.075, 0.15)],
|
||
|
|
e8Origins: [], linkCount: 8,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.55, 0.68, 0.50, 0.40, 0.62, 1.1),
|
||
|
|
schlegel: F(0.60, 0.74, 0.55, 0.35, 0.75, 1.8),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0, 0, 0, 0.5, 0),
|
||
|
|
links: F(0.10, 0.04, 0.90, 0.55, 0.95, 2.4),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '03_wavepacket-dimple',
|
||
|
|
label: 'Wavepacket dimple · inward pull (negative amplitude)',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([175, 170, 160]),
|
||
|
|
vignOverride: [60, 55, 45], featureOverride: [50, 45, 35],
|
||
|
|
cubicScale: 1.55, schlegelScale: 1.30,
|
||
|
|
schlegelInnerR: 0.38, schlegelRot3D: 0.50,
|
||
|
|
wavepackets: [W(0, 0, -0.075, 0.18)], // negative = pull vertices INWARD
|
||
|
|
e8Origins: [{ x: 0, y: 0, scale: 0.32 }],
|
||
|
|
linkCount: 8,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.05, 0.13, 0.55, 0.38, 0.60, 1.1),
|
||
|
|
schlegel: F(0.06, 0.14, 0.55, 0.35, 0.72, 1.8),
|
||
|
|
e8: F(0.08, 0.18, 0.85, 0.55, 0.92, 2.0),
|
||
|
|
ripple: F(0, 0, 0, 0.5, 0),
|
||
|
|
links: F(0.50, 0.10, 0.95, 0.55, 0.95, 2.4),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '04_ripples-single-source',
|
||
|
|
label: 'Single ripple source · concentric wavefronts expanding from origin',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([170, 175, 190]),
|
||
|
|
vignOverride: [50, 55, 70], featureOverride: [40, 45, 60],
|
||
|
|
cubicScale: 1.55, schlegelScale: 1.25,
|
||
|
|
schlegelInnerR: 0.40, schlegelRot3D: 0.45,
|
||
|
|
ripples: [R(0, 0, 7, 0.06, 0.10)],
|
||
|
|
e8Origins: [], linkCount: 8,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.55, 0.62, 0.40, 0.42, 0.45, 0.9),
|
||
|
|
schlegel: F(0.55, 0.68, 0.45, 0.38, 0.65, 1.6),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0.08, 0.18, 0.85, 0.55, 0.90, 2.4), // hot amber rings
|
||
|
|
links: F(0.05, 0.13, 0.90, 0.55, 0.92, 2.2),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '05_two-ripple-sources-interfering',
|
||
|
|
label: 'Two ripple sources interfering · double-slit feel',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([170, 175, 190]),
|
||
|
|
vignOverride: [50, 55, 70], featureOverride: [40, 45, 60],
|
||
|
|
cubicScale: 1.55, schlegelScale: 1.25,
|
||
|
|
ripples: [R(-0.30, 0, 6, 0.05, 0.09), R(0.30, 0, 6, 0.05, 0.09)],
|
||
|
|
e8Origins: [], linkCount: 8,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.55, 0.62, 0.40, 0.42, 0.45, 0.9),
|
||
|
|
schlegel: F(0.55, 0.68, 0.45, 0.38, 0.60, 1.4),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0.50, 0.62, 0.85, 0.50, 0.88, 2.4), // cyan rings
|
||
|
|
links: F(0.05, 0.13, 0.90, 0.55, 0.92, 2.2),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '06_schrodinger-atom',
|
||
|
|
label: 'Schrödinger atom · wavepacket + ripples at the SAME centre',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([180, 175, 165]),
|
||
|
|
vignOverride: [60, 55, 45], featureOverride: [55, 45, 35],
|
||
|
|
cubicScale: 1.55, schlegelScale: 1.40,
|
||
|
|
schlegelInnerR: 0.38, schlegelRot3D: 0.50,
|
||
|
|
wavepackets: [W(0, 0, 0.080, 0.18)],
|
||
|
|
ripples: [R(0, 0, 5, 0.18, 0.12)], // ripples start at larger r0 (outside the wavepacket)
|
||
|
|
e8Origins: [], linkCount: 10,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.06, 0.14, 0.55, 0.40, 0.55, 1.0),
|
||
|
|
schlegel: F(0.08, 0.18, 0.60, 0.36, 0.75, 1.8),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0.10, 0.04, 0.95, 0.55, 0.92, 2.6),
|
||
|
|
links: F(0.95, 0.10, 0.95, 0.55, 0.95, 2.4),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '07_dense-cubic-with-wavepacket',
|
||
|
|
label: 'Dense cubic + wavepacket · more grid lines show the distortion',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([185, 180, 200]),
|
||
|
|
vignOverride: [50, 50, 70], featureOverride: [40, 40, 55],
|
||
|
|
cubicN: 2,
|
||
|
|
cubicScale: 1.50, schlegelScale: 0.95,
|
||
|
|
wavepackets: [W(0.20, -0.10, 0.090, 0.18)],
|
||
|
|
e8Origins: [], linkCount: 7,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.50, 0.72, 0.55, 0.42, 0.50, 0.8), // dense + thin
|
||
|
|
schlegel: F(0.60, 0.78, 0.50, 0.38, 0.60, 1.6),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0, 0, 0, 0.5, 0),
|
||
|
|
links: F(0.06, 0.14, 0.90, 0.55, 0.92, 2.2),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '08_dense-cubic-with-ripples',
|
||
|
|
label: 'Dense cubic backdrop · ripples expanding through it',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([195, 180, 165]),
|
||
|
|
vignOverride: [70, 55, 40], featureOverride: [55, 45, 30],
|
||
|
|
cubicN: 2,
|
||
|
|
cubicScale: 1.50, schlegelScale: 0.95,
|
||
|
|
ripples: [R(0, 0, 8, 0.07, 0.085)],
|
||
|
|
e8Origins: [], linkCount: 8,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.06, 0.16, 0.50, 0.40, 0.48, 0.8),
|
||
|
|
schlegel: F(0.06, 0.14, 0.45, 0.38, 0.55, 1.4),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0.06, 0.18, 0.95, 0.50, 0.92, 2.6),
|
||
|
|
links: F(0.95, 0.10, 0.92, 0.55, 0.92, 2.4),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '09_multi-particles-with-ripples-and-nautilus',
|
||
|
|
label: 'Multiple wavepackets + ripples + nautilus chain · fully tangled',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([175, 170, 175]),
|
||
|
|
vignOverride: [55, 50, 60], featureOverride: [45, 40, 50],
|
||
|
|
cubicScale: 1.55, schlegelScale: 1.50,
|
||
|
|
schlegelInnerR: 0.40, schlegelRot3D: 0.50,
|
||
|
|
wavepackets: [W(-0.30, -0.30, 0.060, 0.14), W(0.30, 0.30, 0.060, 0.14)],
|
||
|
|
ripples: [R(-0.30, -0.30, 4, 0.08, 0.08), R(0.30, 0.30, 4, 0.08, 0.08)],
|
||
|
|
e8Origins: [{ x: 0, y: 0, scale: 0.35 }],
|
||
|
|
linkCount: 12,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.55, 0.85, 0.50, 0.40, 0.52, 0.9),
|
||
|
|
schlegel: F(0.60, 0.85, 0.55, 0.36, 0.72, 1.6),
|
||
|
|
e8: F(0.05, 0.15, 0.85, 0.55, 0.90, 2.0),
|
||
|
|
ripple: F(0.50, 0.80, 0.90, 0.50, 0.90, 2.2),
|
||
|
|
links: F(0.95, 0.08, 0.95, 0.55, 0.95, 2.4),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '10_ripple-field-dominant',
|
||
|
|
label: 'Ripple field dominant · five concentric expansions across the canvas',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([165, 165, 180]),
|
||
|
|
vignOverride: [50, 50, 60], featureOverride: [40, 40, 55],
|
||
|
|
cubicScale: 1.45, schlegelScale: 0,
|
||
|
|
ripples: [
|
||
|
|
R(-0.45, -0.45, 4, 0.05, 0.08),
|
||
|
|
R( 0.45, -0.45, 4, 0.05, 0.08),
|
||
|
|
R(-0.45, 0.45, 4, 0.05, 0.08),
|
||
|
|
R( 0.45, 0.45, 4, 0.05, 0.08),
|
||
|
|
R( 0.00, 0.00, 6, 0.06, 0.10),
|
||
|
|
],
|
||
|
|
e8Origins: [], linkCount: 10,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.50, 0.62, 0.40, 0.42, 0.40, 0.8),
|
||
|
|
schlegel: F(0, 0, 0, 0.5, 0),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0.55, 0.85, 0.85, 0.50, 0.85, 2.0), // cool spectrum rings
|
||
|
|
links: F(0.50, 0.85, 0.95, 0.55, 0.92, 2.2),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '11_wavepacket-at-edge-cubic-bleed',
|
||
|
|
label: 'Wavepacket near edge · cubic bleeding · particle entering/leaving frame',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([185, 175, 155]),
|
||
|
|
vignOverride: [70, 55, 35], featureOverride: [60, 45, 25],
|
||
|
|
cubicScale: 1.80, schlegelScale: 1.30,
|
||
|
|
schlegelInnerR: 0.40, schlegelRot3D: 0.55,
|
||
|
|
wavepackets: [W(0.55, -0.25, 0.100, 0.20)],
|
||
|
|
ripples: [R(0.55, -0.25, 5, 0.05, 0.10)],
|
||
|
|
e8Origins: [], linkCount: 9,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.06, 0.14, 0.55, 0.38, 0.55, 1.0),
|
||
|
|
schlegel: F(0.04, 0.13, 0.60, 0.34, 0.78, 1.8),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0.10, 0.04, 0.95, 0.55, 0.92, 2.4),
|
||
|
|
links: F(0.50, 0.10, 0.95, 0.55, 0.95, 2.6),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '12_asymmetric-perturbed-field',
|
||
|
|
label: 'Asymmetric · wavepacket off-centre · everything biased',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([170, 175, 195]),
|
||
|
|
vignOverride: [50, 55, 70], featureOverride: [40, 45, 60],
|
||
|
|
cubicScale: 1.70, cubicOriginX: -0.10,
|
||
|
|
schlegelScale: 1.75, schlegelOriginX: -0.20,
|
||
|
|
schlegelInnerR: 0.42, schlegelRot3D: 0.40,
|
||
|
|
wavepackets: [W(-0.30, -0.20, 0.075, 0.16)],
|
||
|
|
ripples: [R(0.35, 0.30, 5, 0.05, 0.10)],
|
||
|
|
e8Origins: [{ x: 0.20, y: 0.45, scale: 0.32 }],
|
||
|
|
linkCount: 12,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.55, 0.68, 0.45, 0.40, 0.50, 1.0),
|
||
|
|
schlegel: F(0.55, 0.70, 0.55, 0.36, 0.72, 1.8),
|
||
|
|
e8: F(0.05, 0.16, 0.85, 0.55, 0.92, 2.0),
|
||
|
|
ripple: F(0.50, 0.10, 0.95, 0.55, 0.90, 2.4),
|
||
|
|
links: F(0.95, 0.10, 0.95, 0.55, 0.95, 2.6),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '13_diatomic-two-particles-linked',
|
||
|
|
label: 'Diatomic · two wavepackets + ripples · molecular feel',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([185, 175, 175]),
|
||
|
|
vignOverride: [60, 50, 55], featureOverride: [45, 40, 45],
|
||
|
|
cubicScale: 1.60, schlegelScale: 1.30,
|
||
|
|
schlegelInnerR: 0.40, schlegelRot3D: 0.55,
|
||
|
|
wavepackets: [W(-0.25, 0, 0.075, 0.15), W(0.25, 0, 0.075, 0.15)],
|
||
|
|
ripples: [R(-0.25, 0, 4, 0.05, 0.08), R(0.25, 0, 4, 0.05, 0.08)],
|
||
|
|
e8Origins: [],
|
||
|
|
linkCount: 14, // dense bond-like links
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.85, 0.05, 0.50, 0.42, 0.52, 1.0),
|
||
|
|
schlegel: F(0.88, 0.05, 0.55, 0.38, 0.72, 1.6),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0.92, 0.06, 0.90, 0.50, 0.90, 2.2),
|
||
|
|
links: F(0.05, 0.16, 0.95, 0.55, 0.95, 2.6),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '14_field-cascade',
|
||
|
|
label: 'Field cascade · ripples at varied scales · ladder of disturbances',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([175, 165, 145]),
|
||
|
|
vignOverride: [65, 50, 30], featureOverride: [55, 45, 30],
|
||
|
|
cubicScale: 1.55, schlegelScale: 1.30,
|
||
|
|
schlegelInnerR: 0.40, schlegelRot3D: 0.50,
|
||
|
|
ripples: [
|
||
|
|
R(-0.50, 0.35, 3, 0.04, 0.05), // small tight ripples
|
||
|
|
R(-0.10, 0.05, 5, 0.06, 0.08), // medium
|
||
|
|
R( 0.40, -0.30, 7, 0.08, 0.12), // large widely spaced
|
||
|
|
],
|
||
|
|
e8Origins: [{ x: 0.40, y: 0.35, scale: 0.28 }],
|
||
|
|
linkCount: 11,
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.06, 0.14, 0.50, 0.40, 0.50, 1.0),
|
||
|
|
schlegel: F(0.05, 0.13, 0.55, 0.36, 0.70, 1.6),
|
||
|
|
e8: F(0.10, 0.18, 0.85, 0.55, 0.92, 2.0),
|
||
|
|
ripple: F(0.10, 0.04, 0.95, 0.55, 0.92, 2.4),
|
||
|
|
links: F(0.95, 0.06, 0.95, 0.55, 0.95, 2.6),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '15_quiet-single-ripple',
|
||
|
|
label: 'Quiet counter-example · single small ripple · contemplative',
|
||
|
|
overrides: {
|
||
|
|
...BASE,
|
||
|
|
paperOverride: paper([190, 185, 178]),
|
||
|
|
vignOverride: [55, 50, 45], featureOverride: [50, 45, 40],
|
||
|
|
cubicScale: 1.40, schlegelScale: 1.20,
|
||
|
|
schlegelInnerR: 0.40, schlegelRot3D: 0.45,
|
||
|
|
ripples: [R(0, 0, 4, 0.08, 0.10)],
|
||
|
|
e8Origins: [], linkCount: 4, // few links
|
||
|
|
fields: {
|
||
|
|
cubic: F(0.60, 0.68, 0.30, 0.42, 0.38, 0.8),
|
||
|
|
schlegel: F(0.62, 0.70, 0.40, 0.40, 0.55, 1.2),
|
||
|
|
e8: F(0, 0, 0, 0.5, 0),
|
||
|
|
ripple: F(0.08, 0.14, 0.70, 0.50, 0.82, 1.8),
|
||
|
|
links: F(0.06, 0.14, 0.75, 0.50, 0.80, 1.6),
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
];
|
||
|
|
|
||
|
|
const base = paramsFromSeed(BASE_SEED);
|
||
|
|
for (const v of variations) {
|
||
|
|
const params = { ...base, ...v.overrides };
|
||
|
|
if (v.overrides.fields) params.fields = v.overrides.fields;
|
||
|
|
const svg = renderQFTSVG(generateQFTScene(params), params, SIZE);
|
||
|
|
const path = `${OUT_DIR}/${v.name}.svg`;
|
||
|
|
writeFileSync(path, svg);
|
||
|
|
console.log(`ok ${v.name}`);
|
||
|
|
}
|
||
|
|
console.log(`\nrendered ${variations.length} variations → ${OUT_DIR}/`);
|