Skip to content

Interference

Moiré interference patterns created by overlapping concentric wave sources moving in Lissajous paths. The overlapping waves produce mesmerizing visual beats and shifting geometric patterns.

Examples

Basic

Default settings.

<template>
    <EffectDemo>
        <canvas ref="canvasRef"></canvas>
    </EffectDemo>
</template>

<script
    setup
    lang="ts">
    import { onMounted, onUnmounted, ref } from 'vue';
    import { createInterference } from '@basmilius/sparkle';

    const canvasRef = ref<HTMLCanvasElement>();
    let sim: ReturnType<typeof createInterference> | null = null;

    onMounted(() => {
        if (canvasRef.value) {
            sim = createInterference({ scale: 1 });
            sim.mount(canvasRef.value).start();
        }
    });

    onUnmounted(() => {
        sim?.destroy();
        sim = null;
    });
</script>

Configuration

All options are passed via a config object:

typescript
import { createInterference } from '@basmilius/sparkle';

const interference = createInterference({
    speed: 1,
    resolution: 3,
    layers: 3,
    colors: ['#ff4488', '#4488ff', '#44ff88'],
    scale: 1
});
interference.mount(canvas).start();

speed

Overall animation speed multiplier. Controls how fast the wave sources move along their Lissajous paths. Default: 1.

typescript
createInterference({ speed: 0.5 });

resolution

Pixel step size for rendering. Lower values produce sharper patterns but are more expensive to render. Default: 3.

typescript
createInterference({ resolution: 2 });

layers

Number of concentric wave sources. More layers create more complex interference patterns. Default: 3.

typescript
createInterference({ layers: 5 });

colors

Array of colors for each wave source layer. Colors are cycled if there are more layers than colors.

typescript
createInterference({ colors: ['#ff0000', '#00ff00', '#0000ff'] });

scale

Scales all size-related values proportionally. Default: 1.

typescript
createInterference({ scale: 1.5 });