FORKED

forked from: てらこ23で発表したものの説明2 forked from: forked from: てらこ23で発表したものの説明2 [diff(20)]

  1. // forked from fumix's forked from: てらこ23で発表したものの説明2
  2. // forked from y_tti's てらこ23で発表したものの説明2
  3. /*
  4. マトリックスを使って台形な変形
  5. 4点のポイントを用意して、その位置を元に変形。
  6. 台形といっても三角形が2つ合体させてます。
  7. だらだら長いソースになってしまったけど、
  8. _draw
  9. _getTransformMatrix
  10. の部分が重要なんで、他は無視無視無視無視無視無視無視無視!!
  11. 格子状にしたら面白いんじゃないかとやってみた。
  12. 分割した矩形の1個目の描画部分が良く分からず・・・。
  13. わざわざ、bitmapDataを別に用意して、矩形にコピーしてそれを変形させて_canvasに再描画しているが
  14. 2個目の分割した矩形はそんなことをせず、直接_canvasに変形させて描画しても問題ない。
  15. 1個目は直接変形させて描画すると、順番がめちゃめちゃになる。
  16. テスト用画像を使ってみるとよく分かる。
  17. 出来そうで出来ないのが悔しい
  18. */
  19. package
  20. {
  21.     import flash.display.Bitmap;
  22.     import flash.display.BitmapData;
  23.     import flash.display.Loader;
  24.     import flash.display.Sprite;
  25.     import flash.events.Event;
  26.     import flash.events.MouseEvent;
  27.     import flash.geom.Matrix;
  28.     import flash.geom.Point;
  29.     import flash.net.URLRequest;
  30.     import flash.system.LoaderContext;
  31.     
  32.     import net.hires.debug.Stats;
  33.     
  34.     [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "0x000000")]
  35.     public class box extends Sprite
  36.     {
  37.         private var _container:Sprite;
  38.         private var _canvas:Sprite;
  39.         private var _bmd:BitmapData;
  40.         private var _stageW:Number = 465;
  41.         private var _stageH:Number = 465;
  42.         private var _w:Number;
  43.         private var _cP0:CirclePoint;
  44.         private var _cP1:CirclePoint;
  45.         private var _cP2:CirclePoint;
  46.         private var _cP3:CirclePoint;
  47.         private var _matrixArray:Array;
  48.                 private var _divide:int = 2;
  49.                 private var _canvasSize:int = 350;
  50.         //格子のどこに画像が描画されているかを見るためのテスト用画像
  51.         private const IMAGE_URL:String = "http://www.planet-ape.net/wonderfl/base.jpg";        
  52.         
  53.         //private const IMAGE_URL:String = "http://www.planet-ape.net/wonderfl/kuri.jpg";        
  54.         
  55.         public function box()
  56.         {
  57.             if (stage) init();
  58.             else addEventListener(Event.ADDED_TO_STAGE, init);
  59.         }
  60.         
  61.         private function init(e:Event = null):void 
  62.         {
  63.             removeEventListener(Event.ADDED_TO_STAGE, init);
  64.             //画像の読み込み
  65.             var req:URLRequest = new URLRequest(IMAGE_URL);
  66.             var loader:Loader = new Loader();
  67.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  68.             loader.load( req, new LoaderContext(true));
  69.             // take a capture after 10 sec
  70.             //Wonderfl.capture_delay( 120 );
  71.         }
  72.         
  73.         //画像読み込み後の処理
  74.         private function loadComplete(e:Event):void 
  75.         {
  76.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  77.         
  78.             //取得した画像を切り取って_bmdに入れる
  79.             _bmd = new BitmapData (_canvasSize, _canvasSize, true, 0xFFFFFF);
  80.             _bmd.draw (e.target.loader.content.bitmapData);
  81.             
  82.             //キャンバスを用意してコンテナに入れる(重要じゃないので無視無視)
  83.             _canvas = new Sprite();
  84.             _container = new Sprite();
  85.             _container.addChild(_canvas);
  86.             addChild(_container);
  87.             _container.x = (_stageW - _bmd.width)/2;
  88.             _container.y = (_stageH - _bmd.height)/2;
  89.             
  90.             //画像の大きさに合わせ、ポイントを5x5の格子に配置する(配列に入れる)
  91.             //CirclePointのコンストラクタの中で初期状態のポイント位置を保持してます。(initPoint)
  92.             //その初期ポイントと、マウスドラッグで移動したポイントを比較してるのが、_drawの中。
  93.             _w = _bmd.width / _divide;
  94.             _matrixArray = new Array ();
  95.             //x軸とy軸の2重ループ(配列に入れる
  96.             for (var j:int = 0; j <= _bmd.width; j += _w) {
  97.                 for (var i:int = 0; i <= _bmd.height; i += _w) {
  98.                     var cp:CirclePoint = new CirclePoint (i, j);
  99.                     trace ('cp'+i+':' + cp.initPoint);
  100.                     _matrixArray.push (cp);
  101.                     //ポイントのドラッグとかの設定
  102.                     //※ドラッグした時に_drawを呼び出してます。
  103.                     cp.addEventListener(MouseEvent.MOUSE_DOWN , _cPMouseDownHandler );
  104.                     _container.addChild (cp);
  105.                 }
  106.             }
  107.             _draw();
  108.             
  109.             //速度とかメモリとかチェック(重要じゃないので無視無視)
  110.             //addChild(new Stats());
  111.         }
  112.         
  113.         private function _draw():void {
  114.             /**
  115.              * ポイントの番号は↓な感じ。
  116.              *   0--------1
  117.              *   ----------
  118.              *   ----------
  119.              *   2--------3
  120.              */            
  121.             //マトリックスを適応
  122.             _canvas.graphics.clear();
  123.             //配列のループ
  124.             for (var k:String in _matrixArray) {
  125.                 //
  126.                 if (int(k) > (_divide*_divide+_divide-1)) break;
  127.                 if ((int (k) + 1) % (_divide+1) == 0continue;
  128.                 //初期状態のポイント取得
  129.                 _cP0 = _matrixArray[int (k)];
  130.                 _cP1 = _matrixArray[int (k) + 1];
  131.                 _cP2 = _matrixArray[int (k) + _divide+1];
  132.                 _cP3 = _matrixArray[int (k) + _divide+2];
  133.                 
  134.                 var aP0:Point = _cP0.initPoint;
  135.                 var aP1:Point = _cP1.initPoint;
  136.                 var aP2:Point = _cP2.initPoint;
  137.                 var aP3:Point = _cP3.initPoint;
  138.                 //初期状態のポイントよりマトリックス取得
  139.                 var initMatrix1:Matrix = _getTransformMatrix( aP0 , aP1 , aP2 );
  140.                 var initMatrix2:Matrix = _getTransformMatrix( aP3 , aP2 , aP1 );
  141.                 //変更状態のポイント取得
  142.                 var bP0:Point = new Point(_cP0.x , _cP0.y );
  143.                 var bP1:Point = new Point(_cP1.x , _cP1.y );
  144.                 var bP2:Point = new Point(_cP2.x , _cP2.y );
  145.                 var bP3:Point = new Point (_cP3.x , _cP3.y );
  146.                 //変更状態のポイントよりマトリックス取得
  147.                 var editMatrix1:Matrix = _getTransformMatrix( bP0 , bP1 , bP2 );
  148.                 var editMatrix2:Matrix = _getTransformMatrix( bP3 , bP2 , bP1 );
  149.                 //初期状態と変更状態のマトリックスを合体
  150.                 var newMatrix1:Matrix = initMatrix1.clone();
  151.                 newMatrix1.concat(editMatrix1);
  152.                 var newMatrix2:Matrix = initMatrix2.clone();
  153.                 newMatrix2.concat(editMatrix2);
  154.                 
  155.                 //(無理やり)分割した1個目の描写のロジック
  156.                 //2個目はわざわざ、別のbitmapDataを用意しなくても直接描画できる。
  157.                 //1個目は別のbitmapDataを用意ないと順番がめちゃくちゃになる。
  158.                 var matBmd:BitmapData = new BitmapData (_canvasSize/_divide, _canvasSize/_divide, true);
  159.                 var mat:Matrix = new Matrix ();
  160.                 mat.tx = - aP0.x;
  161.                 mat.ty = - aP0.y;
  162.                 matBmd.draw (_bmd, mat);
  163.                 //分割した1個目を描画
  164.                 _canvas.graphics.lineStyle(0 , 0x000000, 0);
  165.                 _canvas.graphics.beginBitmapFill(matBmd , newMatrix1 );
  166.                 _canvas.graphics.moveTo(bP0.x , bP0.y );
  167.                 _canvas.graphics.lineTo(bP1.x , bP1.y );
  168.                 _canvas.graphics.lineTo(bP2.x , bP2.y );
  169.                 _canvas.graphics.endFill ();
  170.                 
  171.                 //分割した2個目を描画
  172.                 _canvas.graphics.lineStyle(0 , 0x000000, 0);
  173.                 _canvas.graphics.beginBitmapFill(_bmd , newMatrix2 );
  174.                 _canvas.graphics.moveTo(bP3.x , bP3.y );
  175.                 _canvas.graphics.lineTo(bP1.x , bP1.y );
  176.                 _canvas.graphics.lineTo(bP2.x , bP2.y );
  177.                 _canvas.graphics.endFill();
  178.             }            
  179.         }
  180.         
  181.         
  182.         private function _getTransformMatrix($pt0:Point, $pt1:Point, $pt2:Point):Matrix
  183.         {
  184.             /*
  185.             http://www.adobe.com/jp/devnet/flash/articles/matrix_class.html
  186.             a: 水平方向の伸縮率 = 変換後の幅/もとの幅
  187.             b: 垂直方向の傾斜率 = 垂直方向の傾斜/もとの幅
  188.             c: 水平方向の傾斜率 = 水平方向の傾斜/もとの高さ
  189.             d: 垂直方向の伸縮率 = 変換後の高さ/もとの高さ
  190.             tx: 水平方向の移動ピクセル数
  191.             ty: 垂直方向の移動ピクセル数
  192.             */
  193.             var w:Number = _w;
  194.             var h:Number = _w;
  195.             var mat:Matrix = new Matrix();
  196.             mat.a = Number(($pt1.x - $pt0.x) / w);
  197.             mat.b = Number(($pt1.y - $pt0.y) / w);
  198.             mat.c = Number(($pt2.x - $pt0.x) / h);
  199.             mat.d = Number(($pt2.y - $pt0.y) / h);
  200.             mat.tx = $pt0.x;
  201.             mat.ty = $pt0.y;
  202.             return mat;
  203.         }
  204.         
  205.         //こっからマウスのドラッグとかの設定(無視無視)
  206.         private function _cPMouseDownHandler(e:MouseEvent):void {
  207.             CirclePoint(e.target).startDrag();
  208.             CirclePoint(e.target).addEventListener(MouseEvent.MOUSE_MOVE , _cPMouseMoveHandler );
  209.             stage.addEventListener(MouseEvent.MOUSE_UP , _cPMouseUpHandler );
  210.         }
  211.         
  212.         private function _cPMouseUpHandler(e:MouseEvent):void {
  213.             CirclePoint(e.target).stopDrag();
  214.             CirclePoint(e.target).removeEventListener(MouseEvent.MOUSE_MOVE , _cPMouseMoveHandler );
  215.             stage.removeEventListener(MouseEvent.MOUSE_UP , _cPMouseUpHandler );
  216.         }
  217.         
  218.         private function _cPMouseMoveHandler(e:MouseEvent):void {
  219.             _draw();
  220.         }
  221.         
  222.         
  223.     }
  224. }
  225. import flash.display.Bitmap;
  226. import flash.display.Shape;
  227. import flash.display.BitmapData;
  228. import flash.display.Sprite;
  229. import flash.geom.Point;
  230. /**
  231.  * 赤い点を書いてる。
  232.  * それと初期状態のポイントをinitPointに保持してる。
  233.  */
  234. class CirclePoint extends Sprite {
  235.     public var initPoint:Point;
  236.     public function CirclePoint($x:Number , $y:Number) {
  237.         this.x = $x;
  238.         this.y = $y;
  239.         this.initPoint = new Point( $x , $y );
  240.         this.graphics.beginFill(0xFF0000,1);
  241.         this.graphics.drawCircle(0,0,2);
  242.         this.graphics.endFill();
  243.         this.buttonMode = true;
  244.     }
  245. }
  246. /**
  247.  * このTestImageクラスは画像の代わりに無理矢理、
  248.  * BitmapDataを作成してるだけなので無視無視無視無視無視。
  249.  */
  250. class TestImage extends Bitmap {
  251.     private var _w:Number = 200;
  252.     private var _h:Number = 200;
  253.     public function TestImage():void {
  254.         var s:Shape = new Shape();
  255.         s.graphics.beginFill(0xCCCCCC , 1 );
  256.         s.graphics.drawRect(0,0,_w,_h);
  257.         s.graphics.beginFill(0xFCFCFC , 1 );
  258.         s.graphics.drawRoundRect(30 , 30 , 30 , 10 , 20 ,20);
  259.         s.graphics.drawRoundRect(140 , 30 , 30 , 10 , 20 ,20);
  260.         s.graphics.drawCircle(50,70,10);
  261.         s.graphics.drawCircle(150,70,10);
  262.         s.graphics.drawCircle(75,120,5);
  263.         s.graphics.drawCircle(125,120,5);
  264.         s.graphics.drawRoundRect(40 , 170 , 120 , 10 , 20 ,20);
  265.         s.graphics.endFill();
  266.         
  267.         var bmd:BitmapData = new BitmapData(_w,_h);
  268.         bmd.draw(s);
  269.         this.bitmapData = bmd;
  270.     }
  271. }
