スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ActionScript 3.0] 行列式を利用した三角形と点の位置関係

2007-11-06 | 20:06

点Pから三角形の頂点A,B,CへのベクトルをそれぞれPA,PB,PCとすると、 行列式|PA PB|、|PB PC|、|PC PA| の符号がすべて正ならば、点Pは三角形の内部にある。
(A,B,Cの順番が逆周りなら、符号がすべて負のとき点Pは三角形の内部にある。)

それを応用したデモ。 (三角形の内部にある点は赤くなっているはず)

package
{
    import flash.display.*;
    import flash.geom.*;
    import flash.events.Event;

    [SWF(width="500", height="500", backgroundColor="#ffffff")]
        public class Main extends Sprite
        {
            public var vertexes:Array;

            private var balls:Array;

            public function Main()
            {
                balls = new Array();
                for(var i:int = 0 ; i < 50 ; i++){
                    var b:Ball = new Ball(0xff00, 5);
                    b.x = Math.random()*500;
                    b.y = Math.random()*500;
                    b.vx = Math.random()*2+1;
                    b.vy = Math.random()*2+1;
                    addChild(b);
                    balls.push(b);
                }

                this.vertexes = new Array();
                this.vertexes.push( new Ball(0xff, 2));
                this.vertexes.push( new Ball(0xff, 2));
                this.vertexes.push( new Ball(0xff, 2));

                for each (var v:Ball in vertexes){
                    v.x = Math.random()*500;
                    v.y = Math.random()*500;
                    v.vx = Math.random()*2+1;
                    v.vy = Math.random()*2+1;
                    addChild(v);
                }

                this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            }

            private function enterFrameHandler(event:Event):void
            {
                for each (var v:Ball in vertexes){
                    v.move();
                }
                graphics.clear();
                graphics.lineStyle(1, 0x0000ff, 0.5);
                graphics.moveTo(vertexes[0].x, vertexes[0].y);
                graphics.lineTo(vertexes[1].x, vertexes[1].y);
                graphics.lineTo(vertexes[2].x, vertexes[2].y);
                graphics.lineTo(vertexes[0].x, vertexes[0].y);

                for each (var b:Ball in balls){
                    b.move();

                    // |PA PB|
                    var papb:Number = (vertexes[0].x-b.x)*(vertexes[1].y-b.y)-
                        (vertexes[1].x - b.x)*(vertexes[0].y - b.y);
                    // |PB PC|
                    var pbpc:Number = (vertexes[1].x-b.x)*(vertexes[2].y-b.y)-
                        (vertexes[2].x - b.x)*(vertexes[1].y - b.y);
                    // |PC PA|
                    var pcpa:Number = (vertexes[2].x-b.x)*(vertexes[0].y-b.y)-
                        (vertexes[0].x - b.x)*(vertexes[2].y - b.y);

                    trace(papb);
                    trace(pbpc);
                    trace(pcpa);

                    var c:int = (papb > 0 && pbpc > 0 && pcpa > 0 ||
                            papb < 0 && pbpc < 0 && pcpa < 0 ) ? 0xff0000 : 0xff;
                    b.color = c;
                }
            }
        }
}

import flash.display.*;
internal class Ball extends Sprite{
    public var vx:int = 2;
    public var vy:int = 2;
    public var radius:int;
    public var currentColor:int;
    public function Ball(c:Number=0, radius:Number = 0){
        graphics.lineStyle(1, 0, 0.5);
        graphics.beginFill(c);
        graphics.drawCircle(0,0,radius);
        graphics.endFill();
        this.radius = radius;
    }

    public function set color(c:int):void{
        if(currentColor != c){
            currentColor = c;
            graphics.clear();
            graphics.lineStyle(1, 0, 0.5);
            graphics.beginFill(currentColor);
            graphics.drawCircle(0,0,radius);
            graphics.endFill();
        }
    }

    public function move():void{
        x += vx;
        y += vy;
        if(x < 0 || x > 500)
            vx *= -1;
        if(y < 0 || y > 500)
            vy *= -1;
    }
}

スポンサーサイト

Trackback


この記事にトラックバックする(FC2ブログユーザー)

FLASH

FLASHでの検索結果をマッシュアップ。一語から広がる言葉のポータルサイト。

Comment

Post a comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。