Drehkreise
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