All pastes #1210390 Raw Edit

Mine

public text v1 · immutable
#1210390 ·published 2008-09-25 07:40 UTC
rendered paste body
package 
{
	import flash.display.*;
	import flash.events.Event;
	import flash.geom.Point;
	
	/**
	 * ...
	 * @author Buho29
	 */
	public class Main extends Sprite 
	{
		
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			Builder.stage = this;
			
			var radio:int = 100;
			
			/*var cage:Cage = new Cage(radio - 10, radio, "NSNSNSNS", .5);
			var stator:Stator = new Stator(40, radio-10,"ABCABCABCABC");*/
			
			var cage:Cage = new Cage(radio - 10, radio, "NS", .5);
			var stator:Stator = new Stator(40, radio-10,"ABC");
			
			var motor:Motor = new Motor(stator, cage, new Esc(1));
			Builder.buildMotor(motor);
			motor.x = motor.y = radio * 2;
			
			addChild(motor);
			motor.init();
			motor.On();
			
		}
		
		
	}
	
}

//{ import
import flash.events.EventDispatcher;
import flash.display.*;
import flash.events.Event;
import flash.geom.ColorTransform;
import flash.geom.Point;
//} endregion


class Builder {
	
	public static var N:uint =  2;
	public static var S:uint =  1;
	public static var OFF:uint =  0;
	
	private static var _color:Array = [
		0xC0C0C0,// OFF
		0x0000FF,// S
		0xFF0000// N
	]
	
	public static var backgroundCage:Number = 0xC0C0C0 ;
	public static var stage:Main;
	
	public static function getColor(id:uint):uint {
		if (id < _color.length) return _color[id];
		return 0;
	}
	
	public static function createMark(x:Number, y:Number,color:uint=0xFF80FF):Shape {
		var w:int = 5;
		var cruz:Shape = new Shape();
		cruz.x = x;
		cruz.y = y;
		cruz.graphics.lineStyle(.1, color);
		cruz.graphics.moveTo( -w,-w);
		cruz.graphics.lineTo(w, w);
		cruz.graphics.moveTo( w,-w);
		cruz.graphics.lineTo( -w, w);
		//cruz.rotation = Math.round(Math.random() * 45);
		return cruz;
	}
	
	//{ region build
	public static function buildMotor(motor:Motor):void 
	{
		buildStator(motor);
		buildCage(motor.cage);
	}
	
	public static function buildStator(motor:Motor):void {
		
		var stator:Stator = motor.stator;
		stator.motor = motor;
		
		var graphics:Graphics = stator.graphics;
		var radiusIn:Number = stator.radiusIn;
		var radiusOut:Number = stator.radiusOut;
		
		var list:Array = stator.config.split("");
		var center:Point = new Point(0, 0);
		var angleStep:Number = 360 / list.length;
		var then:TheenStator;
		var rot:int = 0;
		for (var i:int = 0; i < list.length; i++) 
		{
			then = new TheenStator(motor);
			switch (list[i]) 
			{
				case "A":
					then.CW = true;
					then.group = 0;
					drawThen(then.graphics, stator.radiusIn, stator.radiusOut);
					break;
				case "B": 
					then.CW = true;
					then.group = 1;
					drawThen(then.graphics, stator.radiusIn, stator.radiusOut);
					
					break;
				case "C": 
					then.CW = true;
					then.group = 2;
					drawThen(then.graphics, stator.radiusIn, stator.radiusOut);
					break;
				case "a": 
					;
					break;
				case "b": 
					;
					break;
				case "c": 
					;
					break;
				default:
					then.group = 8;
					drawThen(then.graphics, stator.radiusIn, stator.radiusOut);;
			}
			then.rotation = rot += angleStep;
			stator.addTheen(then);
		}
		
		//background
		
		graphics.beginFill(backgroundCage);
		graphics.drawCircle(0, 0, radiusIn);
		graphics.drawCircle(0, 0, radiusIn + 10);
		graphics.endFill();
		//var spacer:Number = angleStep - (angleStep * porcent);
		
		
		stator.rotation = 90;
		
	}
	
