@dano796/react-reart 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +25 -0
- package/README.md +222 -0
- package/cli/build-registry.mjs +128 -0
- package/cli/index.js +396 -0
- package/cli/registry.json +873 -0
- package/dist/components/BackgroundStudio.d.ts +10 -0
- package/dist/components/BackgroundStudio.d.ts.map +1 -0
- package/dist/components/BackgroundStudio.js +268 -0
- package/dist/components/BackgroundStudio.js.map +1 -0
- package/dist/components/FlowCurrents.d.ts +24 -0
- package/dist/components/FlowCurrents.d.ts.map +1 -0
- package/dist/components/FlowCurrents.js +79 -0
- package/dist/components/FlowCurrents.js.map +1 -0
- package/dist/components/GeoPulse.d.ts +20 -0
- package/dist/components/GeoPulse.d.ts.map +1 -0
- package/dist/components/GeoPulse.js +72 -0
- package/dist/components/GeoPulse.js.map +1 -0
- package/dist/components/GravityStorm.d.ts +20 -0
- package/dist/components/GravityStorm.d.ts.map +1 -0
- package/dist/components/GravityStorm.js +72 -0
- package/dist/components/GravityStorm.js.map +1 -0
- package/dist/components/WaveEther.d.ts +21 -0
- package/dist/components/WaveEther.d.ts.map +1 -0
- package/dist/components/WaveEther.js +73 -0
- package/dist/components/WaveEther.js.map +1 -0
- package/dist/components/backgrounds/AmbientMesh.d.ts +38 -0
- package/dist/components/backgrounds/AmbientMesh.d.ts.map +1 -0
- package/dist/components/backgrounds/AmbientMesh.js +101 -0
- package/dist/components/backgrounds/AmbientMesh.js.map +1 -0
- package/dist/components/backgrounds/ArborealGrowth.d.ts +26 -0
- package/dist/components/backgrounds/ArborealGrowth.d.ts.map +1 -0
- package/dist/components/backgrounds/ArborealGrowth.js +78 -0
- package/dist/components/backgrounds/ArborealGrowth.js.map +1 -0
- package/dist/components/backgrounds/CliffordAttractor.d.ts +24 -0
- package/dist/components/backgrounds/CliffordAttractor.d.ts.map +1 -0
- package/dist/components/backgrounds/CliffordAttractor.js +86 -0
- package/dist/components/backgrounds/CliffordAttractor.js.map +1 -0
- package/dist/components/backgrounds/CrystallineDrift.d.ts +33 -0
- package/dist/components/backgrounds/CrystallineDrift.d.ts.map +1 -0
- package/dist/components/backgrounds/CrystallineDrift.js +101 -0
- package/dist/components/backgrounds/CrystallineDrift.js.map +1 -0
- package/dist/components/backgrounds/DifferentialGrowth.d.ts +9 -0
- package/dist/components/backgrounds/DifferentialGrowth.d.ts.map +1 -0
- package/dist/components/backgrounds/DifferentialGrowth.js +82 -0
- package/dist/components/backgrounds/DifferentialGrowth.js.map +1 -0
- package/dist/components/backgrounds/DoublePendulum.d.ts +9 -0
- package/dist/components/backgrounds/DoublePendulum.d.ts.map +1 -0
- package/dist/components/backgrounds/DoublePendulum.js +81 -0
- package/dist/components/backgrounds/DoublePendulum.js.map +1 -0
- package/dist/components/backgrounds/DragonCurve.d.ts +27 -0
- package/dist/components/backgrounds/DragonCurve.d.ts.map +1 -0
- package/dist/components/backgrounds/DragonCurve.js +79 -0
- package/dist/components/backgrounds/DragonCurve.js.map +1 -0
- package/dist/components/backgrounds/DragonFold.d.ts +31 -0
- package/dist/components/backgrounds/DragonFold.d.ts.map +1 -0
- package/dist/components/backgrounds/DragonFold.js +94 -0
- package/dist/components/backgrounds/DragonFold.js.map +1 -0
- package/dist/components/backgrounds/EmberCascade.d.ts +24 -0
- package/dist/components/backgrounds/EmberCascade.d.ts.map +1 -0
- package/dist/components/backgrounds/EmberCascade.js +88 -0
- package/dist/components/backgrounds/EmberCascade.js.map +1 -0
- package/dist/components/backgrounds/FibonacciVortex.d.ts +42 -0
- package/dist/components/backgrounds/FibonacciVortex.d.ts.map +1 -0
- package/dist/components/backgrounds/FibonacciVortex.js +151 -0
- package/dist/components/backgrounds/FibonacciVortex.js.map +1 -0
- package/dist/components/backgrounds/FlowCurrents.d.ts +35 -0
- package/dist/components/backgrounds/FlowCurrents.d.ts.map +1 -0
- package/dist/components/backgrounds/FlowCurrents.js +97 -0
- package/dist/components/backgrounds/FlowCurrents.js.map +1 -0
- package/dist/components/backgrounds/FractalNoiseTerrain.d.ts +9 -0
- package/dist/components/backgrounds/FractalNoiseTerrain.d.ts.map +1 -0
- package/dist/components/backgrounds/FractalNoiseTerrain.js +85 -0
- package/dist/components/backgrounds/FractalNoiseTerrain.js.map +1 -0
- package/dist/components/backgrounds/FractalTree.d.ts +35 -0
- package/dist/components/backgrounds/FractalTree.d.ts.map +1 -0
- package/dist/components/backgrounds/FractalTree.js +98 -0
- package/dist/components/backgrounds/FractalTree.js.map +1 -0
- package/dist/components/backgrounds/GeoPulse.d.ts +31 -0
- package/dist/components/backgrounds/GeoPulse.d.ts.map +1 -0
- package/dist/components/backgrounds/GeoPulse.js +89 -0
- package/dist/components/backgrounds/GeoPulse.js.map +1 -0
- package/dist/components/backgrounds/GravityStorm.d.ts +30 -0
- package/dist/components/backgrounds/GravityStorm.d.ts.map +1 -0
- package/dist/components/backgrounds/GravityStorm.js +89 -0
- package/dist/components/backgrounds/GravityStorm.js.map +1 -0
- package/dist/components/backgrounds/HarmonicLattice.d.ts +26 -0
- package/dist/components/backgrounds/HarmonicLattice.d.ts.map +1 -0
- package/dist/components/backgrounds/HarmonicLattice.js +89 -0
- package/dist/components/backgrounds/HarmonicLattice.js.map +1 -0
- package/dist/components/backgrounds/HexRipple.d.ts +44 -0
- package/dist/components/backgrounds/HexRipple.d.ts.map +1 -0
- package/dist/components/backgrounds/HexRipple.js +149 -0
- package/dist/components/backgrounds/HexRipple.js.map +1 -0
- package/dist/components/backgrounds/KochCrystal.d.ts +27 -0
- package/dist/components/backgrounds/KochCrystal.d.ts.map +1 -0
- package/dist/components/backgrounds/KochCrystal.js +79 -0
- package/dist/components/backgrounds/KochCrystal.js.map +1 -0
- package/dist/components/backgrounds/LissajousWeave.d.ts +23 -0
- package/dist/components/backgrounds/LissajousWeave.d.ts.map +1 -0
- package/dist/components/backgrounds/LissajousWeave.js +86 -0
- package/dist/components/backgrounds/LissajousWeave.js.map +1 -0
- package/dist/components/backgrounds/MoireLattice.d.ts +9 -0
- package/dist/components/backgrounds/MoireLattice.d.ts.map +1 -0
- package/dist/components/backgrounds/MoireLattice.js +81 -0
- package/dist/components/backgrounds/MoireLattice.js.map +1 -0
- package/dist/components/backgrounds/NebulaVeil.d.ts +28 -0
- package/dist/components/backgrounds/NebulaVeil.d.ts.map +1 -0
- package/dist/components/backgrounds/NebulaVeil.js +121 -0
- package/dist/components/backgrounds/NebulaVeil.js.map +1 -0
- package/dist/components/backgrounds/NeuralWeave.d.ts +9 -0
- package/dist/components/backgrounds/NeuralWeave.d.ts.map +1 -0
- package/dist/components/backgrounds/NeuralWeave.js +81 -0
- package/dist/components/backgrounds/NeuralWeave.js.map +1 -0
- package/dist/components/backgrounds/OrbitalResonance.d.ts +9 -0
- package/dist/components/backgrounds/OrbitalResonance.d.ts.map +1 -0
- package/dist/components/backgrounds/OrbitalResonance.js +86 -0
- package/dist/components/backgrounds/OrbitalResonance.js.map +1 -0
- package/dist/components/backgrounds/PhotonBurst.d.ts +41 -0
- package/dist/components/backgrounds/PhotonBurst.d.ts.map +1 -0
- package/dist/components/backgrounds/PhotonBurst.js +150 -0
- package/dist/components/backgrounds/PhotonBurst.js.map +1 -0
- package/dist/components/backgrounds/PhyllotaxisDream.d.ts +25 -0
- package/dist/components/backgrounds/PhyllotaxisDream.d.ts.map +1 -0
- package/dist/components/backgrounds/PhyllotaxisDream.js +88 -0
- package/dist/components/backgrounds/PhyllotaxisDream.js.map +1 -0
- package/dist/components/backgrounds/PlasmaField.d.ts +28 -0
- package/dist/components/backgrounds/PlasmaField.d.ts.map +1 -0
- package/dist/components/backgrounds/PlasmaField.js +117 -0
- package/dist/components/backgrounds/PlasmaField.js.map +1 -0
- package/dist/components/backgrounds/PrismaticWave.d.ts +46 -0
- package/dist/components/backgrounds/PrismaticWave.d.ts.map +1 -0
- package/dist/components/backgrounds/PrismaticWave.js +152 -0
- package/dist/components/backgrounds/PrismaticWave.js.map +1 -0
- package/dist/components/backgrounds/ReactionDiffusion.d.ts +9 -0
- package/dist/components/backgrounds/ReactionDiffusion.d.ts.map +1 -0
- package/dist/components/backgrounds/ReactionDiffusion.js +79 -0
- package/dist/components/backgrounds/ReactionDiffusion.js.map +1 -0
- package/dist/components/backgrounds/RecursiveSubdivision.d.ts +9 -0
- package/dist/components/backgrounds/RecursiveSubdivision.d.ts.map +1 -0
- package/dist/components/backgrounds/RecursiveSubdivision.js +84 -0
- package/dist/components/backgrounds/RecursiveSubdivision.js.map +1 -0
- package/dist/components/backgrounds/RecursiveTunnel.d.ts +44 -0
- package/dist/components/backgrounds/RecursiveTunnel.d.ts.map +1 -0
- package/dist/components/backgrounds/RecursiveTunnel.js +155 -0
- package/dist/components/backgrounds/RecursiveTunnel.js.map +1 -0
- package/dist/components/backgrounds/SierpinskiChaos.d.ts +32 -0
- package/dist/components/backgrounds/SierpinskiChaos.d.ts.map +1 -0
- package/dist/components/backgrounds/SierpinskiChaos.js +95 -0
- package/dist/components/backgrounds/SierpinskiChaos.js.map +1 -0
- package/dist/components/backgrounds/SierpinskiDust.d.ts +47 -0
- package/dist/components/backgrounds/SierpinskiDust.d.ts.map +1 -0
- package/dist/components/backgrounds/SierpinskiDust.js +148 -0
- package/dist/components/backgrounds/SierpinskiDust.js.map +1 -0
- package/dist/components/backgrounds/Spirograph.d.ts +24 -0
- package/dist/components/backgrounds/Spirograph.d.ts.map +1 -0
- package/dist/components/backgrounds/Spirograph.js +86 -0
- package/dist/components/backgrounds/Spirograph.js.map +1 -0
- package/dist/components/backgrounds/TideHarmonics.d.ts +9 -0
- package/dist/components/backgrounds/TideHarmonics.d.ts.map +1 -0
- package/dist/components/backgrounds/TideHarmonics.js +80 -0
- package/dist/components/backgrounds/TideHarmonics.js.map +1 -0
- package/dist/components/backgrounds/VoronoiMosaic.d.ts +9 -0
- package/dist/components/backgrounds/VoronoiMosaic.d.ts.map +1 -0
- package/dist/components/backgrounds/VoronoiMosaic.js +76 -0
- package/dist/components/backgrounds/VoronoiMosaic.js.map +1 -0
- package/dist/components/backgrounds/VortexBloom.d.ts +36 -0
- package/dist/components/backgrounds/VortexBloom.d.ts.map +1 -0
- package/dist/components/backgrounds/VortexBloom.js +101 -0
- package/dist/components/backgrounds/VortexBloom.js.map +1 -0
- package/dist/components/backgrounds/WaveEther.d.ts +32 -0
- package/dist/components/backgrounds/WaveEther.d.ts.map +1 -0
- package/dist/components/backgrounds/WaveEther.js +91 -0
- package/dist/components/backgrounds/WaveEther.js.map +1 -0
- package/dist/components/backgrounds/archived/CliffordAttractor.d.ts +24 -0
- package/dist/components/backgrounds/archived/CliffordAttractor.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/CliffordAttractor.js +86 -0
- package/dist/components/backgrounds/archived/CliffordAttractor.js.map +1 -0
- package/dist/components/backgrounds/archived/CrystallineDrift.d.ts +33 -0
- package/dist/components/backgrounds/archived/CrystallineDrift.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/CrystallineDrift.js +101 -0
- package/dist/components/backgrounds/archived/CrystallineDrift.js.map +1 -0
- package/dist/components/backgrounds/archived/DifferentialGrowth.d.ts +9 -0
- package/dist/components/backgrounds/archived/DifferentialGrowth.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/DifferentialGrowth.js +82 -0
- package/dist/components/backgrounds/archived/DifferentialGrowth.js.map +1 -0
- package/dist/components/backgrounds/archived/DoublePendulum.d.ts +9 -0
- package/dist/components/backgrounds/archived/DoublePendulum.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/DoublePendulum.js +81 -0
- package/dist/components/backgrounds/archived/DoublePendulum.js.map +1 -0
- package/dist/components/backgrounds/archived/EmberCascade.d.ts +24 -0
- package/dist/components/backgrounds/archived/EmberCascade.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/EmberCascade.js +88 -0
- package/dist/components/backgrounds/archived/EmberCascade.js.map +1 -0
- package/dist/components/backgrounds/archived/GravityStorm.d.ts +30 -0
- package/dist/components/backgrounds/archived/GravityStorm.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/GravityStorm.js +89 -0
- package/dist/components/backgrounds/archived/GravityStorm.js.map +1 -0
- package/dist/components/backgrounds/archived/ReactionDiffusion.d.ts +9 -0
- package/dist/components/backgrounds/archived/ReactionDiffusion.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/ReactionDiffusion.js +79 -0
- package/dist/components/backgrounds/archived/ReactionDiffusion.js.map +1 -0
- package/dist/components/backgrounds/archived/Spirograph.d.ts +24 -0
- package/dist/components/backgrounds/archived/Spirograph.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/Spirograph.js +86 -0
- package/dist/components/backgrounds/archived/Spirograph.js.map +1 -0
- package/dist/components/backgrounds/archived/VortexBloom.d.ts +36 -0
- package/dist/components/backgrounds/archived/VortexBloom.d.ts.map +1 -0
- package/dist/components/backgrounds/archived/VortexBloom.js +101 -0
- package/dist/components/backgrounds/archived/VortexBloom.js.map +1 -0
- package/dist/components/engines/ambientMesh.d.ts +31 -0
- package/dist/components/engines/ambientMesh.d.ts.map +1 -0
- package/dist/components/engines/ambientMesh.js +123 -0
- package/dist/components/engines/ambientMesh.js.map +1 -0
- package/dist/components/engines/arborealGrowth.d.ts +49 -0
- package/dist/components/engines/arborealGrowth.d.ts.map +1 -0
- package/dist/components/engines/arborealGrowth.js +220 -0
- package/dist/components/engines/arborealGrowth.js.map +1 -0
- package/dist/components/engines/archived/cliffordAttractor.d.ts +31 -0
- package/dist/components/engines/archived/cliffordAttractor.d.ts.map +1 -0
- package/dist/components/engines/archived/cliffordAttractor.js +71 -0
- package/dist/components/engines/archived/cliffordAttractor.js.map +1 -0
- package/dist/components/engines/archived/crystallineDrift.d.ts +31 -0
- package/dist/components/engines/archived/crystallineDrift.d.ts.map +1 -0
- package/dist/components/engines/archived/crystallineDrift.js +117 -0
- package/dist/components/engines/archived/crystallineDrift.js.map +1 -0
- package/dist/components/engines/archived/differentialGrowth.d.ts +39 -0
- package/dist/components/engines/archived/differentialGrowth.d.ts.map +1 -0
- package/dist/components/engines/archived/differentialGrowth.js +139 -0
- package/dist/components/engines/archived/differentialGrowth.js.map +1 -0
- package/dist/components/engines/archived/doublePendulum.d.ts +41 -0
- package/dist/components/engines/archived/doublePendulum.d.ts.map +1 -0
- package/dist/components/engines/archived/doublePendulum.js +97 -0
- package/dist/components/engines/archived/doublePendulum.js.map +1 -0
- package/dist/components/engines/archived/emberCascade.d.ts +45 -0
- package/dist/components/engines/archived/emberCascade.d.ts.map +1 -0
- package/dist/components/engines/archived/emberCascade.js +137 -0
- package/dist/components/engines/archived/emberCascade.js.map +1 -0
- package/dist/components/engines/archived/gravityStorm.d.ts +39 -0
- package/dist/components/engines/archived/gravityStorm.d.ts.map +1 -0
- package/dist/components/engines/archived/gravityStorm.js +124 -0
- package/dist/components/engines/archived/gravityStorm.js.map +1 -0
- package/dist/components/engines/archived/reactionDiffusion.d.ts +32 -0
- package/dist/components/engines/archived/reactionDiffusion.d.ts.map +1 -0
- package/dist/components/engines/archived/reactionDiffusion.js +99 -0
- package/dist/components/engines/archived/reactionDiffusion.js.map +1 -0
- package/dist/components/engines/archived/spirograph.d.ts +31 -0
- package/dist/components/engines/archived/spirograph.d.ts.map +1 -0
- package/dist/components/engines/archived/spirograph.js +82 -0
- package/dist/components/engines/archived/spirograph.js.map +1 -0
- package/dist/components/engines/archived/vortexBloom.d.ts +49 -0
- package/dist/components/engines/archived/vortexBloom.d.ts.map +1 -0
- package/dist/components/engines/archived/vortexBloom.js +151 -0
- package/dist/components/engines/archived/vortexBloom.js.map +1 -0
- package/dist/components/engines/cliffordAttractor.d.ts +31 -0
- package/dist/components/engines/cliffordAttractor.d.ts.map +1 -0
- package/dist/components/engines/cliffordAttractor.js +71 -0
- package/dist/components/engines/cliffordAttractor.js.map +1 -0
- package/dist/components/engines/crystallineDrift.d.ts +31 -0
- package/dist/components/engines/crystallineDrift.d.ts.map +1 -0
- package/dist/components/engines/crystallineDrift.js +117 -0
- package/dist/components/engines/crystallineDrift.js.map +1 -0
- package/dist/components/engines/differentialGrowth.d.ts +39 -0
- package/dist/components/engines/differentialGrowth.d.ts.map +1 -0
- package/dist/components/engines/differentialGrowth.js +139 -0
- package/dist/components/engines/differentialGrowth.js.map +1 -0
- package/dist/components/engines/doublePendulum.d.ts +41 -0
- package/dist/components/engines/doublePendulum.d.ts.map +1 -0
- package/dist/components/engines/doublePendulum.js +97 -0
- package/dist/components/engines/doublePendulum.js.map +1 -0
- package/dist/components/engines/dragonCurve.d.ts +46 -0
- package/dist/components/engines/dragonCurve.d.ts.map +1 -0
- package/dist/components/engines/dragonCurve.js +178 -0
- package/dist/components/engines/dragonCurve.js.map +1 -0
- package/dist/components/engines/dragonFold.d.ts +28 -0
- package/dist/components/engines/dragonFold.d.ts.map +1 -0
- package/dist/components/engines/dragonFold.js +166 -0
- package/dist/components/engines/dragonFold.js.map +1 -0
- package/dist/components/engines/emberCascade.d.ts +45 -0
- package/dist/components/engines/emberCascade.d.ts.map +1 -0
- package/dist/components/engines/emberCascade.js +137 -0
- package/dist/components/engines/emberCascade.js.map +1 -0
- package/dist/components/engines/fibonacciVortex.d.ts +70 -0
- package/dist/components/engines/fibonacciVortex.d.ts.map +1 -0
- package/dist/components/engines/fibonacciVortex.js +144 -0
- package/dist/components/engines/fibonacciVortex.js.map +1 -0
- package/dist/components/engines/flowCurrents.d.ts +34 -0
- package/dist/components/engines/flowCurrents.d.ts.map +1 -0
- package/dist/components/engines/flowCurrents.js +89 -0
- package/dist/components/engines/flowCurrents.js.map +1 -0
- package/dist/components/engines/fractalNoiseTerrain.d.ts +32 -0
- package/dist/components/engines/fractalNoiseTerrain.d.ts.map +1 -0
- package/dist/components/engines/fractalNoiseTerrain.js +89 -0
- package/dist/components/engines/fractalNoiseTerrain.js.map +1 -0
- package/dist/components/engines/fractalTree.d.ts +20 -0
- package/dist/components/engines/fractalTree.d.ts.map +1 -0
- package/dist/components/engines/fractalTree.js +92 -0
- package/dist/components/engines/fractalTree.js.map +1 -0
- package/dist/components/engines/geoPulse.d.ts +33 -0
- package/dist/components/engines/geoPulse.d.ts.map +1 -0
- package/dist/components/engines/geoPulse.js +116 -0
- package/dist/components/engines/geoPulse.js.map +1 -0
- package/dist/components/engines/gravityStorm.d.ts +39 -0
- package/dist/components/engines/gravityStorm.d.ts.map +1 -0
- package/dist/components/engines/gravityStorm.js +124 -0
- package/dist/components/engines/gravityStorm.js.map +1 -0
- package/dist/components/engines/harmonicLattice.d.ts +38 -0
- package/dist/components/engines/harmonicLattice.d.ts.map +1 -0
- package/dist/components/engines/harmonicLattice.js +87 -0
- package/dist/components/engines/harmonicLattice.js.map +1 -0
- package/dist/components/engines/hexRipple.d.ts +61 -0
- package/dist/components/engines/hexRipple.d.ts.map +1 -0
- package/dist/components/engines/hexRipple.js +157 -0
- package/dist/components/engines/hexRipple.js.map +1 -0
- package/dist/components/engines/kochCrystal.d.ts +47 -0
- package/dist/components/engines/kochCrystal.d.ts.map +1 -0
- package/dist/components/engines/kochCrystal.js +177 -0
- package/dist/components/engines/kochCrystal.js.map +1 -0
- package/dist/components/engines/lissajousWeave.d.ts +38 -0
- package/dist/components/engines/lissajousWeave.d.ts.map +1 -0
- package/dist/components/engines/lissajousWeave.js +83 -0
- package/dist/components/engines/lissajousWeave.js.map +1 -0
- package/dist/components/engines/moireLattice.d.ts +28 -0
- package/dist/components/engines/moireLattice.d.ts.map +1 -0
- package/dist/components/engines/moireLattice.js +47 -0
- package/dist/components/engines/moireLattice.js.map +1 -0
- package/dist/components/engines/nebulaVeil.d.ts +38 -0
- package/dist/components/engines/nebulaVeil.d.ts.map +1 -0
- package/dist/components/engines/nebulaVeil.js +177 -0
- package/dist/components/engines/nebulaVeil.js.map +1 -0
- package/dist/components/engines/neuralWeave.d.ts +53 -0
- package/dist/components/engines/neuralWeave.d.ts.map +1 -0
- package/dist/components/engines/neuralWeave.js +165 -0
- package/dist/components/engines/neuralWeave.js.map +1 -0
- package/dist/components/engines/orbitalResonance.d.ts +50 -0
- package/dist/components/engines/orbitalResonance.d.ts.map +1 -0
- package/dist/components/engines/orbitalResonance.js +94 -0
- package/dist/components/engines/orbitalResonance.js.map +1 -0
- package/dist/components/engines/photonBurst.d.ts +43 -0
- package/dist/components/engines/photonBurst.d.ts.map +1 -0
- package/dist/components/engines/photonBurst.js +204 -0
- package/dist/components/engines/photonBurst.js.map +1 -0
- package/dist/components/engines/phyllotaxisDream.d.ts +28 -0
- package/dist/components/engines/phyllotaxisDream.d.ts.map +1 -0
- package/dist/components/engines/phyllotaxisDream.js +75 -0
- package/dist/components/engines/phyllotaxisDream.js.map +1 -0
- package/dist/components/engines/plasmaField.d.ts +44 -0
- package/dist/components/engines/plasmaField.d.ts.map +1 -0
- package/dist/components/engines/plasmaField.js +227 -0
- package/dist/components/engines/plasmaField.js.map +1 -0
- package/dist/components/engines/prismaticWave.d.ts +39 -0
- package/dist/components/engines/prismaticWave.d.ts.map +1 -0
- package/dist/components/engines/prismaticWave.js +158 -0
- package/dist/components/engines/prismaticWave.js.map +1 -0
- package/dist/components/engines/reactionDiffusion.d.ts +32 -0
- package/dist/components/engines/reactionDiffusion.d.ts.map +1 -0
- package/dist/components/engines/reactionDiffusion.js +99 -0
- package/dist/components/engines/reactionDiffusion.js.map +1 -0
- package/dist/components/engines/recursiveSubdivision.d.ts +40 -0
- package/dist/components/engines/recursiveSubdivision.d.ts.map +1 -0
- package/dist/components/engines/recursiveSubdivision.js +133 -0
- package/dist/components/engines/recursiveSubdivision.js.map +1 -0
- package/dist/components/engines/recursiveTunnel.d.ts +66 -0
- package/dist/components/engines/recursiveTunnel.d.ts.map +1 -0
- package/dist/components/engines/recursiveTunnel.js +152 -0
- package/dist/components/engines/recursiveTunnel.js.map +1 -0
- package/dist/components/engines/sierpinskiChaos.d.ts +41 -0
- package/dist/components/engines/sierpinskiChaos.d.ts.map +1 -0
- package/dist/components/engines/sierpinskiChaos.js +118 -0
- package/dist/components/engines/sierpinskiChaos.js.map +1 -0
- package/dist/components/engines/sierpinskiDust.d.ts +72 -0
- package/dist/components/engines/sierpinskiDust.d.ts.map +1 -0
- package/dist/components/engines/sierpinskiDust.js +152 -0
- package/dist/components/engines/sierpinskiDust.js.map +1 -0
- package/dist/components/engines/spirograph.d.ts +31 -0
- package/dist/components/engines/spirograph.d.ts.map +1 -0
- package/dist/components/engines/spirograph.js +82 -0
- package/dist/components/engines/spirograph.js.map +1 -0
- package/dist/components/engines/tideHarmonics.d.ts +37 -0
- package/dist/components/engines/tideHarmonics.d.ts.map +1 -0
- package/dist/components/engines/tideHarmonics.js +71 -0
- package/dist/components/engines/tideHarmonics.js.map +1 -0
- package/dist/components/engines/voronoiMosaic.d.ts +37 -0
- package/dist/components/engines/voronoiMosaic.d.ts.map +1 -0
- package/dist/components/engines/voronoiMosaic.js +130 -0
- package/dist/components/engines/voronoiMosaic.js.map +1 -0
- package/dist/components/engines/vortexBloom.d.ts +49 -0
- package/dist/components/engines/vortexBloom.d.ts.map +1 -0
- package/dist/components/engines/vortexBloom.js +151 -0
- package/dist/components/engines/vortexBloom.js.map +1 -0
- package/dist/components/engines/waveEther.d.ts +30 -0
- package/dist/components/engines/waveEther.d.ts.map +1 -0
- package/dist/components/engines/waveEther.js +74 -0
- package/dist/components/engines/waveEther.js.map +1 -0
- package/dist/components/schemas/index.d.ts +131 -0
- package/dist/components/schemas/index.d.ts.map +1 -0
- package/dist/components/schemas/index.js +478 -0
- package/dist/components/schemas/index.js.map +1 -0
- package/dist/components/utils/noise.d.ts +38 -0
- package/dist/components/utils/noise.d.ts.map +1 -0
- package/dist/components/utils/noise.js +132 -0
- package/dist/components/utils/noise.js.map +1 -0
- package/dist/engines/flowCurrents.d.ts +34 -0
- package/dist/engines/flowCurrents.d.ts.map +1 -0
- package/dist/engines/flowCurrents.js +89 -0
- package/dist/engines/flowCurrents.js.map +1 -0
- package/dist/engines/geoPulse.d.ts +33 -0
- package/dist/engines/geoPulse.d.ts.map +1 -0
- package/dist/engines/geoPulse.js +116 -0
- package/dist/engines/geoPulse.js.map +1 -0
- package/dist/engines/gravityStorm.d.ts +39 -0
- package/dist/engines/gravityStorm.d.ts.map +1 -0
- package/dist/engines/gravityStorm.js +124 -0
- package/dist/engines/gravityStorm.js.map +1 -0
- package/dist/engines/waveEther.d.ts +30 -0
- package/dist/engines/waveEther.d.ts.map +1 -0
- package/dist/engines/waveEther.js +74 -0
- package/dist/engines/waveEther.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +138 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/index.d.ts +59 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +669 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/schemas/index.d.ts +93 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +83 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/utils/noise.d.ts +37 -0
- package/dist/utils/noise.d.ts.map +1 -0
- package/dist/utils/noise.js +129 -0
- package/dist/utils/noise.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sierpinski Chaos engine — framework-agnostic Canvas 2D renderer.
|
|
3
|
+
*
|
|
4
|
+
* Implements the IFS (Iterated Function System) chaos game for the Sierpinski
|
|
5
|
+
* gasket. Each frame, the current point leaps halfway to a randomly chosen
|
|
6
|
+
* vertex of a triangle. Over thousands of frames the Sierpinski fractal
|
|
7
|
+
* emerges probabilistically — each vertex coloring the points it attracted.
|
|
8
|
+
* The triangle slowly rotates, making the accumulated gasket gently drift.
|
|
9
|
+
*/
|
|
10
|
+
import { SeededRandom, hexToRgb, lerp, rgba } from "../utils/noise";
|
|
11
|
+
import { sierpinskiChaosDefaults } from "../schemas";
|
|
12
|
+
export function initSierpinskiChaos(width, height, params = {}) {
|
|
13
|
+
const p = { ...sierpinskiChaosDefaults, ...params };
|
|
14
|
+
const rng = new SeededRandom(p.seed);
|
|
15
|
+
// Start at canvas center
|
|
16
|
+
return {
|
|
17
|
+
x: width / 2,
|
|
18
|
+
y: height / 2,
|
|
19
|
+
rng,
|
|
20
|
+
rotAngle: 0,
|
|
21
|
+
frame: 0,
|
|
22
|
+
width,
|
|
23
|
+
height,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function drawSierpinskiChaos(ctx, state, params = {}) {
|
|
27
|
+
const p = { ...sierpinskiChaosDefaults, ...params };
|
|
28
|
+
const { width: W, height: H, rng } = state;
|
|
29
|
+
state.rotAngle += p.rotSpeed;
|
|
30
|
+
state.frame++;
|
|
31
|
+
// Current triangle vertices (rotating equilateral)
|
|
32
|
+
const cx = W / 2;
|
|
33
|
+
const cy = H / 2;
|
|
34
|
+
const r = Math.min(W, H) * 0.44 * p.scale;
|
|
35
|
+
const verts = [0, 1, 2].map((i) => {
|
|
36
|
+
const a = state.rotAngle + (i / 3) * Math.PI * 2 - Math.PI / 2;
|
|
37
|
+
return { x: cx + Math.cos(a) * r, y: cy + Math.sin(a) * r };
|
|
38
|
+
});
|
|
39
|
+
const colors = [
|
|
40
|
+
hexToRgb(p.colorV1),
|
|
41
|
+
hexToRgb(p.colorV2),
|
|
42
|
+
hexToRgb(p.colorV3),
|
|
43
|
+
];
|
|
44
|
+
// Very subtle fade: keeps the pattern accumulated but lets rotation evolve
|
|
45
|
+
// After warmup frames we fade slightly faster to prevent ghost buildup
|
|
46
|
+
const fadeAlpha = state.frame < 300 ? 1 : 2;
|
|
47
|
+
ctx.fillStyle = rgba(10, 10, 18, fadeAlpha);
|
|
48
|
+
ctx.fillRect(0, 0, W, H);
|
|
49
|
+
const ptSize = p.pointSize;
|
|
50
|
+
// Run N chaos game steps this frame
|
|
51
|
+
for (let i = 0; i < p.stepsPerFrame; i++) {
|
|
52
|
+
const vi = rng.floor(0, 3);
|
|
53
|
+
const v = verts[vi];
|
|
54
|
+
state.x = (state.x + v.x) * 0.5;
|
|
55
|
+
state.y = (state.y + v.y) * 0.5;
|
|
56
|
+
const { r: cr, g: cg, b: cb } = colors[vi];
|
|
57
|
+
ctx.fillStyle = rgba(cr, cg, cb, p.pointAlpha);
|
|
58
|
+
ctx.fillRect(state.x - ptSize * 0.5, state.y - ptSize * 0.5, ptSize, ptSize);
|
|
59
|
+
}
|
|
60
|
+
// Draw subtle vertex glows so the triangle frame is visible
|
|
61
|
+
if (p.showVertices) {
|
|
62
|
+
for (let vi = 0; vi < 3; vi++) {
|
|
63
|
+
const v = verts[vi];
|
|
64
|
+
const { r: cr, g: cg, b: cb } = colors[vi];
|
|
65
|
+
for (let gr = 18; gr > 0; gr -= 3) {
|
|
66
|
+
ctx.fillStyle = rgba(cr, cg, cb, (gr / 18) * 20);
|
|
67
|
+
ctx.beginPath();
|
|
68
|
+
ctx.arc(v.x, v.y, gr, 0, Math.PI * 2);
|
|
69
|
+
ctx.fill();
|
|
70
|
+
}
|
|
71
|
+
// Faint triangle edges
|
|
72
|
+
const next = verts[(vi + 1) % 3];
|
|
73
|
+
ctx.strokeStyle = rgba(cr, cg, cb, 18);
|
|
74
|
+
ctx.lineWidth = 0.5;
|
|
75
|
+
ctx.beginPath();
|
|
76
|
+
ctx.moveTo(v.x, v.y);
|
|
77
|
+
ctx.lineTo(next.x, next.y);
|
|
78
|
+
ctx.stroke();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function resetSierpinskiChaos(ctx, state, params = {}) {
|
|
83
|
+
ctx.fillStyle = "rgb(10,10,18)";
|
|
84
|
+
ctx.fillRect(0, 0, state.width, state.height);
|
|
85
|
+
return initSierpinskiChaos(state.width, state.height, params);
|
|
86
|
+
}
|
|
87
|
+
// Extended variant: 4-vertex IFS for Sierpinski carpet / other fractals
|
|
88
|
+
export function drawSierpinskiChaosQuad(ctx, state, params = {}, extraVertex) {
|
|
89
|
+
const p = { ...sierpinskiChaosDefaults, ...params };
|
|
90
|
+
const { width: W, height: H, rng } = state;
|
|
91
|
+
const cx = W / 2, cy = H / 2;
|
|
92
|
+
const r = Math.min(W, H) * 0.44 * p.scale;
|
|
93
|
+
const verts = [0, 1, 2].map((i) => {
|
|
94
|
+
const a = state.rotAngle + (i / 3) * Math.PI * 2 - Math.PI / 2;
|
|
95
|
+
return { x: cx + Math.cos(a) * r, y: cy + Math.sin(a) * r };
|
|
96
|
+
});
|
|
97
|
+
verts.push(extraVertex);
|
|
98
|
+
const colors = [
|
|
99
|
+
hexToRgb(p.colorV1),
|
|
100
|
+
hexToRgb(p.colorV2),
|
|
101
|
+
hexToRgb(p.colorV3),
|
|
102
|
+
hexToRgb(p.colorV1), // reuse for 4th
|
|
103
|
+
];
|
|
104
|
+
for (let i = 0; i < p.stepsPerFrame; i++) {
|
|
105
|
+
const vi = rng.floor(0, 4);
|
|
106
|
+
const v = verts[vi];
|
|
107
|
+
state.x = (state.x + v.x) * 0.5;
|
|
108
|
+
state.y = (state.y + v.y) * 0.5;
|
|
109
|
+
const { r: cr, g: cg, b: cb } = colors[vi];
|
|
110
|
+
ctx.fillStyle = rgba(cr, cg, cb, p.pointAlpha);
|
|
111
|
+
ctx.fillRect(state.x - p.pointSize / 2, state.y - p.pointSize / 2, p.pointSize, p.pointSize);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Utility: interpolate between two colors by t
|
|
115
|
+
export function lerpColor(a, b, t) {
|
|
116
|
+
return { r: lerp(a.r, b.r, t), g: lerp(a.g, b.g, t), b: lerp(a.b, b.b, t) };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=sierpinskiChaos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sierpinskiChaos.js","sourceRoot":"","sources":["../../../src/components/engines/sierpinskiChaos.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sierpinski Dust engine — iterated function system chaos game.
|
|
3
|
+
*
|
|
4
|
+
* The chaos game is a beautifully simple algorithm for producing fractal
|
|
5
|
+
* attractors: starting from an arbitrary point, repeatedly pick one of the
|
|
6
|
+
* triangle's three vertices at random and move halfway toward it. After a short
|
|
7
|
+
* burn-in, the sequence of visited points traces the Sierpinski triangle —
|
|
8
|
+
* a self-similar fractal of Hausdorff dimension ≈ 1.585.
|
|
9
|
+
*
|
|
10
|
+
* Multiple triangles coexist on the canvas, each running an independent IFS
|
|
11
|
+
* walker and coloring its dust by which vertex was chosen. The triangles rotate
|
|
12
|
+
* slowly at different rates, preventing static symmetry and creating a layered,
|
|
13
|
+
* animated fractal tapestry.
|
|
14
|
+
*
|
|
15
|
+
* Mouse interaction biases the vertex weight distribution: vertices closer to
|
|
16
|
+
* the cursor receive higher selection probability, steering the dust toward the
|
|
17
|
+
* mouse side of each triangle. Click plants a new triangle at the cursor (oldest
|
|
18
|
+
* evicted when the cap is reached).
|
|
19
|
+
*/
|
|
20
|
+
import { SeededRandom } from "../utils/noise";
|
|
21
|
+
export interface SierpinskiDustParams {
|
|
22
|
+
seed?: number;
|
|
23
|
+
/** IFS iterations plotted per frame. */
|
|
24
|
+
itersPerFrame?: number;
|
|
25
|
+
/** Max simultaneous triangles. */
|
|
26
|
+
maxTriangles?: number;
|
|
27
|
+
/** Triangle circumradius as a fraction of min(W,H). */
|
|
28
|
+
size?: number;
|
|
29
|
+
/** Triangle rotation speed (radians/frame). */
|
|
30
|
+
rotSpeed?: number;
|
|
31
|
+
/** Trail fade opacity per frame (lower = longer persistence). */
|
|
32
|
+
trailOpacity?: number;
|
|
33
|
+
/** How strongly the mouse biases vertex selection [0–1]. */
|
|
34
|
+
mouseInfluence?: number;
|
|
35
|
+
/** Color of dust near vertex 0. */
|
|
36
|
+
colorA?: string;
|
|
37
|
+
/** Color of dust near vertex 1. */
|
|
38
|
+
colorB?: string;
|
|
39
|
+
/** Color of dust near vertex 2. */
|
|
40
|
+
colorC?: string;
|
|
41
|
+
}
|
|
42
|
+
export declare const sierpinskiDustDefaults: Required<SierpinskiDustParams>;
|
|
43
|
+
interface Triangle {
|
|
44
|
+
cx: number;
|
|
45
|
+
cy: number;
|
|
46
|
+
/** Circumradius in pixels. */
|
|
47
|
+
r: number;
|
|
48
|
+
rotation: number;
|
|
49
|
+
/** +1 or −1 rotation direction. */
|
|
50
|
+
rotDir: number;
|
|
51
|
+
}
|
|
52
|
+
interface ChaosWalker {
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
}
|
|
56
|
+
export interface SierpinskiDustState {
|
|
57
|
+
triangles: Triangle[];
|
|
58
|
+
walkers: ChaosWalker[];
|
|
59
|
+
time: number;
|
|
60
|
+
rng: SeededRandom;
|
|
61
|
+
width: number;
|
|
62
|
+
height: number;
|
|
63
|
+
}
|
|
64
|
+
export declare function initSierpinskiDust(width: number, height: number, params?: SierpinskiDustParams): SierpinskiDustState;
|
|
65
|
+
export declare function addTriangle(state: SierpinskiDustState, x: number, y: number, params?: SierpinskiDustParams): void;
|
|
66
|
+
export declare function drawSierpinskiDust(ctx: CanvasRenderingContext2D, state: SierpinskiDustState, params?: SierpinskiDustParams, mouse?: {
|
|
67
|
+
x: number;
|
|
68
|
+
y: number;
|
|
69
|
+
}): void;
|
|
70
|
+
export declare function resetSierpinskiDust(ctx: CanvasRenderingContext2D, state: SierpinskiDustState, params?: SierpinskiDustParams): SierpinskiDustState;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=sierpinskiDust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sierpinskiDust.d.ts","sourceRoot":"","sources":["../../../src/components/engines/sierpinskiDust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAwB,MAAM,gBAAgB,CAAC;AAIpE,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,oBAAoB,CAWjE,CAAC;AAIF,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,WAAW;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,YAAY,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AA0BD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,oBAAyB,GAChC,mBAAmB,CAarB;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,mBAAmB,EAC1B,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,MAAM,GAAE,oBAAyB,GAChC,IAAI,CASN;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,mBAAmB,EAC1B,MAAM,GAAE,oBAAyB,EACjC,KAAK,CAAC,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,IAAI,CAqFN;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,mBAAmB,EAC1B,MAAM,GAAE,oBAAyB,GAChC,mBAAmB,CAIrB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sierpinski Dust engine — iterated function system chaos game.
|
|
3
|
+
*
|
|
4
|
+
* The chaos game is a beautifully simple algorithm for producing fractal
|
|
5
|
+
* attractors: starting from an arbitrary point, repeatedly pick one of the
|
|
6
|
+
* triangle's three vertices at random and move halfway toward it. After a short
|
|
7
|
+
* burn-in, the sequence of visited points traces the Sierpinski triangle —
|
|
8
|
+
* a self-similar fractal of Hausdorff dimension ≈ 1.585.
|
|
9
|
+
*
|
|
10
|
+
* Multiple triangles coexist on the canvas, each running an independent IFS
|
|
11
|
+
* walker and coloring its dust by which vertex was chosen. The triangles rotate
|
|
12
|
+
* slowly at different rates, preventing static symmetry and creating a layered,
|
|
13
|
+
* animated fractal tapestry.
|
|
14
|
+
*
|
|
15
|
+
* Mouse interaction biases the vertex weight distribution: vertices closer to
|
|
16
|
+
* the cursor receive higher selection probability, steering the dust toward the
|
|
17
|
+
* mouse side of each triangle. Click plants a new triangle at the cursor (oldest
|
|
18
|
+
* evicted when the cap is reached).
|
|
19
|
+
*/
|
|
20
|
+
import { SeededRandom, hexToRgb, lerp, rgba } from "../utils/noise";
|
|
21
|
+
export const sierpinskiDustDefaults = {
|
|
22
|
+
seed: 88432,
|
|
23
|
+
itersPerFrame: 6000,
|
|
24
|
+
maxTriangles: 4,
|
|
25
|
+
size: 0.78,
|
|
26
|
+
rotSpeed: 0.003,
|
|
27
|
+
trailOpacity: 5,
|
|
28
|
+
mouseInfluence: 0.55,
|
|
29
|
+
colorA: "#ff3d6e",
|
|
30
|
+
colorB: "#3dffa0",
|
|
31
|
+
colorC: "#3d8fff",
|
|
32
|
+
};
|
|
33
|
+
// ── Helpers ────────────────────────────────────────────────────────────────────
|
|
34
|
+
function makeTriangle(cx, cy, r, rng) {
|
|
35
|
+
return {
|
|
36
|
+
cx, cy, r,
|
|
37
|
+
rotation: rng.range(0, Math.PI * 2),
|
|
38
|
+
rotDir: rng.bool() ? 1 : -1,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function triVerts(tri) {
|
|
42
|
+
return [0, 1, 2].map((vi) => {
|
|
43
|
+
const a = tri.rotation + (vi / 3) * Math.PI * 2 - Math.PI / 2;
|
|
44
|
+
return { x: tri.cx + Math.cos(a) * tri.r, y: tri.cy + Math.sin(a) * tri.r };
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// ── Public API ────────────────────────────────────────────────────────────────
|
|
48
|
+
export function initSierpinskiDust(width, height, params = {}) {
|
|
49
|
+
const p = { ...sierpinskiDustDefaults, ...params };
|
|
50
|
+
const rng = new SeededRandom(p.seed);
|
|
51
|
+
const r = Math.min(width, height) * 0.5 * p.size;
|
|
52
|
+
const tri = makeTriangle(width / 2, height / 2, r, rng);
|
|
53
|
+
return {
|
|
54
|
+
triangles: [tri],
|
|
55
|
+
walkers: [{ x: width / 2, y: height / 2 }],
|
|
56
|
+
time: 0,
|
|
57
|
+
rng,
|
|
58
|
+
width,
|
|
59
|
+
height,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function addTriangle(state, x, y, params = {}) {
|
|
63
|
+
const p = { ...sierpinskiDustDefaults, ...params };
|
|
64
|
+
const r = Math.min(state.width, state.height) * 0.38 * p.size;
|
|
65
|
+
state.triangles.push(makeTriangle(x, y, r, state.rng));
|
|
66
|
+
state.walkers.push({ x, y });
|
|
67
|
+
if (state.triangles.length > p.maxTriangles) {
|
|
68
|
+
state.triangles.shift();
|
|
69
|
+
state.walkers.shift();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function drawSierpinskiDust(ctx, state, params = {}, mouse) {
|
|
73
|
+
const p = { ...sierpinskiDustDefaults, ...params };
|
|
74
|
+
const { triangles, walkers, width: W, height: H } = state;
|
|
75
|
+
state.time += 0.016;
|
|
76
|
+
// Fade trail for persistence effect
|
|
77
|
+
ctx.fillStyle = rgba(6, 6, 14, p.trailOpacity);
|
|
78
|
+
ctx.fillRect(0, 0, W, H);
|
|
79
|
+
const colors = [
|
|
80
|
+
hexToRgb(p.colorA),
|
|
81
|
+
hexToRgb(p.colorB),
|
|
82
|
+
hexToRgb(p.colorC),
|
|
83
|
+
];
|
|
84
|
+
// Rotate all triangles
|
|
85
|
+
for (const tri of triangles) {
|
|
86
|
+
tri.rotation += p.rotSpeed * tri.rotDir;
|
|
87
|
+
}
|
|
88
|
+
ctx.globalCompositeOperation = "screen";
|
|
89
|
+
const itersEach = Math.floor(p.itersPerFrame / Math.max(triangles.length, 1));
|
|
90
|
+
for (let ti = 0; ti < triangles.length; ti++) {
|
|
91
|
+
const tri = triangles[ti];
|
|
92
|
+
const walker = walkers[ti];
|
|
93
|
+
const verts = triVerts(tri);
|
|
94
|
+
// Compute mouse-biased vertex weights
|
|
95
|
+
let weights = [1 / 3, 1 / 3, 1 / 3];
|
|
96
|
+
if (mouse) {
|
|
97
|
+
const dists = verts.map((v) => Math.hypot(v.x - mouse.x, v.y - mouse.y));
|
|
98
|
+
const maxD = Math.max(...dists) + 1;
|
|
99
|
+
// Closer vertices gain higher weight
|
|
100
|
+
const raw = dists.map((d) => Math.pow((maxD - d) / maxD, 2));
|
|
101
|
+
const sum = raw.reduce((a, b) => a + b, 0);
|
|
102
|
+
if (sum > 0) {
|
|
103
|
+
const biased = [raw[0] / sum, raw[1] / sum, raw[2] / sum];
|
|
104
|
+
weights = weights.map((w, i) => lerp(w, biased[i], p.mouseInfluence));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Run the chaos game
|
|
108
|
+
for (let k = 0; k < itersEach; k++) {
|
|
109
|
+
const rnd = state.rng.next();
|
|
110
|
+
let vi = 2;
|
|
111
|
+
let acc = 0;
|
|
112
|
+
for (let i = 0; i < 3; i++) {
|
|
113
|
+
acc += weights[i];
|
|
114
|
+
if (rnd < acc) {
|
|
115
|
+
vi = i;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const v = verts[vi];
|
|
120
|
+
walker.x = (walker.x + v.x) / 2;
|
|
121
|
+
walker.y = (walker.y + v.y) / 2;
|
|
122
|
+
// Skip first few iterations (burn-in) handled implicitly by trail fade
|
|
123
|
+
const c = colors[vi];
|
|
124
|
+
ctx.fillStyle = rgba(c.r, c.g, c.b, 55);
|
|
125
|
+
ctx.fillRect(walker.x - 0.5, walker.y - 0.5, 1, 1);
|
|
126
|
+
}
|
|
127
|
+
// Draw faint triangle outline
|
|
128
|
+
const col = colors[ti % colors.length];
|
|
129
|
+
ctx.strokeStyle = rgba(col.r, col.g, col.b, 22);
|
|
130
|
+
ctx.lineWidth = 0.5;
|
|
131
|
+
ctx.beginPath();
|
|
132
|
+
verts.forEach((v, i) => (i === 0 ? ctx.moveTo(v.x, v.y) : ctx.lineTo(v.x, v.y)));
|
|
133
|
+
ctx.closePath();
|
|
134
|
+
ctx.stroke();
|
|
135
|
+
// Vertex markers
|
|
136
|
+
for (let vi = 0; vi < 3; vi++) {
|
|
137
|
+
const v = verts[vi];
|
|
138
|
+
const c = colors[vi];
|
|
139
|
+
ctx.beginPath();
|
|
140
|
+
ctx.arc(v.x, v.y, 3, 0, Math.PI * 2);
|
|
141
|
+
ctx.fillStyle = rgba(c.r, c.g, c.b, 180);
|
|
142
|
+
ctx.fill();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
ctx.globalCompositeOperation = "source-over";
|
|
146
|
+
}
|
|
147
|
+
export function resetSierpinskiDust(ctx, state, params = {}) {
|
|
148
|
+
ctx.fillStyle = "rgb(6,6,14)";
|
|
149
|
+
ctx.fillRect(0, 0, state.width, state.height);
|
|
150
|
+
return initSierpinskiDust(state.width, state.height, params);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=sierpinskiDust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sierpinskiDust.js","sourceRoot":"","sources":["../../../src/components/engines/sierpinskiDust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA0BpE,MAAM,CAAC,MAAM,sBAAsB,GAAmC;IACpE,IAAI,EAAE,KAAK;IACX,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,CAAC;IACf,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,IAAI;IACpB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;CAClB,CAAC;AA4BF,kFAAkF;AAElF,SAAS,YAAY,CACnB,EAAU,EACV,EAAU,EACV,CAAS,EACT,GAAiB;IAEjB,OAAO;QACL,EAAE,EAAE,EAAE,EAAE,CAAC;QACT,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAa;IAC7B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9D,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;IAC9E,CAAC,CAAmF,CAAC;AACvF,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,MAAc,EACd,SAA+B,EAAE;IAEjC,MAAM,CAAC,GAAG,EAAE,GAAG,sBAAsB,EAAE,GAAG,MAAM,EAAE,CAAC;IACnD,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;IACjD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO;QACL,SAAS,EAAE,CAAC,GAAG,CAAC;QAChB,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,EAAE,CAAC;QACP,GAAG;QACH,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAA0B,EAC1B,CAAS,EACT,CAAS,EACT,SAA+B,EAAE;IAEjC,MAAM,CAAC,GAAG,EAAE,GAAG,sBAAsB,EAAE,GAAG,MAAM,EAAE,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IAC9D,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;QAC5C,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAA6B,EAC7B,KAA0B,EAC1B,SAA+B,EAAE,EACjC,KAAgC;IAEhC,MAAM,CAAC,GAAG,EAAE,GAAG,sBAAsB,EAAE,GAAG,MAAM,EAAE,CAAC;IACnD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;IAE1D,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;IAEpB,oCAAoC;IACpC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;IAC/C,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzB,MAAM,MAAM,GAAG;QACb,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAClB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAClB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;KACnB,CAAC;IAEF,uBAAuB;IACvB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED,GAAG,CAAC,wBAAwB,GAAG,QAAQ,CAAC;IAExC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9E,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAO,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAI,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAK,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE9B,sCAAsC;QACtC,IAAI,OAAO,GAA6B,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,MAAM,IAAI,GAAI,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,qCAAqC;YACrC,MAAM,GAAG,GAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,GAAG,GAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,MAAM,MAAM,GAA6B,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;gBACpF,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAA6B,CAAC;YACpG,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,EAAE,GAAG,CAAC,CAAC;YACX,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClB,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;oBAAC,EAAE,GAAG,CAAC,CAAC;oBAAC,MAAM;gBAAC,CAAC;YACnC,CAAC;YAED,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;YACpB,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEhC,uEAAuE;YACvE,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,8BAA8B;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChD,GAAG,CAAC,SAAS,GAAK,GAAG,CAAC;QACtB,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,MAAM,EAAE,CAAC;QAEb,iBAAiB;QACjB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;YACrB,GAAG,CAAC,SAAS,EAAE,CAAC;YAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,GAAG,CAAC,wBAAwB,GAAG,aAAa,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,GAA6B,EAC7B,KAA0B,EAC1B,SAA+B,EAAE;IAEjC,GAAG,CAAC,SAAS,GAAG,aAAa,CAAC;IAC9B,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spirograph Engine
|
|
3
|
+
* Hypotrochoid curves from rolling circles
|
|
4
|
+
*/
|
|
5
|
+
import { SeededRandom } from "../utils/noise";
|
|
6
|
+
export interface SpirographParams {
|
|
7
|
+
seed: number;
|
|
8
|
+
R: number;
|
|
9
|
+
r: number;
|
|
10
|
+
d: number;
|
|
11
|
+
speed: number;
|
|
12
|
+
lineWeight: number;
|
|
13
|
+
bgColor: string;
|
|
14
|
+
colorA: string;
|
|
15
|
+
colorB: string;
|
|
16
|
+
colorC: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SpirographState {
|
|
19
|
+
t: number;
|
|
20
|
+
prevX: number | null;
|
|
21
|
+
prevY: number | null;
|
|
22
|
+
colorPhase: number;
|
|
23
|
+
rng: SeededRandom;
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
needsClear?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function initSpirograph(width: number, height: number, params: SpirographParams): SpirographState;
|
|
29
|
+
export declare function drawSpirograph(ctx: CanvasRenderingContext2D, state: SpirographState, params: SpirographParams): void;
|
|
30
|
+
export declare function resetSpirograph(state: SpirographState, params: SpirographParams): void;
|
|
31
|
+
//# sourceMappingURL=spirograph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spirograph.d.ts","sourceRoot":"","sources":["../../../src/components/engines/spirograph.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAwB,MAAM,gBAAgB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,YAAY,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,GACvB,eAAe,CAajB;AAUD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CA0DN;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAQN"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spirograph Engine
|
|
3
|
+
* Hypotrochoid curves from rolling circles
|
|
4
|
+
*/
|
|
5
|
+
import { SeededRandom, hexToRgb, lerp, rgba } from "../utils/noise";
|
|
6
|
+
export function initSpirograph(width, height, params) {
|
|
7
|
+
const rng = new SeededRandom(params.seed);
|
|
8
|
+
const colorPhase = rng.random() * Math.PI * 2;
|
|
9
|
+
return {
|
|
10
|
+
t: 0,
|
|
11
|
+
prevX: null,
|
|
12
|
+
prevY: null,
|
|
13
|
+
colorPhase,
|
|
14
|
+
rng,
|
|
15
|
+
width,
|
|
16
|
+
height,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function hx(t, R, r, d) {
|
|
20
|
+
return (R - r) * Math.cos(t) + d * Math.cos(((R - r) * t) / r);
|
|
21
|
+
}
|
|
22
|
+
function hy(t, R, r, d) {
|
|
23
|
+
return (R - r) * Math.sin(t) - d * Math.sin(((R - r) * t) / r);
|
|
24
|
+
}
|
|
25
|
+
export function drawSpirograph(ctx, state, params) {
|
|
26
|
+
const { width, height } = state;
|
|
27
|
+
const cx = width / 2;
|
|
28
|
+
const cy = height / 2;
|
|
29
|
+
const bg = hexToRgb(params.bgColor);
|
|
30
|
+
// Clear canvas completely if needed (on reset)
|
|
31
|
+
if (state.needsClear) {
|
|
32
|
+
ctx.fillStyle = rgba(bg.r, bg.g, bg.b, 255);
|
|
33
|
+
ctx.fillRect(0, 0, width, height);
|
|
34
|
+
state.needsClear = false;
|
|
35
|
+
}
|
|
36
|
+
const steps = Math.floor(params.speed * 90);
|
|
37
|
+
const maxT = Math.PI * 42;
|
|
38
|
+
const c1 = hexToRgb(params.colorA);
|
|
39
|
+
const c2 = hexToRgb(params.colorB);
|
|
40
|
+
const c3 = hexToRgb(params.colorC);
|
|
41
|
+
const sc = Math.min(width, height) * 0.44 / (Math.abs(params.R - params.r) + params.d + 0.5);
|
|
42
|
+
for (let s = 0; s < steps; s++) {
|
|
43
|
+
if (state.t >= maxT) {
|
|
44
|
+
// Fade and reset
|
|
45
|
+
ctx.fillStyle = rgba(bg.r, bg.g, bg.b, 55);
|
|
46
|
+
ctx.fillRect(0, 0, width, height);
|
|
47
|
+
state.t = 0;
|
|
48
|
+
state.prevX = null;
|
|
49
|
+
state.prevY = null;
|
|
50
|
+
state.colorPhase += 0.8;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
const x = cx + hx(state.t, params.R, params.r, params.d) * sc;
|
|
54
|
+
const y = cy + hy(state.t, params.R, params.r, params.d) * sc;
|
|
55
|
+
if (state.prevX !== null && state.prevY !== null) {
|
|
56
|
+
const f = (Math.sin(state.t * 0.08 + state.colorPhase) + 1) * 0.5;
|
|
57
|
+
const g = (Math.sin(state.t * 0.05 + state.colorPhase + 2) + 1) * 0.5;
|
|
58
|
+
const r1 = lerp(c1.r, lerp(c2.r, c3.r, g), f);
|
|
59
|
+
const g1 = lerp(c1.g, lerp(c2.g, c3.g, g), f);
|
|
60
|
+
const b1 = lerp(c1.b, lerp(c2.b, c3.b, g), f);
|
|
61
|
+
ctx.strokeStyle = rgba(r1, g1, b1, 210);
|
|
62
|
+
ctx.lineWidth = params.lineWeight;
|
|
63
|
+
ctx.beginPath();
|
|
64
|
+
ctx.moveTo(state.prevX, state.prevY);
|
|
65
|
+
ctx.lineTo(x, y);
|
|
66
|
+
ctx.stroke();
|
|
67
|
+
}
|
|
68
|
+
state.prevX = x;
|
|
69
|
+
state.prevY = y;
|
|
70
|
+
state.t += 0.007;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function resetSpirograph(state, params) {
|
|
74
|
+
const newState = initSpirograph(state.width, state.height, params);
|
|
75
|
+
state.t = newState.t;
|
|
76
|
+
state.prevX = newState.prevX;
|
|
77
|
+
state.prevY = newState.prevY;
|
|
78
|
+
state.colorPhase = newState.colorPhase;
|
|
79
|
+
state.rng = newState.rng;
|
|
80
|
+
state.needsClear = true;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=spirograph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spirograph.js","sourceRoot":"","sources":["../../../src/components/engines/spirograph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tide Harmonics Engine
|
|
3
|
+
* Multiple wave sources creating interference patterns along horizontal lines
|
|
4
|
+
*/
|
|
5
|
+
import { SeededRandom, PerlinNoise } from "../utils/noise";
|
|
6
|
+
export interface TideHarmonicsParams {
|
|
7
|
+
seed: number;
|
|
8
|
+
waveCount: number;
|
|
9
|
+
gridRows: number;
|
|
10
|
+
frequency: number;
|
|
11
|
+
amplitude: number;
|
|
12
|
+
speed: number;
|
|
13
|
+
bgColor: string;
|
|
14
|
+
colorA: string;
|
|
15
|
+
colorB: string;
|
|
16
|
+
}
|
|
17
|
+
interface Wave {
|
|
18
|
+
cx: number;
|
|
19
|
+
cy: number;
|
|
20
|
+
amp: number;
|
|
21
|
+
freq: number;
|
|
22
|
+
phase: number;
|
|
23
|
+
speed: number;
|
|
24
|
+
}
|
|
25
|
+
export interface TideHarmonicsState {
|
|
26
|
+
waves: Wave[];
|
|
27
|
+
rng: SeededRandom;
|
|
28
|
+
noise: PerlinNoise;
|
|
29
|
+
time: number;
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
}
|
|
33
|
+
export declare function initTideHarmonics(width: number, height: number, params: TideHarmonicsParams): TideHarmonicsState;
|
|
34
|
+
export declare function drawTideHarmonics(ctx: CanvasRenderingContext2D, state: TideHarmonicsState, params: TideHarmonicsParams): void;
|
|
35
|
+
export declare function resetTideHarmonics(state: TideHarmonicsState, params: TideHarmonicsParams): void;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=tideHarmonics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tideHarmonics.d.ts","sourceRoot":"","sources":["../../../src/components/engines/tideHarmonics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAA+B,MAAM,gBAAgB,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,GAAG,EAAE,YAAY,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,GAC1B,kBAAkB,CAiBpB;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,wBAAwB,EAC7B,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,mBAAmB,GAC1B,IAAI,CAmDN;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,mBAAmB,GAC1B,IAAI,CAMN"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tide Harmonics Engine
|
|
3
|
+
* Multiple wave sources creating interference patterns along horizontal lines
|
|
4
|
+
*/
|
|
5
|
+
import { SeededRandom, PerlinNoise, hexToRgb, rgba, lerp, clamp } from "../utils/noise";
|
|
6
|
+
export function initTideHarmonics(width, height, params) {
|
|
7
|
+
const rng = new SeededRandom(params.seed);
|
|
8
|
+
const noise = new PerlinNoise(params.seed);
|
|
9
|
+
const waves = [];
|
|
10
|
+
for (let i = 0; i < params.waveCount; i++) {
|
|
11
|
+
waves.push({
|
|
12
|
+
cx: rng.random() * width,
|
|
13
|
+
cy: rng.random() * height,
|
|
14
|
+
amp: rng.range(0.55, 1.0),
|
|
15
|
+
freq: rng.range(0.006, 0.014),
|
|
16
|
+
phase: rng.random() * Math.PI * 2,
|
|
17
|
+
speed: rng.range(0.7, 1.3),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
return { waves, rng, noise, time: 0, width, height };
|
|
21
|
+
}
|
|
22
|
+
export function drawTideHarmonics(ctx, state, params) {
|
|
23
|
+
const { waves, width, height } = state;
|
|
24
|
+
// Clear background
|
|
25
|
+
const bg = hexToRgb(params.bgColor);
|
|
26
|
+
ctx.fillStyle = `rgb(${bg.r},${bg.g},${bg.b})`;
|
|
27
|
+
ctx.fillRect(0, 0, width, height);
|
|
28
|
+
const t = state.time * 0.016 * params.speed;
|
|
29
|
+
const col1 = hexToRgb(params.colorA);
|
|
30
|
+
const col2 = hexToRgb(params.colorB);
|
|
31
|
+
const numCols = Math.floor(params.gridRows * 2.4);
|
|
32
|
+
for (let gy = 0; gy < params.gridRows; gy++) {
|
|
33
|
+
const baseY = lerp(55, height - 55, gy / (params.gridRows - 1));
|
|
34
|
+
let prevX = null;
|
|
35
|
+
let prevY = null;
|
|
36
|
+
for (let gx = 0; gx <= numCols; gx++) {
|
|
37
|
+
const x = lerp(40, width - 40, gx / numCols);
|
|
38
|
+
let disp = 0;
|
|
39
|
+
for (const w of waves) {
|
|
40
|
+
const d = Math.sqrt((x - w.cx) ** 2 + (baseY - w.cy) ** 2);
|
|
41
|
+
disp += w.amp * Math.sin(d * w.freq * params.frequency - t * w.speed + w.phase);
|
|
42
|
+
}
|
|
43
|
+
disp /= waves.length;
|
|
44
|
+
const y = baseY + disp * params.amplitude;
|
|
45
|
+
if (prevX !== null && prevY !== null) {
|
|
46
|
+
const tc = clamp((disp + 1) / 2, 0, 1);
|
|
47
|
+
const r = lerp(col1.r, col2.r, tc);
|
|
48
|
+
const g = lerp(col1.g, col2.g, tc);
|
|
49
|
+
const b = lerp(col1.b, col2.b, tc);
|
|
50
|
+
const alpha = lerp(45, 210, Math.abs(disp));
|
|
51
|
+
ctx.strokeStyle = rgba(r, g, b, alpha);
|
|
52
|
+
ctx.lineWidth = 0.85;
|
|
53
|
+
ctx.beginPath();
|
|
54
|
+
ctx.moveTo(prevX, prevY);
|
|
55
|
+
ctx.lineTo(x, y);
|
|
56
|
+
ctx.stroke();
|
|
57
|
+
}
|
|
58
|
+
prevX = x;
|
|
59
|
+
prevY = y;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
state.time++;
|
|
63
|
+
}
|
|
64
|
+
export function resetTideHarmonics(state, params) {
|
|
65
|
+
const newState = initTideHarmonics(state.width, state.height, params);
|
|
66
|
+
state.waves = newState.waves;
|
|
67
|
+
state.rng = newState.rng;
|
|
68
|
+
state.noise = newState.noise;
|
|
69
|
+
state.time = 0;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=tideHarmonics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tideHarmonics.js","sourceRoot":"","sources":["../../../src/components/engines/tideHarmonics.ts"],"names":[],"mappings":"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"}
|