forked from: forked from: flash on 2012-5-25

by tepe forked from forked from: flash on 2012-5-25 (diff: 37)
ドローラインに含まれるノードの数を節約する
♥0 | Line 131 | Modified 2014-10-07 13:36:14 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/o1Ow
 */

// forked from tepe's forked from: flash on 2012-5-25
// forked from tepe's flash on 2012-5-25
package {
    
    /*
    ドローラインに含まれるノードの数を節約する
    */
    
    import flash.display.Sprite;
    import flash.geom.*;
    import flash.events.*;
    import flash.text.*;
    public class FlashTest extends Sprite {
        private var line:Array = new Array();
        private var lineList:Array = new Array();
        private var tf:TextField =new TextField();
        private var g:Sprite = new Sprite();
        public function FlashTest() {
            // write as3 code here..
            addChild(tf);
            addChild(g);
            addChild(tf2);
            tf2.x=200;
            tf.selectable=false;
            tf2.selectable=false;
            
            //ライン上から特徴点を探す
            //タイトコーナー
            //交差点
            //端点
            graphics.beginFill(0xffffff);
            graphics.drawRect(0,0,466,466);
            graphics.endFill();
            stage.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
            
            


            //tf.appendText("\n"+n3.toString());
            
        }
        
        //描画開始
        private function onDown(e:MouseEvent):void{
            tf.text="onDown";
            //描画
            stage.addEventListener(MouseEvent.MOUSE_MOVE,addNode);
            //描画終了
            stage.addEventListener(MouseEvent.MOUSE_UP,onUp);

        }
        
        private function onUp(e:MouseEvent):void{
            stage.removeEventListener(MouseEvent.MOUSE_MOVE,addNode);
            stage.removeEventListener(MouseEvent.MOUSE_UP,onUp);
            lineList.push(line);
            line = new Array();
        }

        
        //n1 元角度 n2先角度
        private var tf2:TextField = new TextField();
        private function subAngle(n1:Number,n2:Number,r:Boolean=false):Number{
            
            var n3:Number;
            var r1:Number;
            if(r==false)r1=180;
            else r1=Math.PI;
            
            n3 = n1 - n2;
            n3+=r1*2;
            n3%=r1*2;
            if(n3>r1)n3-=r1*2;
            return -n3;
        }

        //ノード追加
        private var prevPos:Point=new Point(0,0);
        private function addNode(e:MouseEvent):void{
            var pos:Point = new Point(mouseX,mouseY);
            if(Point.distance(prevPos,pos)<20)return;
            prevPos = pos;
            line.push(pos);
            tf.text=line.length.toString();
            drawLine(0x000000);
            //var nodeList:Array = aaa(line);
            var line2:Array = wayline2(line);
            tf.appendText("\n"+line2.length);
            tf.appendText("\nlist:"+lineList.length);
            g.graphics.lineStyle(0,0xff0000,0.2);
            for(var i:int=0;i<line2.length;i++){
                g.graphics.beginFill(0xff0000,0.2);
                g.graphics.drawCircle(line2[i].x,line2[i].y,2);
                g.graphics.endFill();
            }
            g.graphics.moveTo(line2[0].x,line2[0].y);
            for(i=1;i<line2.length;i++){
                g.graphics.lineTo(line2[i].x,line2[i].y);
            }

        }
        
        private function drawLine(col:uint=0x000000,alpha:Number=1):void{
            g.graphics.clear();
            g.graphics.lineStyle(0,col,alpha);
            var i:int;
            
            //lineListを描画
            for(i=0;i<lineList.length;i++){
                var line2:Array = lineList[i];
                g.graphics.moveTo(line2[0].x,line2[0].y);
                for(var j:int=1;j<line2.length;j++){
                    g.graphics.lineTo(line2[j].x,line2[j].y);
                }
            }
 
            
            g.graphics.moveTo(line[0].x,line[0].y);
            for(i=1;i<line.length;i++){
                g.graphics.lineTo(line[i].x,line[i].y);
            }

        }
       
         //特徴点を探す
        private function wayline2(line:Array):Array{           
            var a:Point;
            var b:Point;
            var v:Point;
            
            var angle:Number=0;
            var result:Array = new Array();
            //タイトコーナーを探す
            var n:Number=20;//閾値角度
            var prev:Number = 0;
            result.push(line[0]);
            for(var i:int=1;i<line.length;i++){
                a= new Point(line[i-1].x,line[i-1].y);
                b= new Point(line[i].x,line[i].y);
                v = a.subtract(b);
                angle = Math.atan2(v.y,v.x) *180/ Math.PI;//角度
                if(angle<0)angle+=360//Math.PI*2

                var n3:Number = subAngle(prev,angle);
                if (n < Math.abs(n3)) { 
                    result.push(line[i-1]); 
                    prev = angle;
                }

            }
            result.push(line[line.length - 1]);

            return result;
        }
        
        /*
            特徴点
            端点:線の最後
            交差点:線が交差している点
            角:ベクトルの向きが大きく変化する開始点
                角をどのように抽出するか?
                    →ベクトルの向き×ラインの幅 ラインの幅を外れる位置を抽出する
        */
        
        //特徴点を探す
        private function aaa(line:Array):Array{           
            var a:Point;
            var b:Point;
            var v:Point;
            var angle:Number=0;
            var result:Array = new Array();
            //タイトコーナーを探す
            var n:Number=20;//閾値角度
            var prev:Number=0;

            for(var i:int=1;i<line.length;i++){
                a= new Point(line[i-1].x,line[i-1].y);
                b= new Point(line[i].x,line[i].y);
                v = a.subtract(b);
                angle = Math.atan2(v.y,v.x) *180/ Math.PI;//角度
                if(angle<0)angle+=360//Math.PI*2

                var n3:Number = subAngle(prev,angle);
                if(n < Math.abs(n3)){ 
                    result.push(i-1); 
                    prev = angle;
                }

            }

            return result;
        }



    }
}