Skip to content
Rival
ModelsCompareBest ForArena
Lab
Sign Up
Sign Up

We compare AI models for a living. On purpose. We chose this.

@rival_tips

Explore

  • Compare Models
  • All Models
  • Prompt Lab
  • Image Generation
  • Audio Comparison
  • Leaderboard
  • Challenges

Discover

  • Insights
  • AI Creators
  • AI Tools
  • The Graveyard

Developers

  • Developer Hub
  • MCP Server
  • .llmignore
  • Badges
  • Rival Datasets

Connect

  • Methodology
  • Sponsor
  • Partnerships
  • Privacy Policy
  • Terms
  • RSS Feed
© 2026 Rival · Built at hours no one should be awake, on hardware we don’t own
Rival
ModelsCompareBest ForArena
Lab
Sign Up
Sign Up

Gravitational Waves Animation — AI Challenge

  1. Home
  2. Challenges
  3. Gravitational Waves Animation
Best AI for:Data VisualizationScientific VisualizationAnimation

Best AI for Gravitational Waves Animation

Top Performers: Gravitational Waves Animation

Jul 2025 – Mar 2026
#1Z.AI: GLM 4.5 Air76% win rateHigh confidence
#2Gemini 3.1 Pro Preview76% win rateHigh confidence
#3Z.AI: GLM 4.670% win rateHigh confidence
Compare top performers →

Single-shot · temp 0.7 · blind votes · identical prompts·How we test →

Loading...

We compare AI models for a living. On purpose. We chose this.

@rival_tips

Explore

  • Compare Models
  • All Models
  • Prompt Lab
  • Image Generation
  • Audio Comparison
  • Leaderboard
  • Challenges

Discover

  • Insights
  • AI Creators
  • AI Tools
  • The Graveyard

Developers

  • Developer Hub
  • MCP Server
  • .llmignore
  • Badges
  • Rival Datasets

Connect

  • Methodology
  • Sponsor
  • Partnerships
  • Privacy Policy
  • Terms
  • RSS Feed
© 2026 Rival · Built at hours no one should be awake, on hardware we don’t own
Back to Challenges
HardWeb Design

Gravitational Waves Animation

Create a beautiful, physically accurate animation of gravitational waves from colliding black holes.

The Prompt

Generate a beautiful, 30-second soft grid animation in HTML visualizing gravitational waves from two colliding black holes including ringdown. Maximize physical accuracy and sanity check the trajectories. In a single-page self-contained HTML.

How the models did

