← circus

Simple Morphs

Morphing geometric forms

Python Code


"""
Comprehensive showcase of all vood layout functions
Demonstrates each layout's unique characteristics with animated transitions
"""

from vood.components import TextRenderer, TextState, MorphRenderer
from vood.converter.converter_type import ConverterType
from vood.components.states.morphs import (
    MorphArcState,
    MorphArrowState,
    MorphCircleState,
    MorphCrossState,
    MorphEllipseState,
    MorphFlowerState,
    MorphHeartState,
    MorphHexagonState,
    MorphInfinityState,
    MorphLineState,
    MorphOctagonState,
    MorphPentagonState,
    MorphPolygonState,
    MorphRectangleState,
    MorphSpiralState,
    MorphSquareState,
    MorphStarState,
    MorphTriangleState,
    MorphWaveState,
)
from vood.core.logger import configure_logging
from vood.velements import VElement
from vood.vscene import VScene
from vood.vscene.vscene_exporter import VSceneExporter
from dataclasses import replace
from vood.core.color import Color

from vood.animations.atomic import sequential_transition, fade, trim

configure_logging(level="INFO")

FILL_COLOR = Color("#FDBE02")
STROKE_COLOR = Color("#AA0000")


def main():
    # Create the scene
    scene = VScene(width=256, height=256, background=Color("#000017"))

    base_name_state = TextState(
        text="",
        font_family="Courier New",
        font_size=20,
        fill_color=Color("#AA0000"),
        y=110,
    )

    # Define all layout transitions
    morph_states = []
    morph_name_states = []

    morph_states.append(
        MorphCircleState(fill_color=FILL_COLOR, stroke_color=STROKE_COLOR)
    )
    morph_name_states.append(replace(base_name_state, text="MorphCircle"))

    morph_states.append(
        MorphArrowState(fill_color=FILL_COLOR, stroke_color=STROKE_COLOR, rotation=-45)
    )
    morph_name_states.append(replace(base_name_state, text="MorphArrow"))

    morph_states.append(
        MorphCrossState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphCross"))

    morph_states.append(
        MorphLineState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphLine"))

    morph_states.append(
        MorphEllipseState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphEllipse"))

    morph_states.append(
        MorphPentagonState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphPentagon"))

    morph_states.append(
        MorphFlowerState(fill_color=FILL_COLOR, stroke_color=STROKE_COLOR)
    )
    morph_name_states.append(replace(base_name_state, text="MorphFlower"))

    morph_states.append(
        MorphHeartState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphHeart"))

    morph_states.append(
        MorphWaveState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphWave"))

    morph_states.append(
        MorphHexagonState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphHexagon"))

    morph_states.append(
        MorphInfinityState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphInfinity"))

    morph_states.append(
        MorphOctagonState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )

    morph_name_states.append(replace(base_name_state, text="MorphOctagon"))

    morph_states.append(
        MorphArcState(
            stroke_color=STROKE_COLOR,
            radius=40,
            start_angle=10,
            end_angle=170,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphArc"))

    morph_states.append(
        MorphRectangleState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphRectangle"))

    morph_states.append(
        MorphPolygonState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphPolygon"))

    morph_states.append(
        MorphSpiralState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphSpiral"))

    morph_states.append(
        MorphSquareState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphSquare"))

    morph_states.append(
        MorphStarState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphStar"))

    morph_states.append(
        MorphTriangleState(
            fill_color=FILL_COLOR,
            stroke_color=STROKE_COLOR,
        )
    )
    morph_name_states.append(replace(base_name_state, text="MorphTriangle"))

    # pause morph shapes for a short time

    morph_keystates = sequential_transition(morph_states, trim, 0.8)

    # Add all elements to the scene
    scene.add_element(
        VElement(
            renderer=MorphRenderer(),
            keystates=morph_keystates,
        )
    )

    text_keyframes = sequential_transition(morph_name_states, fade, 0.5)

    texts = VElement(renderer=TextRenderer(), keystates=text_keyframes)
    scene.add_element(texts)

    # Create the exporter
    exporter = VSceneExporter(
        scene=scene,
        converter=ConverterType.CAIROSVG,
        output_dir="output/",
    )

    # Export to MP4 file
    exporter.to_mp4(
        filename="simple_morphs.mp4",
        total_frames=len(morph_states) * 30,
        framerate=30,
        png_width_px=1024,
    )


if __name__ == "__main__":
    main()



Remarks

  • See vood.components.states.morphs for the geometric forms implemented so far which can be morphed into each other in animations.