← circus
State collection morphing
M -> N morphing
Python Code
"""Example: M->N shape group morphing using ShapeCollectionState
Demonstrates morphing between different numbers of independent shapes:
- 3 triangles + 2 squares -> 1 ellipse + 3 rectangles
Each shape has independent colors and properties. The mapping uses
the same VertexLoopMapper strategies as hole morphing (ClusteringMapper by default).
"""
from svan2d.component.state import (
StateCollectionState,
TriangleState,
SquareState,
EllipseState,
RectangleState,
)
from svan2d.converter.converter_type import ConverterType
from svan2d.core.logger import configure_logging
from svan2d.core.point2d import Point2D
from svan2d.velement import VElement
from svan2d.vscene import VScene
from svan2d.vscene.vscene_exporter import VSceneExporter
from svan2d.core.color import Color
configure_logging(level="INFO")
def main():
# Create the scene
scene = VScene(width=256, height=256, background=Color("#000017"))
state1 = StateCollectionState(
states=[
TriangleState(
pos=Point2D(-70, -50),
size=30,
fill_color=Color("#F3B700"),
),
TriangleState(
pos=Point2D(0, -50),
size=30,
fill_color=Color("#FAA300"),
),
TriangleState(
pos=Point2D(70, -50),
size=30,
fill_color=Color("#E57C04"),
),
SquareState(
pos=Point2D(-50, 50),
size=40,
fill_color=Color("#F63E02"),
),
SquareState(
pos=Point2D(50, 50),
size=40,
fill_color=Color("#FF0000"),
),
]
)
state2 = StateCollectionState(
states=[
EllipseState(
pos=Point2D(0, -60),
rx=70,
ry=30,
fill_color=Color("#FDBE02"),
),
RectangleState(
pos=Point2D(70, 50),
width=50,
height=30,
fill_color=Color("#FDBE02"),
),
]
)
# Create element with morphing animation
element = (
VElement()
.keystate(state1, at=0.0)
.keystate(state2, at=0.5)
.keystate(state1, at=1.0)
)
scene.add_element(element)
# Create the exporter
exporter = VSceneExporter(
scene=scene,
converter=ConverterType.PLAYWRIGHT,
output_dir="output/",
)
# Export to MP4
exporter.to_mp4(
filename="state_collection_morphing",
total_frames=180,
framerate=30,
png_width_px=1024,
)
if __name__ == "__main__":
main()