In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

TransformUtil実験

参考
http://www.d-project.com/flex/009_FreeTransform/
Get Adobe Flash player
by Akiyah 16 Mar 2011
    Embed
/**
 * Copyright Akiyah ( http://wonderfl.net/user/Akiyah )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/sMf0
 */

package {
    import flash.display.*;
    import flash.events.*;
    import flash.filters.*;
    import flash.geom.*;
    import flash.net.*;
    import flash.system.*;
    import flash.text.*;
    import flash.utils.*;

    public class FlashTest extends Sprite {
        Security.loadPolicyFile("http://assets.wonderfl.net/crossdomain.xml");
        private var loader:Loader = new Loader();

        public function FlashTest() {
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadDone);
            loader.load(new URLRequest("http://assets.wonderfl.net/images/related_images/d/dd/ddba/ddba7040b86bdba34f301587d2353904b04148ca"));
        }

        private function loadDone(e:Event):void {
           var bmd:BitmapData= new BitmapData(loader.width,loader.height);
           bmd.draw(loader);
           var x:Number = 0;
           var y:Number = 0;
           TransformUtil.drawBitmapTriangle(this.graphics, bmd,
               new Point(100, 100), new Point(200, 100), new Point(100, 200),
               new Point(x, y), new Point(x + 100, y), new Point(x, y + 100));
           x = 110;
           y = 0;
           TransformUtil.drawBitmapTriangle(this.graphics, bmd,
               new Point(100, 100), new Point(200, 100), new Point(100, 200),
               new Point(x, y), new Point(x + 200, y), new Point(x, y + 100));
           
           x = 0;
           y = 110;
           TransformUtil.drawBitmapQuadrangle(this.graphics, bmd,
               new Point(100, 100), new Point(200, 100), new Point(100, 200), new Point(200, 200),
               new Point(x, y), new Point(x + 100, y), new Point(x, y + 100), new Point(x + 100, y + 100));
           x = 110;
           y = 110;
           TransformUtil.drawBitmapQuadrangle(this.graphics, bmd,
               new Point(100, 100), new Point(200, 100), new Point(100, 200), new Point(200, 200),
               new Point(x, y), new Point(x + 100, y), new Point(x, y + 100), new Point(x + 200, y + 200));
           x = 0;
           y = 220;
           TransformUtil.drawBitmapQuadrangle(this.graphics, bmd,
               new Point(100, 100), new Point(200, 100), new Point(100, 200), new Point(200, 200),
               new Point(x, y), new Point(x + 100, y), new Point(x, y + 100), new Point(x + 200, y + 200),
               1,1);
        }
    }
}


    import flash.geom.Point;
    import flash.geom.Matrix;
    import flash.display.Graphics;
    import flash.display.BitmapData;
    
    class TransformUtil {
        /**
         * ビットマップの三角形を描く。 
         * <br/>0 - 1
         * <br/>| /  
         * <br/>2 
         * @param g グラフィックス
         * @param bitmapData ビットマップデータ
         * @param a0 転送元(ビットマップデータ)の座標
         * @param a1 転送元(ビットマップデータ)の座標
         * @param a2 転送元(ビットマップデータ)の座標
         * @param b0 転送先(グラフィック)の座標
         * @param b1 転送先(グラフィック)の座標
         * @param b2 転送先(グラフィック)の座標
         */
        public static function drawBitmapTriangle(
            g : Graphics, bitmapData : BitmapData,
            a0 : Point, a1 : Point, a2 : Point, 
            b0 : Point, b1 : Point, b2 : Point
        ) : void {
            var matrix : Matrix = createMatrix(a0, a1, a2, b0, b1, b2);
            g.beginBitmapFill(bitmapData, matrix);
            drawTriangle(g, a0, a1, a2, matrix);
            g.endFill();
        }

        /**
         * ビットマップの四角形を描く。 
         * <br/>0 - 1
         * <br/>|   |
         * <br/>2 - 3
         * @param g グラフィックス
         * @param bitmapData ビットマップデータ
         * @param a0 転送元(ビットマップデータ)の座標
         * @param a1 転送元(ビットマップデータ)の座標
         * @param a2 転送元(ビットマップデータ)の座標
         * @param a3 転送元(ビットマップデータ)の座標
         * @param b0 転送先(グラフィック)の座標
         * @param b1 転送先(グラフィック)の座標
         * @param b2 転送先(グラフィック)の座標
         * @param b3 転送先(グラフィック)の座標
         * @param hDiv 水平方向の分割数
         * @param vDiv 垂直方向の分割数
         */
        public static function drawBitmapQuadrangle(
            g : Graphics, bitmapData : BitmapData,
            a0 : Point, a1 : Point, a2 : Point, a3 : Point, 
            b0 : Point, b1 : Point, b2 : Point, b3 : Point,
            hDiv : int = 4, vDiv : int = 4
        ) : void {

            for (var h : int = 0; h < hDiv; h++) {

                var h0 : Number = h / hDiv;
                var h1 : Number = (h + 1) / hDiv;

                var ta0 : Point = getPoint(a1, a0, h0);
                var ta1 : Point = getPoint(a1, a0, h1);
                var ta2 : Point = getPoint(a3, a2, h0);
                var ta3 : Point = getPoint(a3, a2, h1);

                var tb0 : Point = getPoint(b1, b0, h0);
                var tb1 : Point = getPoint(b1, b0, h1);
                var tb2 : Point = getPoint(b3, b2, h0);
                var tb3 : Point = getPoint(b3, b2, h1);

                for (var v : int = 0; v < vDiv; v++) {

                    var v0 : Number = v / vDiv;
                    var v1 : Number = (v + 1) / vDiv;

                    var tta0 : Point = getPoint(ta1, ta0, v0);
                    var tta1 : Point = getPoint(ta1, ta0, v1);
                    var tta2 : Point = getPoint(ta3, ta2, v0);
                    var tta3 : Point = getPoint(ta3, ta2, v1);
    
                    var ttb0 : Point = getPoint(tb1, tb0, v0);
                    var ttb1 : Point = getPoint(tb1, tb0, v1);
                    var ttb2 : Point = getPoint(tb3, tb2, v0);
                    var ttb3 : Point = getPoint(tb3, tb2, v1);

                    drawBitmapTriangle(g, bitmapData,
                        tta0, tta1, tta2, ttb0, ttb1, ttb2);
                    drawBitmapTriangle(g, bitmapData,
                        tta3, tta1, tta2, ttb3, ttb1, ttb2);
                }
            }
        }

        private static function getPoint(p0 : Point, p1 : Point, ratio : Number) : Point {
            return new Point(
                p0.x + (p1.x - p0.x) * ratio,
                p0.y + (p1.y - p0.y) * ratio
            );
        }

        private static function createMatrix(
            a0 : Point, a1 : Point, a2 : Point, 
            b0 : Point, b1 : Point, b2 : Point
        ) : Matrix {

            var ma : Matrix = new Matrix(
                a1.x - a0.x, a1.y - a0.y,
                a2.x - a0.x, a2.y - a0.y);
            ma.invert();

            var mb : Matrix = new Matrix(
                b1.x - b0.x, b1.y - b0.y,
                b2.x - b0.x, b2.y - b0.y);

            var m : Matrix = new Matrix();

            // O(原点)へ移動 
            m.translate(-a0.x, -a0.y);

            // 単位行列に変換(aの座標系の逆行列)
            m.concat(ma);

            // bの座標系に変換 
            m.concat(mb);

            // b0へ移動 
            m.translate(b0.x, b0.y);

            return m;
        }

        private static function drawTriangle(
            g : Graphics,
            p0 : Point, p1 : Point, p2 : Point,
            matrix : Matrix
        ) : void {

            p0 = matrix.transformPoint(p0);
            p1 = matrix.transformPoint(p1);
            p2 = matrix.transformPoint(p2);

            g.moveTo(p0.x, p0.y);
            g.lineTo(p1.x, p1.y);
            g.lineTo(p2.x, p2.y);
            g.lineTo(p0.x, p0.y);
        }        
    }