flash on 2013-1-8

by hacker_cobulht0
追記@一部なおしてみました
今年もよろしくお願い致します
適当な線で延長線を描く・hitTestを使わず内包判定
♥0 | Line 278 | Modified 2013-04-04 14:13:23 | MIT License
play

ActionScript3 source code

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

//追記@一部なおしてみました
//今年もよろしくお願い致します
//適当な線で延長線を描く・hitTestを使わず内包判定
package {
    import flash.display.Sprite;
    import flash.events.*;
    import flash.geom.*;
    
    [SWF(width = "465", height = "465", backgroundColor = 0xffffff, frameRate = "60")]
    
    public class Main extends Sprite{
        
        private static const fourCorners:Array=[new Point(0,0),new Point(465,0),new Point(465,465),new Point(0,465)];//左上 右上 右下 左下
        
        private var _List:Vector.<_SPRITE_>=new Vector.<_SPRITE_>();
        
        private var canvas:Sprite=new Sprite();
        private var waq:Sprite=new Sprite();
        private var tkk:Sprite=new Sprite();//多角形A描写
        
        private var tkkA:Array=new Array();//多角形Aの点情報
        
        private var pS:Point=new Point();
        private var pE:Point=new Point();
        
        private var pS2:Point=new Point();
        private var pE2:Point=new Point();
        
        
        public function Main(){if (stage) init();else addEventListener(Event.ADDED_TO_STAGE,init );}            
        
        public function init(ev:Event = null){
            removeEventListener( Event.ADDED_TO_STAGE, init ) ;
                    
            stage.addChild(waq);
            stage.addChild(canvas);
            stage.addChild(tkk);
            
            waq.graphics.lineStyle(1,0xDBD7D2);
            waq.graphics.drawRect(0,0,465,465);
            waq.graphics.endFill();
            
            for (var q:int=0; q < 100; q++) {
                    var mr:_SPRITE_=new _SPRITE_();
                    addChild(mr);
                    mr.x=q % 10*20+125;
                    mr.y=Math.floor(q / 10)*20+125;
                    _List.push(mr);                    
                }
            
            stage.addEventListener(MouseEvent.MOUSE_DOWN, mdw);
        }
        
        //マウス操作----------------------------------------------------------------------------------------------------
        
        
        private function mdw(ev){
            func_mr_reset();
            tkkA=new Array();
            canvas.graphics.clear();
            tkk.graphics.clear();
            stage.addEventListener(MouseEvent.MOUSE_UP, mup);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, mmv);
            
            pS.x=mouseX;
            pS.y=mouseY;
        }
        private function mmv(ev){            
            canvas.graphics.clear();
            canvas.graphics.lineStyle(5,0x9FE2BF);
            canvas.graphics.moveTo(pS.x,pS.y);
            canvas.graphics.lineTo(mouseX,mouseY);
            canvas.graphics.endFill();
        }
        private function mup(ev){
            
            stage.removeEventListener(MouseEvent.MOUSE_UP, mup);
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, mmv);
            
            //canvas.graphics.clear();
            pE.x=mouseX;
            pE.y=mouseY;
            
            //pSの続き
            pS2=searchOverLine(pS,pE);
            //pEの続き
            pE2=searchOverLine(pE,pS);
            
            
            if(ckError(pS2,pE2)==true){
                canvas.graphics.lineStyle(10,0xC5E384);
                canvas.graphics.moveTo(pS.x,pS.y);
                canvas.graphics.lineTo(pS2.x,pS2.y);
                canvas.graphics.endFill();
            
                canvas.graphics.lineStyle(10,0x30BA8F);
                canvas.graphics.moveTo(pE.x,pE.y);
                canvas.graphics.lineTo(pE2.x,pE2.y);
                canvas.graphics.endFill();
            
            
            //二分割判定へ →tkkAに値が入る
            graphicDivision();
            if(tkkA.length>0){_ComprehensionJudgment(tkkA)}
            
            }else{canvas.graphics.clear();};
            
        }
        //エラーチェック
        private function ckError(arg1,arg2):Boolean{
            var _b:Boolean=true;
            if(arg1==null||arg2==null){_b=false;}
            else if(arg1.x==0&&arg1.y==0){_b=false;}
            else if(arg2.x==0&&arg2.y==0){_b=false;}
            else if(isNaN(arg1.x)==true&&isNaN(arg1.y)==true){_b=false;}
            else if(isNaN(arg2.x)==true&&isNaN(arg2.y)==true){_b=false;}
            return _b;
        }
        
        //延長線検索----------------------------------------------------------------------------------------------------
        private function searchOverLine(arg1,arg2):Point{//点の先を探す方 補助でいる点情報
            var rP:Point=new Point();
            //全体:左上がりか 右上がりか
            var kataagari:String;//右上がり線か 左上がり線か
            var ss:String;//arg1の立ち位置
                //Yが上の方と下の方
                var yu:Number;
                var ys:Number;                
            if(arg1.x<arg2.x){ss="hd";}else{ss="mg";};
            if(arg1.y<arg2.y){ss+="ue";yu=arg1.x;ys=arg2.x;}else{ss+="st";yu=arg2.x;ys=arg1.x;};
            if(yu<ys){kataagari="hd";}else{kataagari="mg";};
            
            //移動量
            var mvx=Math.max(arg1.x,arg2.x)-Math.min(arg1.x,arg2.x);
            var mvy=Math.max(arg1.y,arg2.y)-Math.min(arg1.y,arg2.y);if(mvy==0){return null;};
            var endP:Point=new Point();
            endP.x=arg1.x;
            endP.y=arg1.y;
            
            if(kataagari=="hd"){
                if(ss=="hdue"){
                    while (endP.y > 0) {
                        endP.x-=mvx;
                        endP.y-=mvy;
                    }
                    rP= getIntersectionPoint(new Point(-10000,0),new Point(10000,0),arg1,endP);
                }else if(ss=="mgst"){
                    while (endP.y < 465) {
                        endP.x+=mvx;
                        endP.y+=mvy;
                    }
                    rP= getIntersectionPoint(new Point(-10000,465),new Point(10000,465),arg1,endP);
                }
                
            }else if(kataagari=="mg"){
                if(ss=="mgue"){
                    while (endP.y > 0) {
                        endP.x+=mvx;
                        endP.y-=mvy;
                    }
                    rP= getIntersectionPoint(new Point(-10000,0),new Point(10000,0),arg1,endP);
                }else if(ss=="hdst"){
                    while (endP.y < 465) {
                        endP.x-=mvx;
                        endP.y+=mvy;
                    }
                    rP= getIntersectionPoint(new Point(-10000,465),new Point(10000,465),arg1,endP);
                }
            }
            return rP;
        }
        
        //交差点検索
        private function getIntersectionPoint(P1,P2,P3,P4):Point{
            var cPt:Point=new Point();
                        
            //交差してるかしてないか
            var ta=(P3.x - P4.x) * (P1.y - P3.y) + (P3.y - P4.y) * (P3.x - P1.x);
            var tb=(P3.x - P4.x) * (P2.y - P3.y) + (P3.y - P4.y) * (P3.x - P2.x);
            var tc=(P1.x - P2.x) * (P3.y - P1.y) + (P1.y - P2.y) * (P1.x - P3.x);
            var td=(P1.x - P2.x) * (P4.y - P1.y) + (P1.y - P2.y) * (P1.x - P4.x);
            
            if(ta * tb < 0 && tc * td < 0){
                //2線の交点を求める
              var v1a = (P1.y - P2.y) / (P1.x - P2.x);
              var v1b = (P1.x*P2.y - P1.y*P2.x) / (P1.x - P2.x);
            
              var v2a = (P3.y - P4.y) / (P3.x - P4.x);
              var v2b = (P3.x*P4.y - P3.y*P4.x) / (P3.x - P4.x);
              
              cPt.x = Math.floor((v2b-v1b) / (v1a-v2a));
              cPt.y = Math.floor(v1a * cPt.x + v1b);
            
                return cPt;
            }else{return null;}
            
                
        }
        
        //二分割作成----------------------------------------------------------------------------------------------------
                   
        private function graphicDivision(){
            //型と中点2つ objの集合を配列で返す
            var ar:Array=new Array();
            ar.push(search_pcob(pS2),search_pcob(pE2));
                    //arの順番をただす
                    if(ar[1].hen<ar[0].hen){
                        var tmp:Array=new Array();
                        tmp[0]=ar[1];
                        tmp[1]=ar[0];
                        ar=tmp;
                    }
            
            var str:String=String(ar[0].hen)+String(ar[1].hen);
            
            //多角形A描写
            if(str=="02"||str=="13"){takaku4(ar);}else{takaku3(ar);}
            
        }
        
        //objを返す
        private function search_pcob(arg):Object{
            var obj:Object=new Object();
                if(arg.y==465&&arg.x>0&&arg.x<465){
                        obj={hen:2,poi:arg};
                }else if(arg.y==0||arg.y==465){
                    if(arg.x>0&&arg.x<465){
                        obj={hen:0,poi:arg};
                    }else if(arg.x>465){
                        obj={hen:1,poi:arg};
                    }else if(arg.x<0){
                        obj={hen:3,poi:arg};
                    }                    
                }
            return obj;
        }
        
        //多角形A描写
        private function takaku3(arg){
            var str:String=String(arg[0].hen)+String(arg[1].hen);
            tkk.graphics.beginFill(0x1FCECB,0.5);
            if(str=="01"){
                tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
                tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
                tkk.graphics.lineTo(fourCorners[1].x,fourCorners[1].y);
                tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
                
                tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
                tkkA[1]= new Point(arg[1].poi.x,arg[1].poi.y);
                tkkA[2]= new Point(fourCorners[1].x,fourCorners[1].y);                
            }else if(str=="03"){
                tkk.graphics.moveTo(fourCorners[0].x,fourCorners[0].y);
                tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
                tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
                tkk.graphics.lineTo(fourCorners[0].x,fourCorners[0].y);
                
                tkkA[0]= new Point(fourCorners[0].x,fourCorners[0].y);
                tkkA[1]= new Point(arg[0].poi.x,arg[0].poi.y);
                tkkA[2]= new Point(arg[1].poi.x,arg[1].poi.y);
            }else if(str=="12"){
                tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
                tkk.graphics.lineTo(fourCorners[2].x,fourCorners[2].y);
                tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
                tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
                
                tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
                tkkA[1]= new Point(fourCorners[2].x,fourCorners[2].y);
                tkkA[2]= new Point(arg[1].poi.x,arg[1].poi.y);
            }else if(str=="23"){
                tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
                tkk.graphics.lineTo(fourCorners[3].x,fourCorners[3].y);
                tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
                tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
                
                tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
                tkkA[1]= new Point(fourCorners[3].x,fourCorners[3].y);
                tkkA[2]= new Point(arg[1].poi.x,arg[1].poi.y);
            }
            tkk.graphics.endFill();
        }
        
        private function takaku4(arg){
            var str:String=String(arg[0].hen)+String(arg[1].hen);
            tkk.graphics.beginFill(0x1FCECB,0.5);
            if(str=="02"){
                tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
                tkk.graphics.lineTo(fourCorners[1].x,fourCorners[1].y);
                tkk.graphics.lineTo(fourCorners[2].x,fourCorners[2].y);
                tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
                tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
                
                tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
                tkkA[1]= new Point(fourCorners[1].x,fourCorners[1].y);
                tkkA[2]= new Point(fourCorners[2].x,fourCorners[2].y);
                tkkA[3]= new Point(arg[1].poi.x,arg[1].poi.y);
            }else if(str=="13"){
                tkk.graphics.moveTo(arg[0].poi.x,arg[0].poi.y);
                tkk.graphics.lineTo(fourCorners[2].x,fourCorners[2].y);
                tkk.graphics.lineTo(fourCorners[3].x,fourCorners[3].y);
                tkk.graphics.lineTo(arg[1].poi.x,arg[1].poi.y);
                tkk.graphics.lineTo(arg[0].poi.x,arg[0].poi.y);
                
                tkkA[0]= new Point(arg[0].poi.x,arg[0].poi.y);
                tkkA[1]= new Point(fourCorners[2].x,fourCorners[2].y);
                tkkA[2]= new Point(fourCorners[3].x,fourCorners[3].y);
                tkkA[3]= new Point(arg[1].poi.x,arg[1].poi.y);
            }tkk.graphics.endFill();
        }
        
        //各_SPRITE_は多角形Aに内包さえているか
        private function _ComprehensionJudgment(arg){
            //多角形の中点を求める
            var _G:Point=_getG(arg);
            
            for (var k:int=0; k < _List.length; k++) {
                var mr=_List[k];
                var mp:Point=_getG(arg);
                mp.x=mr.x;
                mp.y=mr.y
                var ck:Boolean=true;
                            //多角形の辺の数だけチェック
                                for (var q:int=0; q < arg.length; q++) {
                                    if(q==arg.length-1){
                                        if(getIntersectionPoint(arg[q],arg[0],_G,mp)!=null){ck=false};
                                    }else{
                                        if(getIntersectionPoint(arg[q],arg[q+1],_G,mp)!=null){ck=false};
                                    }
                                }
                if(ck==false){mr.alpha=0.2;}else{mr.scaleX=mr.scaleY=1.5;}
            }
        }
        //多角形の中点を求める
        private function _getG(arg):Point{
            var _p:Point=new Point();
            var xx:Number=0;
            var yy:Number=0;
            for (var q:int=0; q < arg.length; q++) {
                xx+=arg[q].x;
                yy+=arg[q].y;
            }
            _p.x=(xx/arg.length);
            _p.y=(yy/arg.length);
            return _p;
        }
                            private function func_mr_reset(){
                                
                                for (var q:int=0; q < _List.length; q++) {
                                    var mr=_List[q];
                                    mr.alpha=mr.scaleX=mr.scaleY=1;
                                }

                            }
        //---------------------------------------------------------------- ------------------------------------
                   
        
    }
}

import flash.display.Sprite;
import flash.geom.Point;
class _SPRITE_ extends Sprite{
public function _SPRITE_ (){
        this.graphics.beginFill(0x1DACD6);
        this.graphics.drawCircle(0,0,5);
        this.graphics.endFill();
    }
}