noswf

forked from: てらこ23で発表したものの説明2 forked from: forked from: てらこ23で発表したものの説明2 [diff(1)]

  1. // forked from fumix's forked from: てらこ23で発表したものの説明2
  2. // forked from y_tti's てらこ23で発表したものの説明2
  3. /*
  4. マトリックスを使って台形な変形
  5. 4点のポイントを用意して、その位置を元に変形。
  6. 台形といっても三角形が2つ合体させてます。
  7. だらだら長いソースになってしまったけど、
  8. _draw
  9. _getTransformMatrix
  10. の部分が重要なんで、他は無視無視無視無視無視無視無視無視!!
  11. 格子状にしたら面白いんじゃないかとやってみた。
  12. 分割した矩形の1個目の描画部分が良く分からず・・・。
  13. わざわざ、bitmapDataを別に用意して、矩形にコピーしてそれを変形させて_canvasに再描画しているが
  14. 2個目の分割した矩形はそんなことをせず、直接_canvasに変形させて描画しても問題ない。
  15. 1個目は直接変形させて描画すると、順番がめちゃめちゃになる。
  16. テスト用画像を使ってみるとよく分かる。
  17. 出来そうで出来ないのが悔しい
  18. */
  19. package
  20. {
  21.     import flash.display.Bitmap;
  22.     import flash.display.BitmapData;
  23.     import flash.display.Loader;
  24.     import flash.display.Sprite;
  25.     import flash.events.Event;
  26.     import flash.events.MouseEvent;
  27.     import flash.geom.Matrix;
  28.     import flash.geom.Point;
  29.     import flash.net.URLRequest;
  30.     import flash.system.LoaderContext;
  31.     
  32.     import net.hires.debug.Stats;
  33.     
  34.     [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "0x000000")]
  35.     public class box extends Sprite
  36.     {
  37.         private var _container:Sprite;
  38.         private var _canvas:Sprite;
  39.         private var _bmd:BitmapData;
  40.         private var _stageW:Number = 465;
  41.         private var _stageH:Number = 465;
  42.         private var _w:Number;
  43.         private var _cP0:CirclePoint;
  44.         private var _cP1:CirclePoint;
  45.         private var _cP2:CirclePoint;
  46.         private var _cP3:CirclePoint;
  47.         private var _matrixArray:Array;
  48.         //格子のどこに画像が描画されているかを見るためのテスト用画像
  49.         //private const IMAGE_URL:String = "http://www.planet-ape.net/wonderfl/base.jpg";        
  50.         
  51.         private const IMAGE_URL:String = "http://www.planet-ape.net/wonderfl/kuri.jpg";        
  52.         
  53.         public function box()
  54.         {
  55.             if (stage) init();
  56.             else addEventListener(Event.ADDED_TO_STAGE, init);
  57.         }
  58.         
  59.         private function init(e:Event = null):void 
  60.         {
  61.             removeEventListener(Event.ADDED_TO_STAGE, init);
  62.             //画像の読み込み
  63.             var req:URLRequest = new URLRequest(IMAGE_URL);
  64.             var loader:Loader = new Loader();
  65.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  66.             loader.load( req, new LoaderContext(true));
  67.             // take a capture after 10 sec
  68.             //Wonderfl.capture_delay( 120 );
  69.         }
  70.         
  71.         //画像読み込み後の処理
  72.         private function loadComplete(e:Event):void 
  73.         {
  74.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  75.         
  76.             //取得した画像を切り取って_bmdに入れる
  77.             _bmd = new BitmapData (350350true, 0xFFFFFF);
  78.             _bmd.draw (e.target.loader.content.bitmapData);
  79.             
  80.             //キャンバスを用意してコンテナに入れる(重要じゃないので無視無視)
  81.             _canvas = new Sprite();
  82.             _container = new Sprite();
  83.             _container.addChild(_canvas);
  84.             addChild(_container);
  85.             _container.x = (_stageW - _bmd.width)/2;
  86.             _container.y = (_stageH - _bmd.height)/2;
  87.             
  88.             //画像の大きさに合わせ、ポイントを5x5の格子に配置する(配列に入れる)
  89.             //CirclePointのコンストラクタの中で初期状態のポイント位置を保持してます。(initPoint)
  90.             //その初期ポイントと、マウスドラッグで移動したポイントを比較してるのが、_drawの中。
  91.             _w = _bmd.width / 5;
  92.             _matrixArray = new Array ();
  93.             //x軸とy軸の2重ループ(配列に入れる
  94.             for (var j:int = 0; j <= _bmd.width; j += _w) {
  95.                 for (var i:int = 0; i <= _bmd.height; i += _w) {
  96.                     var cp:CirclePoint = new CirclePoint (i, j);
  97.                     trace ('cp'+i+':' + cp.initPoint);
  98.                     _matrixArray.push (cp);
  99.                     //ポイントのドラッグとかの設定
  100.                     //※ドラッグした時に_drawを呼び出してます。
  101.                     cp.addEventListener(MouseEvent.MOUSE_DOWN , _cPMouseDownHandler );
  102.                     _container.addChild (cp);
  103.                 }
  104.             }
  105.             _draw();
  106.             
  107.             //速度とかメモリとかチェック(重要じゃないので無視無視)
  108.             addChild(new Stats());
  109.         }
  110.         
  111.         private function _draw():void {
  112.             /**
  113.              * ポイントの番号は↓な感じ。
  114.              *   0--------1
  115.              *   ----------
  116.              *   ----------
  117.              *   2--------3
  118.              */            
  119.             //マトリックスを適応
  120.             _canvas.graphics.clear();
  121.             //配列のループ
  122.             for (var k:String in _matrixArray) {
  123.                 //
  124.                 if (int(k) > 29break;
  125.                 if ((int (k) + 1) % 6 == 0continue;
  126.                 //初期状態のポイント取得
  127.                 _cP0 = _matrixArray[int (k)];
  128.                 _cP1 = _matrixArray[int (k) + 1];
  129.                 _cP2 = _matrixArray[int (k) + 6];
  130.                 _cP3 = _matrixArray[int (k) + 7];
  131.                 
  132.                 var aP0:Point = _cP0.initPoint;
  133.                 var aP1:Point = _cP1.initPoint;
  134.                 var aP2:Point = _cP2.initPoint;
  135.                 var aP3:Point = _cP3.initPoint;
  136.                 //初期状態のポイントよりマトリックス取得
  137.                 var initMatrix1:Matrix = _getTransformMatrix( aP0 , aP1 , aP2 );
  138.                 var initMatrix2:Matrix = _getTransformMatrix( aP3 , aP2 , aP1 );
  139.                 //変更状態のポイント取得
  140.                 var bP0:Point = new Point(_cP0.x , _cP0.y );
  141.                 var bP1:Point = new Point(_cP1.x , _cP1.y );
  142.                 var bP2:Point = new Point(_cP2.x , _cP2.y );
  143.                 var bP3:Point = new Point (_cP3.x , _cP3.y );
  144.                 //変更状態のポイントよりマトリックス取得
  145.                 var editMatrix1:Matrix = _getTransformMatrix( bP0 , bP1 , bP2 );
  146.                 var editMatrix2:Matrix = _getTransformMatrix( bP3 , bP2 , bP1 );
  147.                 //初期状態と変更状態のマトリックスを合体
  148.                 var newMatrix1:Matrix = initMatrix1.clone();
  149.                 newMatrix1.concat(editMatrix1);
  150.                 var newMatrix2:Matrix = initMatrix2.clone();
  151.                 newMatrix2.concat(editMatrix2);
  152.                 
  153.                 //(無理やり)分割した1個目の描写のロジック
  154.                 //2個目はわざわざ、別のbitmapDataを用意しなくても直接描画できる。
  155.                 //1個目は別のbitmapDataを用意ないと順番がめちゃくちゃになる。
  156.                 var matBmd:BitmapData = new BitmapData (7070true);
  157.                 var mat:Matrix = new Matrix ();
  158.                 mat.tx = - aP0.x;
  159.                 mat.ty = - aP0.y;
  160.                 matBmd.draw (_bmd, mat);
  161.                 //分割した1個目を描画
  162.                 _canvas.graphics.lineStyle(1 , 0x00FF00);
  163.                 _canvas.graphics.beginBitmapFill(matBmd , newMatrix1 );
  164.                 _canvas.graphics.moveTo(bP0.x , bP0.y );
  165.                 _canvas.graphics.lineTo(bP1.x , bP1.y );
  166.                 _canvas.graphics.lineTo(bP2.x , bP2.y );
  167.                 _canvas.graphics.endFill ();
  168.                 
  169.                 //分割した2個目を描画
  170.                 _canvas.graphics.lineStyle(1 , 0x00FF00);
  171.                 _canvas.graphics.beginBitmapFill(_bmd , newMatrix2 );
  172.                 _canvas.graphics.moveTo(bP3.x , bP3.y );
  173.                 _canvas.graphics.lineTo(bP1.x , bP1.y );
  174.                 _canvas.graphics.lineTo(bP2.x , bP2.y );
  175.                 _canvas.graphics.endFill();
  176.             }            
  177.         }
  178.         
  179.         
  180.         private function _getTransformMatrix($pt0:Point, $pt1:Point, $pt2:Point):Matrix
  181.         {
  182.             /*
  183.             http://www.adobe.com/jp/devnet/flash/articles/matrix_class.html
  184.             a: 水平方向の伸縮率 = 変換後の幅/もとの幅
  185.             b: 垂直方向の傾斜率 = 垂直方向の傾斜/もとの幅
  186.             c: 水平方向の傾斜率 = 水平方向の傾斜/もとの高さ
  187.             d: 垂直方向の伸縮率 = 変換後の高さ/もとの高さ
  188.             tx: 水平方向の移動ピクセル数
  189.             ty: 垂直方向の移動ピクセル数
  190.             */
  191.             var w:Number = _w;
  192.             var h:Number = _w;
  193.             var mat:Matrix = new Matrix();
  194.             mat.a = ($pt1.x - $pt0.x) / w;
  195.             mat.b = ($pt1.y - $pt0.y) / w;
  196.             mat.c = ($pt2.x - $pt0.x) / h;
  197.             mat.d = ($pt2.y - $pt0.y) / h;
  198.             mat.tx = $pt0.x;
  199.             mat.ty = $pt0.y;
  200.             return mat;
  201.         }
  202.         
  203.         //こっからマウスのドラッグとかの設定(無視無視)
  204.         private function _cPMouseDownHandler(e:MouseEvent):void {
  205.             CirclePoint(e.target).startDrag();
  206.             CirclePoint(e.target).addEventListener(MouseEvent.MOUSE_MOVE , _cPMouseMoveHandler );
  207.             stage.addEventListener(MouseEvent.MOUSE_UP , _cPMouseUpHandler );
  208.         }
  209.         
  210.         private function _cPMouseUpHandler(e:MouseEvent):void {
  211.             CirclePoint(e.target).stopDrag();
  212.             CirclePoint(e.target).removeEventListener(MouseEvent.MOUSE_MOVE , _cPMouseMoveHandler );
  213.             stage.removeEventListener(MouseEvent.MOUSE_UP , _cPMouseUpHandler );
  214.         }
  215.         
  216.         private function _cPMouseMoveHandler(e:MouseEvent):void {
  217.             _draw();
  218.         }
  219.         
  220.         
  221.     }
  222. }
  223. import flash.display.Bitmap;
  224. import flash.display.Shape;
  225. import flash.display.BitmapData;
  226. import flash.display.Sprite;
  227. import flash.geom.Point;
  228. /**
  229.  * 赤い点を書いてる。
  230.  * それと初期状態のポイントをinitPointに保持してる。
  231.  */
  232. class CirclePoint extends Sprite {
  233.     public var initPoint:Point;
  234.     public function CirclePoint($x:Number , $y:Number) {
  235.         this.x = $x;
  236.         this.y = $y;
  237.         this.initPoint = new Point( $x , $y );
  238.         this.graphics.beginFill(0xFF0000,1);
  239.         this.graphics.drawCircle(0,0,5);
  240.         this.graphics.endFill();
  241.         this.buttonMode = true;
  242.     }
  243. }
  244. /**
  245.  * このTestImageクラスは画像の代わりに無理矢理、
  246.  * BitmapDataを作成してるだけなので無視無視無視無視無視。
  247.  */
  248. class TestImage extends Bitmap {
  249.     private var _w:Number = 200;
  250.     private var _h:Number = 200;
  251.     public function TestImage():void {
  252.         var s:Shape = new Shape();
  253.         s.graphics.beginFill(0xCCCCCC , 1 );
  254.         s.graphics.drawRect(0,0,_w,_h);
  255.         s.graphics.beginFill(0xFCFCFC , 1 );
  256.         s.graphics.drawRoundRect(30 , 30 , 30 , 10 , 20 ,20);
  257.         s.graphics.drawRoundRect(140 , 30 , 30 , 10 , 20 ,20);
  258.         s.graphics.drawCircle(50,70,10);
  259.         s.graphics.drawCircle(150,70,10);
  260.         s.graphics.drawCircle(75,120,5);
  261.         s.graphics.drawCircle(125,120,5);
  262.         s.graphics.drawRoundRect(40 , 170 , 120 , 10 , 20 ,20);
  263.         s.graphics.endFill();
  264.         
  265.         var bmd:BitmapData = new BitmapData(_w,_h);
  266.         bmd.draw(s);
  267.         this.bitmapData = bmd;
  268.     }
  269. }
noswf

forked from: てらこ23で発表したものの説明2 forked from: forked from: てらこ23で発表したものの説明2 [diff(1)]

  1. // forked from fumix's forked from: てらこ23で発表したものの説明2
  2. // forked from y_tti's てらこ23で発表したものの説明2
  3. /*
  4. マトリックスを使って台形な変形
  5. 4点のポイントを用意して、その位置を元に変形。
  6. 台形といっても三角形が2つ合体させてます。
  7. だらだら長いソースになってしまったけど、
  8. _draw
  9. _getTransformMatrix
  10. の部分が重要なんで、他は無視無視無視無視無視無視無視無視!!
  11. 格子状にしたら面白いんじゃないかとやってみた。
  12. 分割した矩形の1個目の描画部分が良く分からず・・・。
  13. わざわざ、bitmapDataを別に用意して、矩形にコピーしてそれを変形させて_canvasに再描画しているが
  14. 2個目の分割した矩形はそんなことをせず、直接_canvasに変形させて描画しても問題ない。
  15. 1個目は直接変形させて描画すると、順番がめちゃめちゃになる。
  16. テスト用画像を使ってみるとよく分かる。
  17. 出来そうで出来ないのが悔しい
  18. */
  19. package
  20. {
  21.     import flash.display.Bitmap;
  22.     import flash.display.BitmapData;
  23.     import flash.display.Loader;
  24.     import flash.display.Sprite;
  25.     import flash.events.Event;
  26.     import flash.events.MouseEvent;
  27.     import flash.geom.Matrix;
  28.     import flash.geom.Point;
  29.     import flash.net.URLRequest;
  30.     import flash.system.LoaderContext;
  31.     
  32.     import net.hires.debug.Stats;
  33.     
  34.     [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "0x000000")]
  35.     public class box extends Sprite
  36.     {
  37.         private var _container:Sprite;
  38.         private var _canvas:Sprite;
  39.         private var _bmd:BitmapData;
  40.         private var _stageW:Number = 465;
  41.         private var _stageH:Number = 465;
  42.         private var _w:Number;
  43.         private var _cP0:CirclePoint;
  44.         private var _cP1:CirclePoint;
  45.         private var _cP2:CirclePoint;
  46.         private var _cP3:CirclePoint;
  47.         private var _matrixArray:Array;
  48.         //格子のどこに画像が描画されているかを見るためのテスト用画像
  49.         //private const IMAGE_URL:String = "http://www.planet-ape.net/wonderfl/base.jpg";        
  50.         
  51.         private const IMAGE_URL:String = "http://www.planet-ape.net/wonderfl/kuri.jpg";        
  52.         
  53.         public function box()
  54.         {
  55.             if (stage) init();
  56.             else addEventListener(Event.ADDED_TO_STAGE, init);
  57.         }
  58.         
  59.         private function init(e:Event = null):void 
  60.         {
  61.             removeEventListener(Event.ADDED_TO_STAGE, init);
  62.             //画像の読み込み
  63.             var req:URLRequest = new URLRequest(IMAGE_URL);
  64.             var loader:Loader = new Loader();
  65.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  66.             loader.load( req, new LoaderContext(true));
  67.             // take a capture after 10 sec
  68.             //Wonderfl.capture_delay( 120 );
  69.         }
  70.         
  71.         //画像読み込み後の処理
  72.         private function loadComplete(e:Event):void 
  73.         {
  74.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  75.         
  76.             //取得した画像を切り取って_bmdに入れる
  77.             _bmd = new BitmapData (350350true, 0xFFFFFF);
  78.             _bmd.draw (e.target.loader.content.bitmapData);
  79.             
  80.             //キャンバスを用意してコンテナに入れる(重要じゃないので無視無視)
  81.             _canvas = new Sprite();
  82.             _container = new Sprite();
  83.             _container.addChild(_canvas);
  84.             addChild(_container);
  85.             _container.x = (_stageW - _bmd.width)/2;
  86.             _container.y = (_stageH - _bmd.height)/2;
  87.             
  88.             //画像の大きさに合わせ、ポイントを5x5の格子に配置する(配列に入れる)
  89.             //CirclePointのコンストラクタの中で初期状態のポイント位置を保持してます。(initPoint)
  90.             //その初期ポイントと、マウスドラッグで移動したポイントを比較してるのが、_drawの中。
  91.             _w = _bmd.width / 5;
  92.             _matrixArray = new Array ();
  93.             //x軸とy軸の2重ループ(配列に入れる
  94.             for (var j:int = 0; j <= _bmd.width; j += _w) {
  95.                 for (var i:int = 0; i <= _bmd.height; i += _w) {
  96.                     var cp:CirclePoint = new CirclePoint (i, j);
  97.                     trace ('cp'+i+':' + cp.initPoint);
  98.                     _matrixArray.push (cp);
  99.                     //ポイントのドラッグとかの設定
  100.                     //※ドラッグした時に_drawを呼び出してます。
  101.                     cp.addEventListener(MouseEvent.MOUSE_DOWN , _cPMouseDownHandler );
  102.                     _container.addChild (cp);
  103.                 }
  104.             }
  105.             _draw();
  106.             
  107.             //速度とかメモリとかチェック(重要じゃないので無視無視)
  108.             addChild(new Stats());
  109.         }
  110.         
  111.         private function _draw():void {
  112.             /**
  113.              * ポイントの番号は↓な感じ。
  114.              *   0--------1
  115.              *   ----------
  116.              *   ----------
  117.              *   2--------3
  118.              */            
  119.             //マトリックスを適応
  120.             _canvas.graphics.clear();
  121.             //配列のループ
  122.             for (var k:String in _matrixArray) {
  123.                 //
  124.                 if (int(k) > 29break;
  125.                 if ((int (k) + 1) % 6 == 0continue;
  126.                 //初期状態のポイント取得
  127.                 _cP0 = _matrixArray[int (k)];
  128.                 _cP1 = _matrixArray[int (k) + 1];
  129.                 _cP2 = _matrixArray[int (k) + 6];
  130.                 _cP3 = _matrixArray[int (k) + 7];
  131.                 
  132.                 var aP0:Point = _cP0.initPoint;
  133.                 var aP1:Point = _cP1.initPoint;
  134.                 var aP2:Point = _cP2.initPoint;
  135.                 var aP3:Point = _cP3.initPoint;
  136.                 //初期状態のポイントよりマトリックス取得
  137.                 var initMatrix1:Matrix = _getTransformMatrix( aP0 , aP1 , aP2 );
  138.                 var initMatrix2:Matrix = _getTransformMatrix( aP3 , aP2 , aP1 );
  139.                 //変更状態のポイント取得
  140.                 var bP0:Point = new Point(_cP0.x , _cP0.y );
  141.                 var bP1:Point = new Point(_cP1.x , _cP1.y );
  142.                 var bP2:Point = new Point(_cP2.x , _cP2.y );
  143.                 var bP3:Point = new Point (_cP3.x , _cP3.y );
  144.                 //変更状態のポイントよりマトリックス取得
  145.                 var editMatrix1:Matrix = _getTransformMatrix( bP0 , bP1 , bP2 );
  146.                 var editMatrix2:Matrix = _getTransformMatrix( bP3 , bP2 , bP1 );
  147.                 //初期状態と変更状態のマトリックスを合体
  148.                 var newMatrix1:Matrix = initMatrix1.clone();
  149.                 newMatrix1.concat(editMatrix1);
  150.                 var newMatrix2:Matrix = initMatrix2.clone();
  151.                 newMatrix2.concat(editMatrix2);
  152.                 
  153.                 //(無理やり)分割した1個目の描写のロジック
  154.                 //2個目はわざわざ、別のbitmapDataを用意しなくても直接描画できる。
  155.                 //1個目は別のbitmapDataを用意ないと順番がめちゃくちゃになる。
  156.                 var matBmd:BitmapData = new BitmapData (7070true);
  157.                 var mat:Matrix = new Matrix ();
  158.                 mat.tx = - aP0.x;
  159.                 mat.ty = - aP0.y;
  160.                 matBmd.draw (_bmd, mat);
  161.                 //分割した1個目を描画
  162.                 _canvas.graphics.lineStyle(1 , 0x00FF00);
  163.                 _canvas.graphics.beginBitmapFill(matBmd , newMatrix1 );
  164.                 _canvas.graphics.moveTo(bP0.x , bP0.y );
  165.                 _canvas.graphics.lineTo(bP1.x , bP1.y );
  166.                 _canvas.graphics.lineTo(bP2.x , bP2.y );
  167.                 _canvas.graphics.endFill ();
  168.                 
  169.                 //分割した2個目を描画
  170.                 _canvas.graphics.lineStyle(1 , 0x00FF00);
  171.                 _canvas.graphics.beginBitmapFill(_bmd , newMatrix2 );
  172.                 _canvas.graphics.moveTo(bP3.x , bP3.y );
  173.                 _canvas.graphics.lineTo(bP1.x , bP1.y );
  174.                 _canvas.graphics.lineTo(bP2.x , bP2.y );
  175.                 _canvas.graphics.endFill();
  176.             }            
  177.         }
  178.         
  179.         
  180.         private function _getTransformMatrix($pt0:Point, $pt1:Point, $pt2:Point):Matrix
  181.         {
  182.             /*
  183.             http://www.adobe.com/jp/devnet/flash/articles/matrix_class.html
  184.             a: 水平方向の伸縮率 = 変換後の幅/もとの幅
  185.             b: 垂直方向の傾斜率 = 垂直方向の傾斜/もとの幅
  186.             c: 水平方向の傾斜率 = 水平方向の傾斜/もとの高さ
  187.             d: 垂直方向の伸縮率 = 変換後の高さ/もとの高さ
  188.             tx: 水平方向の移動ピクセル数
  189.             ty: 垂直方向の移動ピクセル数
  190.             */
  191.             var w:Number = _w;
  192.             var h:Number = _w;
  193.             var mat:Matrix = new Matrix();
  194.             mat.a = ($pt1.x - $pt0.x) / w;
  195.             mat.b = ($pt1.y - $pt0.y) / w;
  196.             mat.c = ($pt2.x - $pt0.x) / h;
  197.             mat.d = ($pt2.y - $pt0.y) / h;
  198.             mat.tx = $pt0.x;
  199.             mat.ty = $pt0.y;
  200.             return mat;
  201.         }
  202.         
  203.         //こっからマウスのドラッグとかの設定(無視無視)
  204.         private function _cPMouseDownHandler(e:MouseEvent):void {
  205.             CirclePoint(e.target).startDrag();
  206.             CirclePoint(e.target).addEventListener(MouseEvent.MOUSE_MOVE , _cPMouseMoveHandler );
  207.             stage.addEventListener(MouseEvent.MOUSE_UP , _cPMouseUpHandler );
  208.         }
  209.         
  210.         private function _cPMouseUpHandler(e:MouseEvent):void {
  211.             CirclePoint(e.target).stopDrag();
  212.             CirclePoint(e.target).removeEventListener(MouseEvent.MOUSE_MOVE , _cPMouseMoveHandler );
  213.             stage.removeEventListener(MouseEvent.MOUSE_UP , _cPMouseUpHandler );
  214.         }
  215.         
  216.         private function _cPMouseMoveHandler(e:MouseEvent):void {
  217.             _draw();
  218.         }
  219.         
  220.         
  221.     }
  222. }
  223. import flash.display.Bitmap;
  224. import flash.display.Shape;
  225. import flash.display.BitmapData;
  226. import flash.display.Sprite;
  227. import flash.geom.Point;
  228. /**
  229.  * 赤い点を書いてる。
  230.  * それと初期状態のポイントをinitPointに保持してる。
  231.  */
  232. class CirclePoint extends Sprite {
  233.     public var initPoint:Point;
  234.     public function CirclePoint($x:Number , $y:Number) {
  235.         this.x = $x;
  236.         this.y = $y;
  237.         this.initPoint = new Point( $x , $y );
  238.         this.graphics.beginFill(0xFF0000,1);
  239.         this.graphics.drawCircle(0,0,5);
  240.         this.graphics.endFill();
  241.         this.buttonMode = true;
  242.     }
  243. }
  244. /**
  245.  * このTestImageクラスは画像の代わりに無理矢理、
  246.  * BitmapDataを作成してるだけなので無視無視無視無視無視。
  247.  */
  248. class TestImage extends Bitmap {
  249.     private var _w:Number = 200;
  250.     private var _h:Number = 200;
  251.     public function TestImage():void {
  252.         var s:Shape = new Shape();
  253.         s.graphics.beginFill(0xCCCCCC , 1 );
  254.         s.graphics.drawRect(0,0,_w,_h);
  255.         s.graphics.beginFill(0xFCFCFC , 1 );
  256.         s.graphics.drawRoundRect(30 , 30 , 30 , 10 , 20 ,20);
  257.         s.graphics.drawRoundRect(140 , 30 , 30 , 10 , 20 ,20);
  258.         s.graphics.drawCircle(50,70,10);
  259.         s.graphics.drawCircle(150,70,10);
  260.         s.graphics.drawCircle(75,120,5);
  261.         s.graphics.drawCircle(125,120,5);
  262.         s.graphics.drawRoundRect(40 , 170 , 120 , 10 , 20 ,20);
  263.         s.graphics.endFill();
  264.         
  265.         var bmd:BitmapData = new BitmapData(_w,_h);
  266.         bmd.draw(s);
  267.         this.bitmapData = bmd;
  268.     }
  269. }
noswf

forked from: てらこ23で発表したものの説明2 forked from: forked from: てらこ23で発表したものの説明2 [diff(10)]

  1. // forked from fumix's forked from: てらこ23で発表したものの説明2
  2. // forked from y_tti's てらこ23で発表したものの説明2
  3. /*
  4. マトリックスを使って台形な変形
  5. 4点のポイントを用意して、その位置を元に変形。
  6. 台形といっても三角形が2つ合体させてます。
  7. だらだら長いソースになってしまったけど、
  8. _draw
  9. _getTransformMatrix
  10. の部分が重要なんで、他は無視無視無視無視無視無視無視無視!!
  11. 格子状にしたら面白いんじゃないかとやってみた。
  12. 分割した矩形の1個目の描画部分が良く分からず・・・。
  13. わざわざ、bitmapDataを別に用意して、矩形にコピーしてそれを変形させて_canvasに再描画しているが
  14. 2個目の分割した矩形はそんなことをせず、直接_canvasに変形させて描画しても問題ない。
  15. 1個目は直接変形させて描画すると、順番がめちゃめちゃになる。
  16. テスト用画像を使ってみるとよく分かる。
  17. 出来そうで出来ないのが悔しい
  18. 分割した1個目の矩形を直接_canvas上に描画したらどうなるかのテスト
  19. */
  20. package
  21. {
  22.     import flash.display.Bitmap;
  23.     import flash.display.BitmapData;
  24.     import flash.display.Loader;
  25.     import flash.display.Sprite;
  26.     import flash.events.Event;
  27.     import flash.events.MouseEvent;
  28.     import flash.geom.Matrix;
  29.     import flash.geom.Point;
  30.     import flash.net.URLRequest;
  31.     import flash.system.LoaderContext;
  32.     
  33.     import net.hires.debug.Stats;
  34.     
  35.     [SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "0x000000")]
  36.     public class box extends Sprite
  37.     {
  38.         private var _container:Sprite;
  39.         private var _canvas:Sprite;
  40.         private var _bmd:BitmapData;
  41.         private var _stageW:Number = 465;
  42.         private var _stageH:Number = 465;
  43.         private var _w:Number;
  44.         private var _cP0:CirclePoint;
  45.         private var _cP1:CirclePoint;
  46.         private var _cP2:CirclePoint;
  47.         private var _cP3:CirclePoint;
  48.         private var _matrixArray:Array;
  49.         //格子のどこに画像が描画されているかを見るためのテスト用画像
  50.         private const IMAGE_URL:String = "http://www.planet-ape.net/wonderfl/base.jpg";        
  51.         
  52.         //private const IMAGE_URL:String = "http://www.planet-ape.net/wonderfl/kuri.jpg";        
  53.         
  54.         public function box()
  55.         {
  56.             if (stage) init();
  57.             else addEventListener(Event.ADDED_TO_STAGE, init);
  58.         }
  59.         
  60.         private function init(e:Event = null):void 
  61.         {
  62.             removeEventListener(Event.ADDED_TO_STAGE, init);
  63.             //画像の読み込み
  64.             var req:URLRequest = new URLRequest(IMAGE_URL);
  65.             var loader:Loader = new Loader();
  66.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);    
  67.             loader.load( req, new LoaderContext(true));
  68.             // take a capture after 10 sec
  69.             //Wonderfl.capture_delay( 120 );
  70.         }
  71.         
  72.         //画像読み込み後の処理
  73.         private function loadComplete(e:Event):void 
  74.         {
  75.             e.target.removeEventListener(Event.COMPLETE, loadComplete);
  76.         
  77.             //取得した画像を切り取って_bmdに入れる
  78.             _bmd = new BitmapData (350350true, 0xFFFFFF);
  79.             _bmd.draw (e.target.loader.content.bitmapData);
  80.             
  81.             //キャンバスを用意してコンテナに入れる(重要じゃないので無視無視)
  82.             _canvas = new Sprite();
  83.             _container = new Sprite();
  84.             _container.addChild(_canvas);
  85.             addChild(_container);
  86.             _container.x = (_stageW - _bmd.width)/2;
  87.             _container.y = (_stageH - _bmd.height)/2;
  88.             
  89.             //画像の大きさに合わせ、ポイントを5x5の格子に配置する(配列に入れる)
  90.             //CirclePointのコンストラクタの中で初期状態のポイント位置を保持してます。(initPoint)
  91.             //その初期ポイントと、マウスドラッグで移動したポイントを比較してるのが、_drawの中。
  92.             _w = _bmd.width / 5;
  93.             _matrixArray = new Array ();
  94.             //x軸とy軸の2重ループ(配列に入れる
  95.             for (var j:int = 0; j <= _bmd.width; j += _w) {
  96.                 for (var i:int = 0; i <= _bmd.height; i += _w) {
  97.                     var cp:CirclePoint = new CirclePoint (i, j);
  98.                     trace ('cp'+i+':' + cp.initPoint);
  99.                     _matrixArray.push (cp);
  100.                     //ポイントのドラッグとかの設定
  101.                     //※ドラッグした時に_drawを呼び出してます。
  102.                     cp.addEventListener(MouseEvent.MOUSE_DOWN , _cPMouseDownHandler );
  103.                     _container.addChild (cp);
  104.                 }
  105.             }
  106.             _draw();
  107.             
  108.             //速度とかメモリとかチェック(重要じゃないので無視無視)
  109.             addChild(new Stats());
  110.         }
  111.         
  112.         private function _draw():void {
  113.             /**
  114.              * ポイントの番号は↓な感じ。
  115.              *   0--------1
  116.              *   ----------
  117.              *   ----------
  118.              *   2--------3
  119.              */            
  120.             //マトリックスを適応
  121.             _canvas.graphics.clear();
  122.             //配列のループ
  123.             for (var k:String in _matrixArray) {
  124.                 //
  125.                 if (int(k) > 29break;
  126.                 if ((int (k) + 1) % 6 == 0continue;
  127.                 //初期状態のポイント取得
  128.                 _cP0 = _matrixArray[int (k)];
  129.                 _cP1 = _matrixArray[int (k) + 1];
  130.                 _cP2 = _matrixArray[int (k) + 6];
  131.                 _cP3 = _matrixArray[int (k) + 7];
  132.                 
  133.                 var aP0:Point = _cP0.initPoint;
  134.                 var aP1:Point = _cP1.initPoint;
  135.                 var aP2:Point = _cP2.initPoint;
  136.                 var aP3:Point = _cP3.initPoint;
  137.                 //初期状態のポイントよりマトリックス取得
  138.                 var initMatrix1:Matrix = _getTransformMatrix( aP0 , aP1 , aP2 );
  139.                 var initMatrix2:Matrix = _getTransformMatrix( aP3 , aP2 , aP1 );
  140.                 //変更状態のポイント取得
  141.                 var bP0:Point = new Point(_cP0.x , _cP0.y );
  142.                 var bP1:Point = new Point(_cP1.x , _cP1.y );
  143.                 var bP2:Point = new Point(_cP2.x , _cP2.y );
  144.                 var bP3:Point = new Point (_cP3.x , _cP3.y );
  145.                 //変更状態のポイントよりマトリックス取得
  146.                 var editMatrix1:Matrix = _getTransformMatrix( bP0 , bP1 , bP2 );
  147.                 var editMatrix2:Matrix = _getTransformMatrix( bP3 , bP2 , bP1 );
  148.                 //初期状態と変更状態のマトリックスを合体
  149.                 var newMatrix1:Matrix = initMatrix1.clone();
  150.                 newMatrix1.concat(editMatrix1);
  151.                 var newMatrix2:Matrix = initMatrix2.clone();
  152.                 newMatrix2.concat(editMatrix2);
  153.                 
  154.                 //(無理やり)分割した1個目の描写のロジック
  155.                 //2個目はわざわざ、別のbitmapDataを用意しなくても直接描画できる。
  156.                 //1個目は別のbitmapDataを用意ないと順番がめちゃくちゃになる。
  157.                                 /*
  158.                 var matBmd:BitmapData = new BitmapData (70, 70, true);
  159.                 var mat:Matrix = new Matrix ();
  160.                 mat.tx = - aP0.x;
  161.                 mat.ty = - aP0.y;
  162.                 matBmd.draw (_bmd, mat);
  163.                                 */
  164.                 //分割した1個目を描画
  165.                 _canvas.graphics.lineStyle(1 , 0x00FF00);
  166.                 _canvas.graphics.beginBitmapFill(_bmd , newMatrix1 );
  167.                 _canvas.graphics.moveTo(bP0.x , bP0.y );
  168.                 _canvas.graphics.lineTo(bP1.x , bP1.y );
  169.                 _canvas.graphics.lineTo(bP2.x , bP2.y );
  170.                 _canvas.graphics.endFill ();
  171.                 
  172.                 //分割した2個目を描画
  173.                 _canvas.graphics.lineStyle(1 , 0x00FF00);
  174.                 _canvas.graphics.beginBitmapFill(_bmd , newMatrix2 );
  175.                 _canvas.graphics.moveTo(bP3.x , bP3.y );
  176.                 _canvas.graphics.lineTo(bP1.x , bP1.y );
  177.                 _canvas.graphics.lineTo(bP2.x , bP2.y );
  178.                 _canvas.graphics.endFill();
  179.             }            
  180.         }
  181.         
  182.         
  183.         private function _getTransformMatrix($pt0:Point, $pt1:Point, $pt2:Point):Matrix
  184.         {
  185.             /*
  186.             http://www.adobe.com/jp/devnet/flash/articles/matrix_class.html
  187.             a: 水平方向の伸縮率 = 変換後の幅/もとの幅
  188.             b: 垂直方向の傾斜率 = 垂直方向の傾斜/もとの幅
  189.             c: 水平方向の傾斜率 = 水平方向の傾斜/もとの高さ
  190.             d: 垂直方向の伸縮率 = 変換後の高さ/もとの高さ
  191.             tx: 水平方向の移動ピクセル数
  192.             ty: 垂直方向の移動ピクセル数
  193.             */
  194.             var w:Number = _w;
  195.             var h:Number = _w;
  196.             var mat:Matrix = new Matrix();
  197.             mat.a = ($pt1.x - $pt0.x) / w;
  198.             mat.b = ($pt1.y - $pt0.y) / w;
  199.             mat.c = ($pt2.x - $pt0.x) / h;
  200.             mat.d = ($pt2.y - $pt0.y) / h;
  201.             mat.tx = $pt0.x;
  202.             mat.ty = $pt0.y;
  203.             return mat;
  204.         }
  205.         
  206.         //こっからマウスのドラッグとかの設定(無視無視)
  207.         private function _cPMouseDownHandler(e:MouseEvent):void {
  208.             CirclePoint(e.target).startDrag();
  209.             CirclePoint(e.target).addEventListener(MouseEvent.MOUSE_MOVE , _cPMouseMoveHandler );
  210.             stage.addEventListener(MouseEvent.MOUSE_UP , _cPMouseUpHandler );
  211.         }
  212.         
  213.         private function _cPMouseUpHandler(e:MouseEvent):void {
  214.             CirclePoint(e.target).stopDrag();
  215.             CirclePoint(e.target).removeEventListener(MouseEvent.MOUSE_MOVE , _cPMouseMoveHandler );
  216.             stage.removeEventListener(MouseEvent.MOUSE_UP , _cPMouseUpHandler );
  217.         }
  218.         
  219.         private function _cPMouseMoveHandler(e:MouseEvent):void {
  220.             _draw();
  221.         }
  222.         
  223.         
  224.     }
  225. }
  226. import flash.display.Bitmap;
  227. import flash.display.Shape;
  228. import flash.display.BitmapData;
  229. import flash.display.Sprite;
  230. import flash.geom.Point;
  231. /**
  232.  * 赤い点を書いてる。
  233.  * それと初期状態のポイントをinitPointに保持してる。
  234.  */
  235. class CirclePoint extends Sprite {
  236.     public var initPoint:Point;
  237.     public function CirclePoint($x:Number , $y:Number) {
  238.         this.x = $x;
  239.         this.y = $y;
  240.         this.initPoint = new Point( $x , $y );
  241.         this.graphics.beginFill(0xFF0000,1);
  242.         this.graphics.drawCircle(0,0,5);
  243.         this.graphics.endFill();
  244.         this.buttonMode = true;
  245.     }
  246. }
  247. /**
  248.  * このTestImageクラスは画像の代わりに無理矢理、
  249.  * BitmapDataを作成してるだけなので無視無視無視無視無視。
  250.  */
  251. class TestImage extends Bitmap {
  252.     private var _w:Number = 200;
  253.     private var _h:Number = 200;
  254.     public function TestImage():void {
  255.         var s:Shape = new Shape();
  256.         s.graphics.beginFill(0xCCCCCC , 1 );
  257.         s.graphics.drawRect(0,0,_w,_h);
  258.         s.graphics.beginFill(0xFCFCFC , 1 );
  259.         s.graphics.drawRoundRect(30 , 30 , 30 , 10 , 20 ,20);
  260.         s.graphics.drawRoundRect(140 , 30 , 30 , 10 , 20 ,20);
  261.         s.graphics.drawCircle(50,70,10);
  262.         s.graphics.drawCircle(150,70,10);
  263.         s.graphics.drawCircle(75,120,5);
  264.         s.graphics.drawCircle(125,120,5);
  265.         s.graphics.drawRoundRect(40 , 170 , 120 , 10 , 20 ,20);
  266.         s.graphics.endFill();
  267.         
  268.         var bmd:BitmapData = new BitmapData(_w,_h);
  269.         bmd.draw(s);
  270.         this.bitmapData = bmd;
  271.     }
  272. }
noswf
Get Adobe Flash Player