	public static function buildCage(cage:Cage):void {
		
		var graphics:Graphics = cage.graphics;
		var radiusIn:Number = cage.radiusIn;
		var radiusOut:Number = cage.radiusOut;
		
		graphics.clear();
		
		graphics.beginFill(backgroundCage);
		graphics.drawCircle(0, 0, radiusOut);
		graphics.drawCircle(0, 0, radiusOut + 5);
		graphics.endFill();
		
		var list:Array = cage.config.split("");
		var center:Point = new Point(0, 0);
		var angleStep:Number = 360 / list.length;
		var spacer:Number = angleStep - (angleStep * cage.porcent);
		
		for (var i:int = 0; i < list.length; i++) 
		{
			switch (list[i]) 
			{
				case " ": break;
				case "N": 
					drawMagnet(graphics, center, radiusIn , radiusOut , i*angleStep ,(i+1)*angleStep-spacer, getColor(N));
					cage.addMagnet(new Magnet(N));
					break;
				case "S": 
					drawMagnet(graphics, center, radiusIn , radiusOut , i*angleStep ,(i+1)*angleStep-spacer, getColor(S));
					cage.addMagnet(new Magnet(S));
					break;
				default:
					drawMagnet(graphics, center, radiusIn , radiusOut , i*angleStep ,(i+1)*angleStep-spacer, getColor(OFF));
					cage.addMagnet(new Magnet(OFF));
			}
		}
		
	}
	//} endregion

	//{ region draw
	public static function drawThen(graphics:Graphics, radiusIn:Number, radiusOut:Number, w:int= 10, h:int = 10,hHead:int=5):void {
		
		graphics.beginFill(0);
		graphics.moveTo( -w / 2, -radiusIn)
		
		graphics.lineTo(w / 2, -radiusIn);
		graphics.lineTo(w / 2, -radiusOut + h);
		graphics.lineTo(w / 2+hHead, -radiusOut + h);
		graphics.lineTo(w / 2+hHead, -radiusOut + h-h/2);
		graphics.curveTo(
			0, -radiusOut ,
			-w / 2-hHead, -radiusOut + h-h/2
		);
		graphics.lineTo( -w / 2 - hHead, -radiusOut + h);
		graphics.lineTo(-w / 2, -radiusOut + h);
		graphics.lineTo(-w / 2, -radiusIn);
		graphics.endFill();
	}
	
	public static function drawMagnet(graphics:Graphics,center:Point,radiusIn:Number,radiusOut:Number,startAngle:Number,endAngle:Number,color:uint):void {
		
		graphics.lineStyle(1, 0);
		graphics.beginFill(color);
		
		//
		var angleStart:Number = startAngle*Math.PI/180;
		var angleEnd:Number = endAngle*Math.PI/180;
		
		graphics.moveTo(center.x + Math.cos(angleStart) * radiusIn ,center.y + Math.sin(angleStart) * radiusIn);
		graphics.lineTo(center.x + Math.cos(angleStart) * radiusOut ,center.y + Math.sin(angleStart) * radiusOut);
		
		drawArc(graphics, center, radiusOut, startAngle, endAngle);
		
		graphics.lineTo(center.x + Math.cos(angleEnd) * radiusIn ,center.y + Math.sin(angleEnd) * radiusIn);
		drawArc(graphics, center, radiusIn, endAngle, startAngle);
		
	}
	
	public static function drawArc(graphics:Graphics,center:Point, radius:Number, startAngle:Number,endAngle:Number):Point {
		
		var segAngle:Number, angle:Number, angleMid:Number, segs:Number, bx:Number, by:Number, cx:Number, cy:Number, arc:Number;
		
		arc =  endAngle - startAngle;
		
		segs = Math.ceil(Math.abs(arc)/45);
		 
		segAngle = (arc/segs)*Math.PI/180;
		angle = startAngle*Math.PI/180;
		
		
		if (segs>0) {
			
			for (var i:int = 0; i<segs; i++) {
				
				angle += segAngle;
			
				angleMid = angle-(segAngle/2);
				
				bx = center.x+Math.cos(angle)*radius;
				by = center.y+Math.sin(angle)*radius;
				
				cx = center.x+Math.cos(angleMid)*(radius/Math.cos(segAngle/2));
				cy = center.y+Math.sin(angleMid)*(radius/Math.cos(segAngle/2));
				
				graphics.curveTo(cx, cy, bx, by);
			}
		}
		
		return new Point(bx, by);
	}
	
	//} endregion
	
}