aurora-alpha logo
Aurora AlphaGravitational Waves Animation
aurora-alpha logo
Aurora Alpha
Feb 2026·Gravitational Waves Animation
Run in Lab
bert-nebulon-alpha logo
Bert-Nebulon AlphaGravitational Waves Animation
bert-nebulon-alpha logo
Bert-Nebulon Alpha
Nov 2025·Gravitational Waves Animation
Run in Lab
claude-3-7-sonnet logo
Claude 3 7 SonnetGravitational Waves Animation
claude-3-7-sonnet logo
Claude 3 7 Sonnet
Jul 2025·Gravitational Waves Animation
Run in Lab
claude-haiku-4.5 logo
Claude Haiku 4.5Gravitational Waves Animation
claude-haiku-4.5 logo
Claude Haiku 4.5
Oct 2025·Gravitational Waves Animation
Run in Lab
claude-opus-4 logo
Claude Opus 4Gravitational Waves Animation
claude-opus-4 logo
Claude Opus 4
Jul 2025·Gravitational Waves Animation
Legendary·Scientific beauty
Run in Lab
claude-opus-4.1 logo
Claude Opus 4.1Gravitational Waves Animation
claude-opus-4.1 logo
Claude Opus 4.1
Aug 2025·Gravitational Waves Animation
Run in Lab
claude-opus-4.5 logo
Claude Opus 4.5Gravitational Waves Animation
claude-opus-4.5 logo
Claude Opus 4.5
Nov 2025·Gravitational Waves Animation
Run in Lab
claude-opus-4.6 logo
Claude Opus 4.6Gravitational Waves Animation
claude-opus-4.6 logo
Claude Opus 4.6
Feb 2026·Gravitational Waves Animation
Legendary·Cosmic precision
Run in Lab
claude-sonnet-4 logo
Claude Sonnet 4Gravitational Waves Animation
claude-sonnet-4 logo
Claude Sonnet 4
Jul 2025·Gravitational Waves Animation
Run in Lab
claude-sonnet-4.6 logo
Claude Sonnet 4.6Gravitational Waves Animation
claude-sonnet-4.6 logo
Claude Sonnet 4.6
Feb 2026·Gravitational Waves Animation
Run in Lab
deepseek-chat-v3.1 logo
DeepSeek V3.1Gravitational Waves Animation
deepseek-chat-v3.1 logo
DeepSeek V3.1
Aug 2025·Gravitational Waves Animation
Run in Lab
deepseek-r1 logo
DeepSeek R1Gravitational Waves Animation
deepseek-r1 logo
DeepSeek R1
Jul 2025·Gravitational Waves Animation
Run in Lab
deepseek-v3.2 logo
DeepSeek V3.2Gravitational Waves Animation
deepseek-v3.2 logo
DeepSeek V3.2
Dec 2025·Gravitational Waves Animation
Run in Lab
deepseek-v3.2-speciale logo
DeepSeek V3.2 SpecialeGravitational Waves Animation
deepseek-v3.2-speciale logo
DeepSeek V3.2 Speciale
Dec 2025·Gravitational Waves Animation
Run in Lab
devstral-2512-free logo
Mistral: Devstral 2 2512Gravitational Waves Animation
devstral-2512-free logo
Mistral: Devstral 2 2512
Dec 2025·Gravitational Waves Animation
Run in Lab
devstral-medium logo
Mistral Devstral MediumGravitational Waves Animation
devstral-medium logo
Mistral Devstral Medium
Jul 2025·Gravitational Waves Animation
Run in Lab
devstral-small logo
Mistral Devstral Small 1.1Gravitational Waves Animation
devstral-small logo
Mistral Devstral Small 1.1
Jul 2025·Gravitational Waves Animation
Run in Lab
gemini-2.5-flash-lite-preview-09-2025 logo
Google: Gemini 2.5 Flash Lite Preview 09-2025Gravitational Waves Animation
gemini-2.5-flash-lite-preview-09-2025 logo
Google: Gemini 2.5 Flash Lite Preview 09-2025
Sep 2025·Gravitational Waves Animation
Run in Lab
gemini-2-5-flash-preview logo
Gemini 2.5 5 Flash PreviewGravitational Waves Animation
gemini-2-5-flash-preview logo
Gemini 2.5 5 Flash Preview
Jul 2025·Gravitational Waves Animation
Run in Lab
gemini-2.5-flash-preview-09-2025 logo
Google: Gemini 2.5 Flash Preview 09-2025Gravitational Waves Animation
gemini-2.5-flash-preview-09-2025 logo
Google: Gemini 2.5 Flash Preview 09-2025
Sep 2025·Gravitational Waves Animation
Run in Lab
gemini-2-5-pro-preview-05-06 logo
Gemini 2.5 5 Pro Preview 05 06Gravitational Waves Animation
gemini-2-5-pro-preview-05-06 logo
Gemini 2.5 5 Pro Preview 05 06
Jul 2025·Gravitational Waves Animation
Run in Lab
gemini-3-flash-preview logo
Gemini 3 Flash PreviewGravitational Waves Animation
gemini-3-flash-preview logo
Gemini 3 Flash Preview
Dec 2025·Gravitational Waves Animation
Run in Lab
gemini-3-pro-preview logo
Gemini 3 Pro PreviewGravitational Waves Animation
gemini-3-pro-preview logo
Gemini 3 Pro Preview
Nov 2025·Gravitational Waves Animation
Legendary·Cosmic waves
Run in Lab
gemini-3.1-flash-lite-preview logo
Google: Gemini 3.1 Flash Lite PreviewGravitational Waves Animation
gemini-3.1-flash-lite-preview logo
Google: Gemini 3.1 Flash Lite Preview
Mar 2026·Gravitational Waves Animation
Run in Lab
gemini-3.1-pro-preview logo
Gemini 3.1 Pro PreviewGravitational Waves Animation
gemini-3.1-pro-preview logo
Gemini 3.1 Pro Preview
Feb 2026·Gravitational Waves Animation
Run in Lab
gemma-3-12b-it logo
Gemma 3 12BGravitational Waves Animation
gemma-3-12b-it logo
Gemma 3 12B
Jul 2025·Gravitational Waves Animation
Run in Lab
gemma-3-27b-it logo
Gemma 3 27BGravitational Waves Animation
gemma-3-27b-it logo
Gemma 3 27B
Jul 2025·Gravitational Waves Animation
Run in Lab
gemma-3n-e2b-it-free logo
Google: Gemma 3n 2BGravitational Waves Animation
gemma-3n-e2b-it-free logo
Google: Gemma 3n 2B
Jul 2025·Gravitational Waves Animation
Run in Lab
glm-4-32b logo
Z.AI: GLM 4 32BGravitational Waves Animation
glm-4-32b logo
Z.AI: GLM 4 32B
Jul 2025·Gravitational Waves Animation
Run in Lab
glm-4.5 logo
Z.AI: GLM 4.5Gravitational Waves Animation
glm-4.5 logo
Z.AI: GLM 4.5
Jul 2025·Gravitational Waves Animation
Run in Lab
glm-4.5-air logo
Z.AI: GLM 4.5 AirGravitational Waves Animation
glm-4.5-air logo
Z.AI: GLM 4.5 Air
Jul 2025·Gravitational Waves Animation
Run in Lab
glm-4.6 logo
Z.AI: GLM 4.6Gravitational Waves Animation
glm-4.6 logo
Z.AI: GLM 4.6
Oct 2025·Gravitational Waves Animation
Run in Lab
glm-4.7 logo
Z.AI: GLM 4.7Gravitational Waves Animation
glm-4.7 logo
Z.AI: GLM 4.7
Dec 2025·Gravitational Waves Animation
Run in Lab
glm-4.7-flash logo
GLM 4.7 FlashGravitational Waves Animation
glm-4.7-flash logo
GLM 4.7 Flash
Jan 2026·Gravitational Waves Animation
Run in Lab
glm-5 logo
Z.ai: GLM 5Gravitational Waves Animation
glm-5 logo
Z.ai: GLM 5
Feb 2026·Gravitational Waves Animation
Run in Lab
gpt-4.5 logo
GPT-4.5Gravitational Waves Animation
gpt-4.5 logo
GPT-4.5
Jul 2025·Gravitational Waves Animation
Run in Lab
gpt-4o logo
GPT-4o (Omni)Gravitational Waves Animation
gpt-4o logo
GPT-4o (Omni)
Jul 2025·Gravitational Waves Animation
Run in Lab
gpt-5 logo
GPT-5Gravitational Waves Animation
gpt-5 logo
GPT-5
Jul 2025·Gravitational Waves Animation
Run in Lab
gpt-5-codex logo
GPT-5 CodexGravitational Waves Animation
gpt-5-codex logo
GPT-5 Codex
Sep 2025·Gravitational Waves Animation
Run in Lab
gpt-5-mini logo
GPT-5 MiniGravitational Waves Animation
gpt-5-mini logo
GPT-5 Mini
Nothing here. The model returned empty. We stared at it for a while.
Aug 2025·Gravitational Waves Animation
Run in Lab
gpt-5-nano logo
GPT-5 NanoGravitational Waves Animation
gpt-5-nano logo
GPT-5 Nano
Nothing here. The model returned empty. We stared at it for a while.
Aug 2025·Gravitational Waves Animation
Run in Lab
gpt-5.1-chat logo
GPT-5.1 ChatGravitational Waves Animation
gpt-5.1-chat logo
GPT-5.1 Chat
Nov 2025·Gravitational Waves Animation
Run in Lab
gpt-5.1-codex logo
GPT-5.1-CodexGravitational Waves Animation
gpt-5.1-codex logo
GPT-5.1-Codex
Nov 2025·Gravitational Waves Animation
Run in Lab
gpt-5.1-codex-max logo
GPT-5.1 Codex MaxGravitational Waves Animation
gpt-5.1-codex-max logo
GPT-5.1 Codex Max
Dec 2025·Gravitational Waves Animation
Legendary·Physics artistry
Run in Lab
gpt-5.2 logo
GPT-5.2Gravitational Waves Animation
gpt-5.2 logo
GPT-5.2
Dec 2025·Gravitational Waves Animation
Run in Lab
gpt-5.2-chat logo
GPT-5.2 ChatGravitational Waves Animation
gpt-5.2-chat logo
GPT-5.2 Chat
Dec 2025·Gravitational Waves Animation
Run in Lab
gpt-5.3-chat logo
GPT-5.3 ChatGravitational Waves Animation
gpt-5.3-chat logo
GPT-5.3 Chat
Mar 2026·Gravitational Waves Animation
Run in Lab
gpt-5.3-codex logo
GPT-5.3-CodexGravitational Waves Animation
gpt-5.3-codex logo
GPT-5.3-Codex
Feb 2026·Gravitational Waves Animation
Run in Lab
gpt-oss-120b logo
GPT OSS 120BGravitational Waves Animation
gpt-oss-120b logo
GPT OSS 120B
Aug 2025·Gravitational Waves Animation
Run in Lab
gpt-oss-20b logo
GPT OSS 20BGravitational Waves Animation
gpt-oss-20b logo
GPT OSS 20B
Aug 2025·Gravitational Waves Animation
Run in Lab
grok-4 logo
xAI: Grok 4Gravitational Waves Animation
grok-4 logo
xAI: Grok 4
Jul 2025·Gravitational Waves Animation
Run in Lab
grok-4-fast-free logo
xAI: Grok 4 Fast (free)Gravitational Waves Animation
grok-4-fast-free logo
xAI: Grok 4 Fast (free)
Sep 2025·Gravitational Waves Animation
Run in Lab
grok-4.1-fast logo
Grok 4.1 FastGravitational Waves Animation
grok-4.1-fast logo
Grok 4.1 Fast
Nov 2025·Gravitational Waves Animation
Run in Lab
grok-code-fast-1 logo
Grok Code Fast 1Gravitational Waves Animation
grok-code-fast-1 logo
Grok Code Fast 1
Aug 2025·Gravitational Waves Animation
Run in Lab
horizon-alpha logo
Horizon AlphaGravitational Waves Animation
horizon-alpha logo
Horizon Alpha
Jul 2025·Gravitational Waves Animation
Run in Lab
horizon-beta logo
Horizon BetaGravitational Waves Animation
horizon-beta logo
Horizon Beta
Aug 2025·Gravitational Waves Animation
Run in Lab
intellect-3 logo
INTELLECT-3Gravitational Waves Animation
intellect-3 logo
INTELLECT-3
Nov 2025·Gravitational Waves Animation
Run in Lab
kimi-k2 logo
Kimi K2Gravitational Waves Animation
kimi-k2 logo
Kimi K2
Jul 2025·Gravitational Waves Animation
Run in Lab
kimi-k2-0905 logo
MoonshotAI: Kimi K2 0905Gravitational Waves Animation
kimi-k2-0905 logo
MoonshotAI: Kimi K2 0905
Sep 2025·Gravitational Waves Animation
Run in Lab
kimi-k2-thinking logo
Kimi K2 ThinkingGravitational Waves Animation
kimi-k2-thinking logo
Kimi K2 Thinking

