← 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.morphsfor the geometric forms implemented so far which can be morphed into each other in animations.