// representation visuel du stator
// control la polarité des aiment (visuel)
// declanche animation de magnetisme
class Stator extends Sprite {
	
	// assembly type
	public static const STAR:String = "star";
	public static const DELTA:String = "delta";
	// view
	public static const GROUP:String = "group";
	public static const PHASE:String = "phase";
	
	private var _asemblyType:String = STAR;
	private var _viewType:String = GROUP;
	private var _listTheen:Array;
	
	private var _radiusIn:Number;
	private var _radiusOut:Number;
	private var _config:String;
	private var _spacer:int;
	private var _motor:Motor;
	
	function Stator(radiusIn:Number, radiusOut:Number, config:String, spacer:int = 5):void {
		_radiusIn = radiusIn;
		_radiusOut = radiusOut;
		_config = config; 
		_spacer = spacer;
		
		_listTheen = new Array();
	}
	
	
	private function view(type:String):void {
		for (var i:int = 0; i < _listTheen.length; i++) 
		{
			
		}
	}
	
	
	public function init():void 
	{
		var theen:TheenStator,color:uint;
		if (_viewType == GROUP) {
		for (var i:int = 0; i < _listTheen.length; i++) 
		{
			theen = _listTheen[i] as TheenStator;
			
			theen.draw(Builder.getColor(theen.group)); 
		}	
		}
		
	}
	
	private function changedphase(e:Event):void {
		//var phase:uint = _esc.phase;
		_motor.magnetism.run();
	}
	
	private function terminatephase(e:Event):void {
		_motor.esc.next();
	}
	
	
	public function addTheen(theen:TheenStator):void {
		addChild(theen);
		_listTheen.push(theen);
	}
	
	public function get radiusIn():Number { return _radiusIn; }
	public function get radiusOut():Number { return _radiusOut; }
	public function get config():String { return _config; }
	public function get spacer():int { return _spacer; }
	public function get numTheen():int { return _listTheen.length; }
	
	public function get asemblyType():String { return _asemblyType; }
	public function set asemblyType(value:String):void 
	{
		_asemblyType = value;
	}
	
	
	public function get motor():Motor { return _motor; }
	public function set motor(value:Motor):void 
	{
		_motor = value;
		_motor.magnetism.addEventListener(Magnetism.TERMINATEPHASE, terminatephase);
		_motor.esc.addEventListener(Esc.CHANGEDPHASE, changedphase);
	}
	
}


// representation visuel une dent du stator
// 
class TheenStator extends Shape
{
	public var CW:Boolean, group:int;
	private var _motor:Motor
	function TheenStator(motor:Motor):void 
	{
		_motor = motor;
		_motor.esc.addEventListener(Esc.CHANGEDPHASE, changedphase);
	}
	
	public function draw(color:uint):void 
	{
		var c:ColorTransform = new ColorTransform();
		c.color = color;
		transform.colorTransform = c;
	}
	
	private function changedphase(e:Event=null):void 
	{
		draw(Builder.getColor(_motor.magnetism.getPole(this)));
		//trace("changed color in theen");
	}
}

// representation visuel de la cage
// 
class  Cage extends Shape{
	private var _listMagnets:Array;
	
	private var _radiusIn:Number;
	private var _radiusOut:Number;
	private var _config:String;
	private var _porcent:Number;
	
	function Cage(radiusIn:Number,radiusOut:Number,config:String,porcent:Number):void{
		_radiusIn = radiusIn;
		_radiusOut = radiusOut;
		_config = config; 
		_porcent = porcent;
		
		_listMagnets = new Array();
	}
	
	public function addMagnet(magnet:Magnet):void 
	{
		_listMagnets.push(magnet);
	}
	
	public function get radiusIn():Number { return _radiusIn; }
	public function get radiusOut():Number { return _radiusOut; }
	public function get config():String { return _config; }
	public function get porcent():Number { return _porcent; }
	
	public function get listMagnets():Array { return _listMagnets; }
	
	public function get numMagnets():uint { return _listMagnets.length; }
}



// controler qui marque le ritme
class Esc extends EventDispatcher {
	
	public static var N:uint =  2;
	public static var S:uint =  1;
	public static var OFF:uint =  0;
	
	public static const CHANGEDPHASE:String = "changed phase";
	private var _phase:int = -1;
	private var _timing:Number;
	
	function Esc(timing:Number):void {
		_timing = timing;
	}
	
