※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


FORKED
  1. // forked from obanetty's 直線や線分の交点を計算する
  2. package {
  3.     import flash.display.Sprite;
  4.     import flash.events.MouseEvent;
  5.     import flash.geom.Point;
  6.     import flash.display.Graphics;
  7.     public class LineTest extends Sprite {
  8.     //マウスドラッグの始点と終点
  9.     private var s_p:Point;
  10.     private var e_p:Point;
  11.     
  12.     //描画領域
  13.     private var canvas:Sprite;
  14.     //四角形の四辺を格納する配列
  15.     private var lineArray:Array;
  16.     
  17.     function LineTest():void{
  18.         
  19.         //四角形の四隅のポイント
  20.         var leftTop:Point = new Point(stage.stageWidth / 2 - 100, stage.stageHeight / 2 - 100);
  21.         var rightTop:Point = new Point(stage.stageWidth / 2 + 100, stage.stageHeight / 2 - 100);
  22.         var rightBottom:Point = new Point(stage.stageWidth / 2 + 100, stage.stageHeight / 2 + 100);
  23.         var leftBottom:Point = new Point(stage.stageWidth / 2 - 100, stage.stageHeight / 2 + 100);
  24.         //四角形の描画
  25.         var base:Sprite = new Sprite();
  26.         var g:Graphics = base.graphics;
  27.         base.x = base.y = 0;
  28.         stage.addChild(base);    
  29.         g.lineStyle(3, 0x000000);
  30.         g.drawRect(leftTop.x, leftTop.y, 200200);
  31.         
  32.         //四角形の4つの辺をLineインスタンスとして作成し、配列に格納
  33.         var line1:Line = new Line(leftTop, rightTop, Line.TYPE_SEGMENT);
  34.         var line2:Line = new Line(rightTop, rightBottom, Line.TYPE_SEGMENT);
  35.         var line3:Line = new Line(rightBottom, leftBottom, Line.TYPE_SEGMENT);
  36.         var line4:Line = new Line(leftBottom, leftTop, Line.TYPE_SEGMENT);
  37.         lineArray = [line1, line2, line3, line4];
  38.         
  39.         //赤線の描画領域を作成
  40.         canvas = new Sprite();
  41.         canvas.x = 0;
  42.         canvas.y = 0;
  43.         stage.addChild(canvas);
  44.         
  45.         stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
  46.     }
  47.     
  48.     private function onMouseDown(event:MouseEvent):void{
  49.         stage.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
  50.         stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
  51.         stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  52.         
  53.         //ドラッグ開始点の保存(線分の始点)
  54.         s_p = new Point(mouseX, mouseY);
  55.     }
  56.     
  57.     private function onMouseMove(event:MouseEvent):void{
  58.         //ドラッグ終了点の保存(線分の終点)
  59.         e_p = new Point(mouseX, mouseY);
  60.         
  61.         //マウスドラッグによりできた線分の描画
  62.         var g:Graphics = canvas.graphics;
  63.         g.clear();
  64.         g.lineStyle(3, 0xff0000);
  65.         g.moveTo(s_p.x, s_p.y);
  66.         g.lineTo(e_p.x, e_p.y);
  67.         
  68.         //描画された線分と四角形の四辺それぞれの交点を計算
  69.         var line:Line = new Line(s_p, e_p, Line.TYPE_SEGMENT);
  70.         lineArray.forEach(function(item:*, index:int, array:Array):void{
  71.             var p:Point = item.getIntersectionPoint(line);
  72.             if(p != null){
  73.                 //交点があれば円を描画
  74.                 g.beginFill(0xff0000);
  75.                 g.drawCircle(p.x, p.y, 10);
  76.             }
  77.         });
  78.     }
  79.     
  80.     private function onMouseUp(event:MouseEvent):void{
  81.         stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
  82.         stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  83.         stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
  84.     }
  85.     }
  86. }
  87. import flash.geom.Point;
  88. import flash.display.Graphics;
  89.     
  90. class Line
  91. {
  92.     /* 2点を通る直線(終端はない) */
  93.     public static const TYPE_STRAIGHT:String = "straight";
  94.     /* p1からp2の方向に延びる半直線 */
  95.     public static const TYPE_HALF:String = "half";
  96.     /* p1, p2間の線分 */
  97.     public static const TYPE_SEGMENT:String = "segment";
  98.     
  99.     public var p1:Point;
  100.     public var p2:Point;
  101.     public var type:String;
  102.     
  103.     public function Line(p1:Point, p2:Point, type:String=TYPE_STRAIGHT)
  104.     {
  105.         this.p1 = p1;
  106.         this.p2 = p2;
  107.         this.type = type;
  108.     }
  109.     
  110.     /**
  111.      * 2つのLineインスタンスの交点を表わすPointインスタンスを取得する
  112.      * 交点がない場合はnullを返す
  113.      * @param line
  114.      * @return 
  115.      * 
  116.      */
  117.     public function getIntersectionPoint(line:Line):Point{
  118.         var vector1:Point = this.getVector();
  119.         var vector2:Point = line.getVector();
  120.         
  121.         if(cross(vector1, vector2) == 0.0){
  122.             //2直線が並行の場合はnullを返す
  123.             return null;
  124.         }
  125.         
  126.         // 交点を this.p1 + s * vector1 としたとき
  127.         var s:Number = cross(vector2, line.p1.subtract(this.p1)) / cross(vector2, vector1);
  128.         // 交点を line.p1 + t * vector2 としたとき
  129.         var t:Number = cross(vector1, this.p1.subtract(line.p1)) / cross(vector1, vector2);
  130.         
  131.         if(this.validateIntersect(s) && line.validateIntersect(t)){
  132.             vector1.x *= s;
  133.             vector1.y *= s;
  134.             return this.p1.add(vector1);
  135.         }else{
  136.             return null;
  137.         }
  138.     }
  139.     
  140.     public function getVector():Point{
  141.         return p2.subtract(p1);
  142.     }
  143.     
  144.     /**
  145.      * 交点までのベクトルを p1 + n * (p2 - p1) であらわしたとき、
  146.      * nが適切な値の範囲内かどうかを判定する。
  147.      * 
  148.      * 直線の場合:nはどの値でもよい
  149.      * 半直線の場合:nは0以上である必要がある
  150.      * 線分の場合:nは0以上1以下である必要がある
  151.      * @param n
  152.      * @return 
  153.      * 
  154.      */
  155.     private function validateIntersect(n:Number):Boolean{
  156.         if(this.type === TYPE_HALF){
  157.             return (0 <= n);
  158.         }else if(this.type === TYPE_SEGMENT){
  159.             return ((0 <= n) && (n <= 1));
  160.         }else{
  161.             return true;
  162.         }
  163.     }
  164.     
  165.     /**
  166.      * 2つの2次元ベクトルの外積を返す
  167.      * @param vector1 2次ベクトルを表わすPointインスタンス
  168.      * @param vector2 2次ベクトルを表わすPointインスタンス
  169.      * @return 
  170.      * 
  171.      */
  172.     private function cross(vector1:Point, vector2:Point):Number{
  173.         return (vector1.x * vector2.y - vector1.y * vector2.x);
  174.     }
  175.     public function toString():String{
  176.         var str:String = "";
  177.         if(type === TYPE_STRAIGHT){
  178.             str += "---> ";
  179.         }
  180.         str += "(" + p1.x + ", " + p1.y + ") ---> (" + p2.x + ", " + p2.y + ")";
  181.         if(type === TYPE_STRAIGHT || type === TYPE_HALF){
  182.             str += " --->";
  183.         }
  184.         
  185.         return str;
  186.     }
  187. }
noswf
Get Adobe Flash Player