Diese Animation hatt ich schonmal mit Adobe Flash gebaut, aber da es auch Open Source Compiler gibt ...

Zum Beispiel haXe, was es für Windows und Linux gibt. Ist ein bissel wie Java mit ActionScript drin.

Hier drunter ist der Quelltext für die Animation. Wie man einen Kreis aus Splines Zeichnet hab ich aus nem Forum.

Man klicke auf das blaue Viereck.


import flash.MovieClip;

class Drehkreise {

    static var mc : MovieClip;
    static var scheiben : Scheiben;

    static function main() {

        scheiben = new Scheiben();

        mc = flash.Lib.current;
        var button = mc.createEmptyMovieClip ("button", mc.getNextHighestDepth());

        button.beginFill(0x234090,20);
        button.moveTo(180,105);
        button.lineTo(180,145);
        button.lineTo(220,145);
        button.lineTo(220,105);
        button.endFill();

        button.onRelease = scheiben.neu;
        mc.onEnterFrame = scheiben.drehen; 

    }

} // class Drehkreise

class Scheiben {
    
    private var mc : MovieClip;
    private var scheibe : Array<MovieClip>;
    private var geschwindigkeit : Array<Float>;
    
    public function new() { // constructor
        
        mc = flash.Lib.current;
        var anzahlderkreise = 24;
        scheibe = new Array();
        geschwindigkeit = new Array();

        for( i in 0...anzahlderkreise ) {
            scheibe[i] = mc.createEmptyMovieClip ("scheibe"+i, mc.getNextHighestDepth());
            malen(scheibe[i]);
            scheibe[i]._rotation = (360/anzahlderkreise)*i; //startwinkel
    	    geschwindigkeit[i] = Math.random()*1.5 -0.75;
        }    
    } // new
    
    public function neu() { // Scheiben loeschen und neue malen
        
        for( i in 0...scheibe.length ) {
            scheibe[i].removeMovieClip();
        }
        
        var anzahlderkreise = Math.round(Math.random()*20 +15);
        // trace(anzahlderkreise);
        
        for( i in 0...anzahlderkreise ) {
            scheibe[i] = mc.createEmptyMovieClip ("scheibe"+i, mc.getNextHighestDepth());
            malen(scheibe[i]);
            scheibe[i]._rotation = (360/anzahlderkreise)*i; //startwinkel
    	    geschwindigkeit[i] = Math.random()*1.5 -0.75; // um wieviel Grad sich scheibe[i] pro Frame dreht
        }    
    } // neu
    
    private function malen( scheibe : MovieClip ) {
        scheibe.beginFill(0x234090,Math.random()*2+5);
        var segmente = 10; // bestimmt, in wievielen Schritten jede Scheibe gemalt wird
        
        var radius = Math.random()*100+100; // aussenradius
        var angle = (Math.random()*135+45)  /segmente/180*Math.PI; // Winkel des Kreisbogens durch anzahl der Segmente
        var ctrlR = radius / Math.cos(angle / 2);
        var winkel = 0.0; // jeweils der aktuelle Winkel
        
        var px = Math.cos(winkel) * radius;
        var py = 0.0;// Math.sin(winkel) * radius;
        scheibe.moveTo(px, py); // an dem Punkt wird angefangen zu zeichnen
        
        var s = 0;
        while (s < segmente) // aussenkreis
        {
        	winkel += angle;
        	var winkelHalb = winkel - angle / 2;
        	var cx = Math.cos(winkelHalb) * ctrlR;
        	var cy = Math.sin(winkelHalb) * ctrlR;
        	px = Math.cos(winkel) * radius;
        	py = Math.sin(winkel) * radius;
        	scheibe.curveTo(cx, cy, px, py);
            s++;
        } 
        
        radius -= Math.random()*radius; // innenradius
        if (radius < 45) radius+=45; // mindestinnenradius ( darf nicht groesser sein als aussenradius/2 )
        ctrlR = radius / Math.cos(angle / 2);
        px = Math.cos(winkel) * radius;
        py = Math.sin(winkel) * radius;
        scheibe.lineTo(px, py); // gerade kante vom Aussenbogen zum Innenbogen
        
        s = segmente-1;
        while ( s >= 0 ) // innenkreis
        {
        	winkel -= angle;
        	var winkelHalb =  winkel + angle / 2;
        	var cx = Math.cos(winkelHalb) * ctrlR;
        	var cy = Math.sin(winkelHalb) * ctrlR;
        	px = Math.cos(winkel) * radius;
        	py = Math.sin(winkel) * radius;
        	scheibe.curveTo( cx, cy, px, py);
            s--;
        }
        
        scheibe.endFill();
        
    	scheibe._x = 200; // Mittelpunkt der Kreise/des Flashfilmes
    	scheibe._y = 125;
        
    } // malen
    
    public function drehen() {
        for ( i in 0...scheibe.length ) {
            scheibe[i]._rotation -= geschwindigkeit[i];
        }
    } // drehen
    
} // class Scheiben