	public function next():void {
		_phase++;
		if (_phase > 2) _phase = 0;
		trace("event", "Esc." + CHANGEDPHASE , _phase);
		dispatchEvent(new Event(CHANGEDPHASE));
	}
	
	public function get phase():int { return _phase; }
	
	public function get timing():Number { return _timing; }
	public function set timing(value:Number):void 
	{
		_timing = value;
	}
	
}

// chargé de animé la cage
// a remplir ...
class Magnetism extends EventDispatcher {
	public static const TERMINATEPHASE:String = "terminate phase";

	public static var N:uint =  2;
	public static var S:uint =  1;
	public static var OFF:uint =  0;
	
	private var _motor:Motor;
	private var angleSteep:Number =0 ;
	
	function Magnetism(motor:Motor):void {
		_motor = motor
	}
	
	private var countAngle:Number = 0;
	private function tick(e:Event):void {
		
		if (_motor.esc.phase == 0) {
			stop(); return;
		}
		
		var steep:Number = _motor.esc.timing;
		_motor.cage.rotation += steep;
		countAngle += steep;
		var f:Number = Math.round((countAngle % angleSteep) * 1000000000) / 1000000000;
		
		trace("event", "Magnetism.tick",_motor.esc.phase,(countAngle % angleSteep),_motor.cage.rotation,angleSteep,f);
		if (f == 0) {
			stop();
			trace("event","Magnetism."+TERMINATEPHASE);
			//_motor.cage.rotation = Math.round(_motor.cage.rotation * 1000000000) / 1000000000;
			trace((countAngle),_motor.cage.rotation,angleSteep)
			countAngle = 0;
			dispatchEvent(new Event(TERMINATEPHASE));
		}
	}
	
	private var count:uint;
	public function getPole(then:TheenStator):uint 
	{
		
		count = _motor.esc.phase;
		//
		if (_motor.esc.phase == 0) {
			if (_motor.stator.asemblyType == Stator.STAR) {
				if (then.group == 0) return N;
				else return S;
			}
		}
		else if (_motor.esc.phase == 1) {
			if (_motor.stator.asemblyType == Stator.STAR) {
				if (then.group == 1) return N;
				else return S;
			}
		}
		else if (_motor.esc.phase == 2) {
			if (_motor.stator.asemblyType == Stator.STAR) {
				if (then.group == 2) return N;
				else return S;
			}
		}
		return count;
		//if (count > 2) count = 0;
	}
	
	public function stop():void 
	{
		_motor.stator.removeEventListener(Event.ENTER_FRAME, tick);
	}
	
	public function run():void 
	{
		_motor.stator.addEventListener(Event.ENTER_FRAME, tick);
	}
	
	public function init():void 
	{
		trace("magnetism.init",angleSteep);
		// center cage to theen
		angleSteep = 360 / _motor.cage.numMagnets;
		_motor.cage.rotation = -angleSteep * _motor.cage.porcent / 2;
		// 
		//_motor.cage.rotation -= -360 / _motor.stator.numTheen/ 2;
		_motor.cage.rotation += 90;
		angleSteep = 360 / _motor.stator.numTheen;
		//_motor.cage.rotation = angleSteep
	}
	
}

// representation visuel du moteur
// reagroupe les diferent partis dun moteur
class Motor extends Sprite
{
	private var _cage:Cage;
	private var _stator:Stator;
	private var _esc:Esc;
	private var _magnetism:Magnetism;
	
	public function Motor(stator:Stator,cage:Cage,esc:Esc):void {
		
		_stator = stator;
		_cage = cage;
		_esc = esc;
		_magnetism = new Magnetism(this);
		
		addChild(_stator);
		addChild(_cage);
		
	}
	
	public function init():void 
	{
		_magnetism.init();
		_stator.init();
		
	}
	
	public function On():void 
	{
		_esc.next();
	}
	
	public function off():void 
	{
		
	}
	
	public function get esc():Esc { return _esc; }
	public function get stator():Stator { return _stator; }
	public function get cage():Cage { return _cage; }
	public function get magnetism():Magnetism { return _magnetism; }
}

class Magnet
{
	private var _pole:uint;
	function Magnet(pole:uint):void 
	{
		_pole = pole;
	}
	
	public function get pole():uint { return _pole; }
}