Matrixを勉強!!(2)

前回、紹介したサイトの最後のほうに載っていた3つのポイントから、
動的に平行四辺形を作成するというものに挑戦しました。


ほとんど、見ながらやりましたが…^^;


Matrixクラスのaとd、txとtyプロパティは何が入るか分かっているのですが、
bとcについては全くです…。
傾斜をつける際に、この値をいじるということはわかりましたが、
なぜ、左上と右上のy座標の差からSpriteの幅を割ると、
bが求めれるかについては、さっぱりです。


Matrixって、難しいですね。
Flash10には、Matrix3Dクラスというのが増えていたようですが、
Matrixで詰まっていては、だめですね。
もう少し、勉強してみます。


一応、ソースコードを載せておきます。

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
	
	[SWF(width=800, height=600, backgroundColor=0xAADDFF)]

	public class Main02 extends Sprite {
		
		private var point0:Sprite = new Sprite();
		private var point1:Sprite = new Sprite();
		private var point2:Sprite = new Sprite();
		private var rect:Sprite = new Sprite();
		
		public function Main02() {
			initPoint(point0, 300, 200);
			initPoint(point1, 500, 200);
			initPoint(point2, 300, 300);
			
			rect.graphics.beginFill(0x0000FF);
			rect.graphics.drawRect(0, 0, 200, 100);
			rect.graphics.endFill();
			rect.x = 300;
			rect.y = 200;
			addChildAt(rect, 0);
			
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function initPoint(point:Sprite, x:Number, y:Number):void {
			initPointDesign(point);
			point.x = x;
			point.y = y;
			addChild(point);
			
			point.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			point.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
		}
		
		private function initPointDesign(point:Sprite):void {
			point.graphics.lineStyle(3);
			point.graphics.beginFill(0xFF0000, 0.5);
			point.graphics.drawCircle(0, 0, 10);
			point.graphics.endFill();
		}
		
		private function xTransform():void {
			var mat:Matrix = new Matrix();
			mat.translate(point0.x, point0.y);
			rect.transform.matrix = mat;
			mat.a = (point1.x - rect.x) / rect.width;
			mat.b = (point1.y - rect.y) / rect.width;
			mat.c = (point2.x - rect.x) / rect.height;
			mat.d = (point2.y - rect.y) / rect.height;
			rect.transform.matrix = mat;
		}
			
		private function onMouseDown(event:MouseEvent):void {
			Sprite(event.currentTarget).startDrag();
		}
		
		private function onMouseUp(event:MouseEvent):void {
			Sprite(event.currentTarget).stopDrag();
		}
		
		private function onEnterFrame(event:Event):void {
			xTransform();
		}
		
	}
}