|
5 | 5 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
6 | 6 |
|
7 | 7 | <!-- Primary Meta Tags --> |
8 | | - <title>Particles — 114 Interactive GPU Particle Animations | Three.js + WebGL</title> |
9 | | - <meta name="title" content="Particles — 114 Interactive GPU Particle Animations | Three.js + WebGL"> |
10 | | - <meta name="description" content="Explore 114 real-time, interactive GPU particle animations. 65,536 particles each, fully GPU-computed with Three.js and WebGL. Lorenz attractors, fractals, physics simulations, sacred geometry, and more. Mouse-interactive."> |
| 8 | + <title>Particles — 115 Interactive GPU Particle Animations | Three.js + WebGL</title> |
| 9 | + <meta name="title" content="Particles — 115 Interactive GPU Particle Animations | Three.js + WebGL"> |
| 10 | + <meta name="description" content="Explore 115 real-time, interactive GPU particle animations. 65,536 particles each, fully GPU-computed with Three.js and WebGL. Lorenz attractors, fractals, physics simulations, sacred geometry, and more. Mouse-interactive."> |
11 | 11 | <meta name="keywords" content="particle animation, GPU particles, three.js, webgl, strange attractor, lorenz attractor, fractal, shader, GLSL, creative coding, generative art, GPUComputationRenderer, mathematical visualization, chaos theory, physics simulation, interactive art, demoscene, GPGPU, compute shader, particle system, WebGL gallery, real-time graphics, mathematical art, procedural generation, reaction diffusion, turing patterns, double pendulum, n-body simulation, sacred geometry, mandala, fibonacci, supershape, gyroid, klein bottle, metaballs, curl noise, fireworks, supernova, black hole simulation"> |
12 | 12 | <meta name="author" content="Alexandru DAN"> |
13 | 13 | <meta name="robots" content="index, follow"> |
|
19 | 19 | <!-- Open Graph / Facebook --> |
20 | 20 | <meta property="og:type" content="website"> |
21 | 21 | <meta property="og:url" content="https://danlex.github.io/particles/"> |
22 | | - <meta property="og:title" content="Particles — 114 Interactive GPU Particle Animations"> |
23 | | - <meta property="og:description" content="Explore 114 real-time, interactive GPU particle animations. Strange attractors, fractals, physics simulations, sacred geometry. 65,536 particles each, fully GPU-computed with Three.js + WebGL."> |
| 22 | + <meta property="og:title" content="Particles — 115 Interactive GPU Particle Animations"> |
| 23 | + <meta property="og:description" content="Explore 115 real-time, interactive GPU particle animations. Strange attractors, fractals, physics simulations, sacred geometry. 65,536 particles each, fully GPU-computed with Three.js + WebGL."> |
24 | 24 | <meta property="og:image" content="https://danlex.github.io/particles/og-image.svg"> |
25 | 25 | <meta property="og:image:width" content="1200"> |
26 | 26 | <meta property="og:image:height" content="630"> |
|
30 | 30 | <!-- Twitter --> |
31 | 31 | <meta name="twitter:card" content="summary_large_image"> |
32 | 32 | <meta name="twitter:url" content="https://danlex.github.io/particles/"> |
33 | | - <meta name="twitter:title" content="Particles — 114 Interactive GPU Particle Animations"> |
34 | | - <meta name="twitter:description" content="Explore 114 interactive GPU particle animations. Strange attractors, fractals, physics sims, sacred geometry. 65K particles, fully GPU-computed."> |
| 33 | + <meta name="twitter:title" content="Particles — 115 Interactive GPU Particle Animations"> |
| 34 | + <meta name="twitter:description" content="Explore 115 interactive GPU particle animations. Strange attractors, fractals, physics sims, sacred geometry. 65K particles, fully GPU-computed."> |
35 | 35 | <meta name="twitter:image" content="https://danlex.github.io/particles/og-image.svg"> |
36 | 36 | <meta name="twitter:image:alt" content="A gallery of glowing particle animations on a dark background"> |
37 | 37 |
|
|
46 | 46 | "@type": "WebApplication", |
47 | 47 | "name": "Particles", |
48 | 48 | "url": "https://danlex.github.io/particles/", |
49 | | - "description": "A gallery of 114 real-time, interactive GPU particle animations built with Three.js and GPUComputationRenderer. Features strange attractors, fractals, physics simulations, sacred geometry, and more.", |
| 49 | + "description": "A gallery of 115 real-time, interactive GPU particle animations built with Three.js and GPUComputationRenderer. Features strange attractors, fractals, physics simulations, sacred geometry, and more.", |
50 | 50 | "applicationCategory": "MultimediaApplication", |
51 | 51 | "operatingSystem": "Any (WebGL-capable browser)", |
52 | 52 | "browserRequirements": "Requires WebGL 2.0", |
|
72 | 72 | "@type": "CollectionPage", |
73 | 73 | "name": "GPU Particle Animation Gallery", |
74 | 74 | "url": "https://danlex.github.io/particles/", |
75 | | - "description": "Browse 114 interactive GPU particle animations organized by category: strange attractors, fractals, physics simulations, sacred geometry, astrophysics, and more.", |
| 75 | + "description": "Browse 115 interactive GPU particle animations organized by category: strange attractors, fractals, physics simulations, sacred geometry, astrophysics, and more.", |
76 | 76 | "numberOfItems": 62, |
77 | 77 | "author": { |
78 | 78 | "@type": "Person", |
@@ -322,6 +322,15 @@ <h1>GPU Particle Animations</h1> |
322 | 322 | </div> |
323 | 323 |
|
324 | 324 | <div class="grid"> |
| 325 | + <a class="card" data-created="2026-04-08" href="fourier-epicycles.html"> |
| 326 | + <div class="card-preview"><canvas id="c-fourier"></canvas><div class="play-hint"></div></div> |
| 327 | + <div class="card-info"> |
| 328 | + <div class="card-title">Fourier Epicycles</div> |
| 329 | + <div class="card-desc">Circles rotating on circles draw complex curves. The Fourier series made visible with progressively more epicycles.</div> |
| 330 | + <div class="card-tags"><span class="card-tag">Math Art</span><span class="card-tag">Fourier Series</span><span class="card-particles">65,536 particles</span></div> |
| 331 | + </div> |
| 332 | + </a> |
| 333 | + |
325 | 334 | <a class="card" data-created="2026-04-08" href="audio-terrain.html"> |
326 | 335 | <div class="card-preview"><canvas id="c-audioterrain"></canvas><div class="play-hint"></div></div> |
327 | 336 | <div class="card-info"> |
@@ -2356,7 +2365,7 @@ <h1>GPU Particle Animations</h1> |
2356 | 2365 | const { ctx, w, h } = setupCanvas('c-ocean'); |
2357 | 2366 | for (let i = 0; i < 6000; i++) { |
2358 | 2367 | const gx = (i % 80) / 80 * 30 - 15; |
2359 | | - const gz = Math.floor(i / 80) / 114 * 30 - 15; |
| 2368 | + const gz = Math.floor(i / 80) / 115 * 30 - 15; |
2360 | 2369 | const phase1 = 1.0 * (gx*0.7 + gz*0.7); |
2361 | 2370 | const phase2 = 2.0 * (gx*0.9 - gz*0.4); |
2362 | 2371 | const y = 0.4*Math.sin(phase1) + 0.2*Math.sin(phase2) + 0.1*Math.sin(3*(-gx*0.3+gz*0.95)); |
@@ -3411,9 +3420,39 @@ <h1>GPU Particle Animations</h1> |
3411 | 3420 | drawProtein(); drawGravWaves(); drawOceanCurr(); drawMagReconn(); |
3412 | 3421 | drawRayleigh(); drawDendrites(); drawPlates(); drawDiffusion(); |
3413 | 3422 | drawNewtonRings(); drawPredPrey(); drawDoppler(); drawCoralReef(); |
3414 | | - drawPlasmaInstab(); drawAudioTerrain(); |
| 3423 | + drawPlasmaInstab(); drawAudioTerrain(); drawFourier(); |
3415 | 3424 | }; |
3416 | 3425 |
|
| 3426 | + function drawFourier() { |
| 3427 | + const { ctx, w, h } = setupCanvas('c-fourier'); |
| 3428 | + // Draw the traced curve from epicycles |
| 3429 | + for (let i=0;i<3000;i++) { |
| 3430 | + const t=i/3000*Math.PI*8; |
| 3431 | + let x=0,y=0; |
| 3432 | + for (let n=1;n<=8;n++) { |
| 3433 | + const r=3/n; |
| 3434 | + if(n%2===1){x+=r*Math.cos(n*t+n*0.5);y+=r*Math.sin(n*t+n*0.5);} |
| 3435 | + else{x+=r*0.7*Math.sin(n*t*1.3+n*0.5);y+=r*0.7*Math.cos(n*t*0.8+n*0.5);} |
| 3436 | + } |
| 3437 | + const age=i/3000; |
| 3438 | + const { px, py, d: dd } = project(x*1.5,y*1.5,age*2-1,w,h,8,15); |
| 3439 | + const hu=(age*288)%360; |
| 3440 | + const li=12+(1-age)*25; |
| 3441 | + ctx.fillStyle = hsl(hu,70,li,0.35*dd*(1-age*0.5)); |
| 3442 | + ctx.beginPath();ctx.arc(px,py,Math.max(0.3,0.7*dd),0,Math.PI*2);ctx.fill(); |
| 3443 | + } |
| 3444 | + // Draw circles (dim) |
| 3445 | + for (let n=1;n<=5;n++) { |
| 3446 | + const r=3/n*1.5; |
| 3447 | + for (let j=0;j<40;j++) { |
| 3448 | + const a=j/40*Math.PI*2; |
| 3449 | + const { px, py, d: dd } = project(r*Math.cos(a),r*Math.sin(a),0,w,h,8,15); |
| 3450 | + ctx.fillStyle = hsl(0,0,8,0.15*dd); |
| 3451 | + ctx.beginPath();ctx.arc(px,py,0.3,0,Math.PI*2);ctx.fill(); |
| 3452 | + } |
| 3453 | + } |
| 3454 | + } |
| 3455 | + |
3417 | 3456 | function drawAudioTerrain() { |
3418 | 3457 | const { ctx, w, h } = setupCanvas('c-audioterrain'); |
3419 | 3458 | for (let i=0;i<5000;i++) { |
@@ -4385,7 +4424,7 @@ <h1>GPU Particle Animations</h1> |
4385 | 4424 | heading += (Math.random()-0.5) * 0.8; |
4386 | 4425 | } |
4387 | 4426 | const { px, py, d: dd } = project(x*1.3, y*1.3, z*1.3, w, h, 4, 22); |
4388 | | - const hu = (heading / 6.28 * 114 + 108) % 360; |
| 4427 | + const hu = (heading / 6.28 * 115 + 108) % 360; |
4389 | 4428 | ctx.fillStyle = hsl(hu, 60, 27, 0.3*dd); |
4390 | 4429 | ctx.beginPath(); |
4391 | 4430 | ctx.arc(px, py, Math.max(0.3, 0.7*dd), 0, Math.PI*2); |
@@ -4747,6 +4786,7 @@ <h1>GPU Particle Animations</h1> |
4747 | 4786 | 'c-doppler': drawDoppler, 'c-coralreef': drawCoralReef, |
4748 | 4787 | 'c-plasmainstab': drawPlasmaInstab, |
4749 | 4788 | 'c-audioterrain': drawAudioTerrain, |
| 4789 | + 'c-fourier': drawFourier, |
4750 | 4790 | }; |
4751 | 4791 |
|
4752 | 4792 | // Redraw on resize |
|
0 commit comments