We can’t display this one. It’s not us. Well… it might be us.

The model was asked for a web page. It produced something else. We’re not going to define what.

View raw output
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gravitational Waves - Black Hole Merger</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            background: radial-gradient(ellipse at center, #0a0e2a 0%, #000000 100%);
            overflow: hidden;
            font-family: 'Arial', sans-serif;
        }
        
        canvas {
            display: block;
            cursor: crosshair;
        }
        
        .info {
            position: absolute;
            top: 20px;
            left: 20px;
            color: #e0f7ff;
            font-size: 14px;
            z-index: 10;
            background: rgba(10, 20, 40, 0.6);
            backdrop-filter: blur(10px);
            padding: 15px;
            border-radius: 8px;
            border: 1px solid rgba(64, 156, 255, 0.2);
            box-shadow: 0 4px 20px rgba(0, 60, 120, 0.3);
        }
        
        .info h1 {
            font-size: 18px;
            margin-bottom: 10px;
            color: #4fc3f7;
            text-shadow: 0 0 10px rgba(79, 195, 247, 0.7);
        }
        
        .info p {
            margin: 5px 0;
            color: #bbdefb;
        }
        
        .controls {
            position: absolute;
            bottom: 20px;
            left: 50%;
            transform: translateX(-50%);
            display: flex;
            gap: 10px;
            z-index: 10;
        }
        
        button {
            padding: 10px 20px;
            background: rgba(25, 118, 210, 0.2);
            border: 1px solid rgba(64, 156, 255, 0.4);
            color: #e3f2fd;
            cursor: pointer;
            border-radius: 5px;
            transition: all 0.3s;
            font-weight: bold;
            box-shadow: 0 2px 10px rgba(0, 60, 120, 0.2);
        }
        
        button:hover {
            background: rgba(41, 121, 255, 0.3);
            box-shadow: 0 0 15px rgba(66, 165, 245, 0.5);
        }
        
        .legend {
            position: absolute;
            top: 20px;
            right: 20px;
            color: #e0f7ff;
            font-size: 12px;
            background: rgba(10, 20, 40, 0.6);
            backdrop-filter: blur(10px);
            padding: 15px;
            border-radius: 8px;
            border: 1px solid rgba(64, 156, 255, 0.2);
            box-shadow: 0 4px 20px rgba(0, 60, 120, 0.3);
        }
        
        .legend-item {
            margin: 8px 0;
            display: flex;
            align-items: center;
            gap: 10px;
            color: #bbdefb;
        }
        
        .color-box {
            width: 30px;
            height: 3px;
            border-radius: 2px;
        }
    </style>
