flash on 2012-9-4

by tepe
♥0 | Line 115 | Modified 2012-09-04 09:58:42 | 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/6WvL
 */

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 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;
            
            
            //ライン上から特徴点を探す
            //タイトコーナー
            //交差点
            //端点
            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,function():void{

                stage.removeEventListener(MouseEvent.MOUSE_MOVE,addNode);

            });



        }

        

        //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();

            //var nodeList:Array = aaa(line);

            var line2:Array = wayline2(line);

            tf.appendText("\n"+line2.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():void{

            g.graphics.clear();

            g.graphics.lineStyle(0x000000);

            g.graphics.moveTo(line[0].x,line[0].y);

            for(var i:int=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;

        }







    }

}