</head>
<body>
    <div class="info">
        <h1>Gravitational Wave Visualization</h1>
        <p>Two black holes spiraling together</p>
        <p>Time: <span id="time">0.0</span>s</p>
        <p>Phase: <span id="phase">Inspiral</span></p>
    </div>
    
    <div class="legend">
        <div class="legend-item">
            <div class="color-box" style="background: #ff4444;"></div>
            <span>Black Hole 1</span>
        </div>
        <div class="legend-item">
            <div class="color-box" style="background: #4444ff;"></div>
            <span>Black Hole 2</span>
        </div>
        <div class="legend-item">
            <div class="color-box" style="background: #00ffff;"></div>
            <span>Gravitational Waves</span>
        </div>
    </div>
    
    <div class="controls">
        <button onclick="toggleAnimation()">Play/Pause</button>
        <button onclick="resetAnimation()">Reset</button>
    </div>
    
    <canvas id="canvas"></canvas>
    
    <script>
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        
        let animationId;
        let isPlaying = true;
        let startTime = Date.now();
        let currentTime = 0;
        
        // Physical constants (scaled for visualization)
        const G = 1; // Gravitational constant (scaled)
        const c = 50; // Speed of light (scaled)
        const gridSize = 30;
        const gridPoints = [];
        
        // Black hole properties - using realistic mass ratio and separation
        const blackHole1 = {
            x: canvas.width / 2 - 100,
            y: canvas.height / 2,
            mass: 10, // Solar masses (scaled)
            radius: 15,
            vx: 0,
            vy: 0.8,
            trail: []
        };
        
        const blackHole2 = {
            x: canvas.width / 2 + 100,
            y: canvas.height / 2,
            mass: 8, // Solar masses (scaled)
            radius: 12,
            vx: 0,
            vy: -1.0,
            trail: []
        };
        
        // Wave properties - modeling chirp and ringdown phases
        let waveAmplitude = 0;
        let waveFrequency = 0.02;
        let wavePhase = 0;
        let ringdownAmplitude = 0;
        let mergerTime = 0;
        let hasMerged = false;
        
        // Create grid points
        for (let x = 0; x < canvas.width; x += gridSize) {
            for (let y = 0; y < canvas.height; y += gridSize) {
                gridPoints.push({ 
                    x, y, 
                    originalX: x, 
                    originalY: y,
                    distanceToCenter1: 0,
                    distanceToCenter2: 0
                });
            }
        }
        
        // Calculate gravitational wave strain based on time and black hole dynamics
        function calculateWaveStrain(time) {
            const separation = Math.sqrt(
                Math.pow(blackHole1.x - blackHole2.x, 2) + 
                Math.pow(blackHole1.y - blackHole2.y, 2)
            );
            
            // Orbital frequency from Kepler's third law
            const totalMass = blackHole1.mass + blackHole2.mass;
            const orbitalFreq = Math.sqrt(G * totalMass / Math.pow(separation, 3));
            
            // Gravitational wave frequency is twice the orbital frequency
            waveFrequency = 2 * orbitalFreq;
            
            // Amplitude scales with chirp mass and separation
            const chirpMass = Math.pow(blackHole1.mass * blackHole2.mass, 3/5) / 
                             Math.pow(totalMass, 1/5);
            const amplitude = (G * chirpMass) / (c * c * separation);
            
            return amplitude * Math.sin(wavePhase);
        }
        
        // Update physics - handles inspiral, merger and ringdown phases
        function updatePhysics(deltaTime) {
            if (hasMerged) return;
            
            // Calculate distance between black holes
            const dx = blackHole2.x - blackHole1.x;
            const dy = blackHole2.y - blackHole1.y;
            const distance = Math.sqrt(dx * dx + dy * dy);
            
            // Calculate gravitational force
            const force = G * blackHole1.mass * blackHole2.mass / (distance * distance);
            const ax = force * dx / distance / blackHole1.mass;
            const ay = force * dy / distance / blackHole1.mass;
            
            // Apply gravitational wave back-reaction (simplified)
            const energyLossFactor = 1 + 0.1 * waveAmplitude * waveAmplitude;
            
            // Update velocities
            blackHole1.vx += ax * deltaTime * energyLossFactor;
            blackHole1.vy += ay * deltaTime * energyLossFactor;
            blackHole2.vx -= ax * deltaTime * energyLossFactor;
            blackHole2.vy -= ay * deltaTime * energyLossFactor;
            
            // Update positions
            blackHole1.x += blackHole1.vx * deltaTime;
            blackHole1.y += blackHole1.vy * deltaTime;
            blackHole2.x += blackHole2.vx * deltaTime;
            blackHole2.y += blackHole2.vy * deltaTime;
            
            // Add to trails
            blackHole1.trail.push({ x: blackHole1.x, y: blackHole1.y });
            blackHole2.trail.push({ x: blackHole2.x, y: blackHole2.y });
            
            // Limit trail length
            if (blackHole1.trail.length > 100) {
                blackHole1.trail.shift();
                blackHole2.trail.shift();
            }
            
            // Check for merger
            if (distance < (blackHole1.radius + blackHole2.radius) * 1.5 && !hasMerged) {
                hasMerged = true;
                mergerTime = currentTime;
                // Combine masses and create final black hole
                const finalMass = blackHole1.mass + blackHole2.mass;
                blackHole1.mass = finalMass;
                blackHole1.radius = Math.sqrt(finalMass) * 5;
                blackHole1.x = (blackHole1.x + blackHole2.x) / 2;
                blackHole1.y = (blackHole1.y + blackHole2.y) / 2;
                blackHole1.vx = 0;
                blackHole1.vy = 0;
            }
            
            // Update wave properties
            waveAmplitude = calculateWaveStrain(currentTime);
            wavePhase += waveFrequency * deltaTime * 60;
            
            // Ringdown phase after merger
            if (hasMerged) {
                const timeSinceMerger = currentTime - mergerTime;
                const ringdownFreq = 0.1; // Quasi-normal mode frequency
                const damping = Math.exp(-timeSinceMerger / 30); // Damping factor
                ringdownAmplitude = waveAmplitude * damping * Math.sin(ringdownFreq * timeSinceMerger * 60);
            }
        }
        
        // Draw black hole with accretion disk effect
        function drawBlackHole(bh, color) {
            // Draw accretion disk
            const gradient = ctx.createRadialGradient(bh.x, bh.y, bh.radius, bh.x, bh.y, bh.radius * 3);
            gradient.addColorStop(0, 'transparent');
            gradient.addColorStop(0.5, color + '40');
            gradient.addColorStop(1, 'transparent');
            ctx.fillStyle = gradient;
            ctx.beginPath();
            ctx.arc(bh.x, bh.y, bh.radius * 3, 0, Math.PI * 2);
            ctx.fill();
            
            // Draw black hole
            const bhGradient = ctx.createRadialGradient(bh.x, bh.y, 0, bh.x, bh.y, bh.radius);
            bhGradient.addColorStop(0, color);
            bhGradient.addColorStop(0.7, color + 'dd');
            bhGradient.addColorStop(1, '#000000');
            ctx.fillStyle = bhGradient;
            ctx.beginPath();
            ctx.arc(bh.x, bh.y, bh.radius, 0, Math.PI * 2);
            ctx.fill();
            
            // Draw event horizon glow
            ctx.strokeStyle = color + '60';
            ctx.lineWidth = 2;
            ctx.beginPath();
            ctx.arc(bh.x, bh.y, bh.radius * 1.2, 0, Math.PI * 2);
            ctx.stroke();
        }
        
        // Draw gravitational wave grid deformation
        function drawGrid() {
            ctx.strokeStyle = 'rgba(79, 195, 247, 0.15)';
            ctx.lineWidth = 1;
            
            // Update grid points based on gravitational waves
            gridPoints.forEach(point => {
                // Calculate distance to each black hole
                const dx1 = point.originalX - blackHole1.x;
                const dy1 = point.originalY - blackHole1.y;
                const distance1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);
                
                const dx2 = point.originalX - blackHole2.x;
                const dy2 = point.originalY - blackHole2.y;
                const distance2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);
                
                point.distanceToCenter1 = distance1;
                point.distanceToCenter2 = distance2;
                
                // Calculate gravitational wave displacement
                let displacement = 0;
                
                if (!hasMerged) {
                    // Inspiral phase - quadrupole radiation pattern
                    const factor1 = waveAmplitude * 50 / (distance1 + 100);
                    const factor2 = waveAmplitude * 50 / (distance2 + 100);
                    
                    // Plus polarization pattern
                    const angle1 = Math.atan2(dy1, dx1);
                    const angle2 = Math.atan2(dy2, dx2);
                    
                    displacement = factor1 * Math.cos(2 * angle1) * Math.sin(wavePhase) +
                                 factor2 * Math.cos(2 * angle2) * Math.sin(wavePhase);
                } else {
                    // Ringdown phase - damped oscillations
                    const timeSinceMerger = currentTime - mergerTime;
                    const ringdownFactor = Math.exp(-timeSinceMerger / 20) * 30;
                    const centerX = blackHole1.x;
                    const centerY = blackHole1.y;
                    const dx = point.originalX - centerX;
                    const dy = point.originalY - centerY;
                    const distance = Math.sqrt(dx * dx + dy * dy);
                    
                    displacement = ringdownFactor * Math.sin(distance * 0.05 - timeSinceMerger * 0.5) / (distance + 50);
                }
                
                // Apply displacement
                point.x = point.originalX + displacement;
                point.y = point.originalY + displacement;
            });
            
            // Draw horizontal lines
            for (let y = 0; y < canvas.height; y += gridSize) {
                ctx.beginPath();
                for (let x = 0; x < canvas.width; x += gridSize) {
                    const point = gridPoints.find(p => p.originalX === x && p.originalY === y);
                    if (point) {
                        if (x === 0) {
                            ctx.moveTo(point.x, point.y);
                        } else {
                            ctx.lineTo(point.x, point.y);
                        }
                    }
                }
                ctx.stroke();
            }
            
            // Draw vertical lines
            for (let x = 0; x < canvas.width; x += gridSize) {
                ctx.beginPath();
                for (let y = 0; y < canvas.height; y += gridSize) {
                    const point = gridPoints.find(p => p.originalX === x && p.originalY === y);
                    if (point) {
                        if (y === 0) {
                            ctx.moveTo(point.x, point.y);
                        } else {
                            ctx.lineTo(point.x, point.y);
                        }
                    }
                }
                ctx.stroke();
            }
        }
        
        // Draw orbital trails showing black hole motion
        function drawTrails() {
            // Draw black hole 1 trail
            if (blackHole1.trail.length > 1) {
                ctx.strokeStyle = 'rgba(255, 100, 100, 0.4)';
                ctx.lineWidth = 2;
                ctx.beginPath();
                blackHole1.trail.forEach((point, index) => {
                    if (index === 0) {
                        ctx.moveTo(point.x, point.y);
                    } else {
                        ctx.lineTo(point.x, point.y);
                    }
                });
                ctx.stroke();
            }
            
            // Draw black hole 2 trail
            if (blackHole2.trail.length > 1) {
                ctx.strokeStyle = 'rgba(100, 100, 255, 0.4)';
                ctx.lineWidth = 2;
                ctx.beginPath();
                blackHole2.trail.forEach((point, index) => {
                    if (index === 0) {
                        ctx.moveTo(point.x, point.y);
                    } else {
                        ctx.lineTo(point.x, point.y);
                    }
                });
                ctx.stroke();
            }
        }
        
        // Main animation loop
        function animate() {
            if (!isPlaying) return;
            
            // Clear canvas with fade effect
            ctx.fillStyle = 'rgba(10, 14, 42, 0.15)';
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            
            // Update time
            currentTime = (Date.now() - startTime) / 1000;
            
            // Check if animation should loop
            if (currentTime > 30) {
                resetAnimation();
                return;
            }
            
            // Update physics
            updatePhysics(1/60);
            
            // Draw trails
            drawTrails();
            
            // Draw grid
            drawGrid();
            
            // Draw black holes
            if (!hasMerged) {
                drawBlackHole(blackHole1, '#ff6b6b');
                drawBlackHole(blackHole2, '#4d8af0');
            } else {
                drawBlackHole(blackHole1, '#9c4dff');
            }
            
            // Update UI
            document.getElementById('time').textContent = currentTime.toFixed(1);
            let phase = 'Inspiral';
            if (hasMerged) phase = 'Ringdown';
            else if (currentTime > 25) phase = '
Nov 2025·Gravitational Waves Animation
Run in Lab
kimi-k2.5 logo
Kimi K2.5Gravitational Waves Animation
kimi-k2.5 logo
Kimi K2.5
Jan 2026·Gravitational Waves Animation
Legendary·Wave physics
Run in Lab
kimi-linear-48b-a3b-instruct logo
Kimi Linear 48B A3B InstructGravitational Waves Animation
kimi-linear-48b-a3b-instruct logo
Kimi Linear 48B A3B Instruct
Nov 2025·Gravitational Waves Animation
Run in Lab
llama-4-maverick logo
Llama 4 MaverickGravitational Waves Animation
llama-4-maverick logo
Llama 4 Maverick
Jul 2025·Gravitational Waves Animation
Run in Lab
mimo-v2-flash logo
MiMo-V2-FlashGravitational Waves Animation
mimo-v2-flash logo
MiMo-V2-Flash
Dec 2025·Gravitational Waves Animation
Run in Lab
minimax-m2-free logo
MiniMax M2Gravitational Waves Animation
minimax-m2-free logo
MiniMax M2
Oct 2025·Gravitational Waves Animation
Run in Lab
minimax-m2-her logo
MiniMax M2-herGravitational Waves Animation
minimax-m2-her logo
MiniMax M2-her
Jan 2026·Gravitational Waves Animation
Run in Lab
minimax-m2.1 logo
MiniMax: MiniMax M2.1Gravitational Waves Animation
minimax-m2.1 logo
MiniMax: MiniMax M2.1
Dec 2025·Gravitational Waves Animation
Run in Lab
minimax-m2.5 logo
MiniMax M2.5Gravitational Waves Animation
minimax-m2.5 logo
MiniMax M2.5
Feb 2026·Gravitational Waves Animation
Run in Lab
mistral-large-2512 logo
Mistral Large 3 2512Gravitational Waves Animation
mistral-large-2512 logo
Mistral Large 3 2512
Dec 2025·Gravitational Waves Animation
Run in Lab
mistral-medium-3.1 logo
Mistral Medium 3.1Gravitational Waves Animation
mistral-medium-3.1 logo
Mistral Medium 3.1
Aug 2025·Gravitational Waves Animation
Run in Lab
mistral-small-creative logo
Mistral Small CreativeGravitational Waves Animation
mistral-small-creative logo
Mistral Small Creative
Dec 2025·Gravitational Waves Animation
Run in Lab
nemotron-nano-9b-v2 logo
NVIDIA Nemotron Nano 9B V2Gravitational Waves Animation
nemotron-nano-9b-v2 logo
NVIDIA Nemotron Nano 9B V2
Sep 2025·Gravitational Waves Animation
Run in Lab
nova-2-lite-v1-free logo
Amazon Nova 2 LiteGravitational Waves Animation
nova-2-lite-v1-free logo
Amazon Nova 2 Lite
Dec 2025·Gravitational Waves Animation
Run in Lab
nova-premier-v1 logo
Nova Premier 1.0Gravitational Waves Animation
nova-premier-v1 logo
Nova Premier 1.0
Nov 2025·Gravitational Waves Animation
Run in Lab
o3 logo
OpenAI o3Gravitational Waves Animation
o3 logo
OpenAI o3
Jul 2025·Gravitational Waves Animation
Legendary·Physics first
Run in Lab
polaris-alpha logo
Polaris AlphaGravitational Waves Animation
polaris-alpha logo
Polaris Alpha
Nov 2025·Gravitational Waves Animation
Run in Lab
pony-alpha logo
Pony AlphaGravitational Waves Animation
pony-alpha logo
Pony Alpha
Feb 2026·Gravitational Waves Animation
Run in Lab
qwen-plus-2025-07-28 logo
Qwen Plus 0728Gravitational Waves Animation
qwen-plus-2025-07-28 logo
Qwen Plus 0728
Sep 2025·Gravitational Waves Animation
Run in Lab
qwen-plus-2025-07-28-thinking logo
Qwen Plus 0728 (thinking)Gravitational Waves Animation
qwen-plus-2025-07-28-thinking logo
Qwen Plus 0728 (thinking)
Sep 2025·Gravitational Waves Animation
Run in Lab
qwen3-235b-a22b-07-25 logo
Qwen: Qwen3 235B A22B 2507Gravitational Waves Animation
qwen3-235b-a22b-07-25 logo
Qwen: Qwen3 235B A22B 2507
Jul 2025·Gravitational Waves Animation
Run in Lab
qwen3-30b-a3b-instruct-2507 logo
Qwen: Qwen3 30B A3B Instruct 2507Gravitational Waves Animation
qwen3-30b-a3b-instruct-2507 logo
Qwen: Qwen3 30B A3B Instruct 2507
Jul 2025·Gravitational Waves Animation
Run in Lab
qwen3-30b-a3b-thinking-2507 logo
Qwen3 30B A3B Thinking 2507Gravitational Waves Animation
qwen3-30b-a3b-thinking-2507 logo
Qwen3 30B A3B Thinking 2507
Aug 2025·Gravitational Waves Animation
Run in Lab
qwen3-coder-flash logo
Qwen3 Coder FlashGravitational Waves Animation
qwen3-coder-flash logo
Qwen3 Coder Flash
Sep 2025·Gravitational Waves Animation
Run in Lab
qwen3-coder-next logo
Qwen3 Coder NextGravitational Waves Animation
qwen3-coder-next logo
Qwen3 Coder Next
Feb 2026·Gravitational Waves Animation
Run in Lab
qwen3-coder-plus logo
Qwen3 Coder PlusGravitational Waves Animation
qwen3-coder-plus logo
Qwen3 Coder Plus
Sep 2025·Gravitational Waves Animation
Run in Lab
qwen3-max logo
Qwen: Qwen3 MaxGravitational Waves Animation
qwen3-max logo
Qwen: Qwen3 Max
Sep 2025·Gravitational Waves Animation
Run in Lab
qwen3-next-80b-a3b-instruct logo
Qwen3 Next 80B A3B InstructGravitational Waves Animation
qwen3-next-80b-a3b-instruct logo
Qwen3 Next 80B A3B Instruct
Sep 2025·Gravitational Waves Animation
Run in Lab
qwen3-next-80b-a3b-thinking logo
Qwen3 Next 80B A3B ThinkingGravitational Waves Animation
qwen3-next-80b-a3b-thinking logo
Qwen3 Next 80B A3B Thinking
Sep 2025·Gravitational Waves Animation
Run in Lab
qwen3.5-122b-a10b logo
Qwen: Qwen3.5 122B A10BGravitational Waves Animation
qwen3.5-122b-a10b logo
Qwen: Qwen3.5 122B A10B
Feb 2026·Gravitational Waves Animation
Run in Lab
qwen3.5-27b logo
Qwen: Qwen3.5 27BGravitational Waves Animation
qwen3.5-27b logo
Qwen: Qwen3.5 27B
Feb 2026·Gravitational Waves Animation
Run in Lab
qwen3.5-35b-a3b logo
Qwen: Qwen3.5 35B A3BGravitational Waves Animation
qwen3.5-35b-a3b logo
Qwen: Qwen3.5 35B A3B
Feb 2026·Gravitational Waves Animation
Run in Lab
qwen3.5-397b-a17b logo
Qwen: Qwen3.5 397B A17BGravitational Waves Animation
qwen3.5-397b-a17b logo
Qwen: Qwen3.5 397B A17B
Feb 2026·Gravitational Waves Animation
Run in Lab
qwen3.5-flash-02-23 logo
Qwen: Qwen3.5 FlashGravitational Waves Animation
qwen3.5-flash-02-23 logo
Qwen: Qwen3.5 Flash
Feb 2026·Gravitational Waves Animation
Run in Lab
qwen3.5-plus-02-15 logo
Qwen: Qwen3.5 Plus 2026-02-15Gravitational Waves Animation
qwen3.5-plus-02-15 logo
Qwen: Qwen3.5 Plus 2026-02-15
Feb 2026·Gravitational Waves Animation
Run in Lab
sherlock-dash-alpha logo
Sherlock Dash AlphaGravitational Waves Animation
sherlock-dash-alpha logo
Sherlock Dash Alpha
Nov 2025·Gravitational Waves Animation
Run in Lab
sherlock-think-alpha logo
Sherlock Think AlphaGravitational Waves Animation
sherlock-think-alpha logo
Sherlock Think Alpha
Nov 2025·Gravitational Waves Animation
Run in Lab
solar-pro-3-free logo
Solar Pro 3Gravitational Waves Animation
solar-pro-3-free logo
Solar Pro 3
Jan 2026·Gravitational Waves Animation
Run in Lab
sonar-pro-search logo
Sonar Pro SearchGravitational Waves Animation
sonar-pro-search logo
Sonar Pro Search
Nov 2025·Gravitational Waves Animation
Run in Lab
sonoma-dusk-alpha logo
Sonoma Dusk AlphaGravitational Waves Animation
sonoma-dusk-alpha logo
Sonoma Dusk Alpha
Sep 2025·Gravitational Waves Animation
Run in Lab
sonoma-sky-alpha logo
Sonoma Sky AlphaGravitational Waves Animation
sonoma-sky-alpha logo
Sonoma Sky Alpha
Sep 2025·Gravitational Waves Animation
Run in Lab
tng-r1t-chimera-free logo
TNG R1T ChimeraGravitational Waves Animation
tng-r1t-chimera-free logo
TNG R1T Chimera
Nov 2025·Gravitational Waves Animation
Run in Lab
trinity-large-preview-free logo
Trinity Large PreviewGravitational Waves Animation
trinity-large-preview-free logo
Trinity Large Preview
Jan 2026·Gravitational Waves Animation
Run in Lab