itsukichang

フロントエンドが得意なエンジニア.ダーツと旅行とギターが好き

AS3:Pointクラスについて

結構躓いたPointクラスについてのメモ.

Pointクラスについて

Pointクラスはその名の通り,点の座標を扱います.
インスタンスを生成する為には,2つのNumber型の引数が必要です.
newして生成したインスタンスをtraceで表示すると,第一引数がx座標,第二引数がy座標として表示されます.

pt:Point = new Point(50,50);
trace(pt); //出力:(x=50,y=50)

クラスプロパティ,クラスメソッド

長さを測るlength

基準点(0,0)から対象とする点までの距離がわかります.

pt:Point = new Point(50,50);
trace(pt.length); //出力 : 70.71067811865476
点同士の演算

加算・・・add()
減算・・・subtract()
距離計測・・・Point.distance()
等価・・・equals()

var pt1:Point = new Point(100,100);
var pt2:Point = new Point(50,50);
var pt3:Point = new Point();

pt3 = pt1.add(pt2); //加算
trace(pt3); //出力(x=150,y=150)
pt3 = pt1.subtract(pt2); //減算
trace(pt3); //出力(x=50,y=50)

var tmp:Number = Point.distance(pt1,pt2); //距離を代入
trace(tmp); //出力:70.71067811865476

trace(pt1.equals(pt2)); //出力:false
2点の間の点を計算するinterpolate()

3つの引数を与えます.
第一引数・・・Point型
第二引数・・・Point型
第三引数・・・0~1までの値

2つの点の間の点を返します.3つ目の引数が1に近いほど,第一引数の点に近くなり,0に近いほど,第二引数の点に近くなります.

var pt1:Point = new Point(100,100);
var pt2:Point = new Point(300,300);
var pt3:Point = Point.interpolate(pt1,pt2,1);
trace(pt3); //出力:(x=100,y=100)
pt3 = Point.interpolate(pt1,pt2,0);
trace(pt3); //出力:(x=300,y=300)
pt3 = Point.interpolate(pt1,pt2,0.5);
trace(pt3); //出力:(x=200,y=200)
点の距離を変えるnormalize()

ベクトルの角度は保ち,距離のみを変更できます.

normalizeに与える引数(Number型)の距離に変更できます.
このとき角度は固定です.

例えば,(1,1)にある点の距離を5にしたい場合.
基準点が(0,0)なので(1,1)の距離は√(2)です.
距離5になるには,座標はどこに移動すればいいでしょうか?
ぱっと思いつくのは(3,4)または(4,3)でしょう.
しかし,これらの座標に移動すると,基準点からの角度が変わってしまいます.
もっと簡単に考えると,元の点の座標,x,yの比率と移動した点の,x,yの比率が変化してしまいます
(1,1) = x:y = 1:1.
(3,4) = x:y = 3:4.

この比率を保ったまま移動すると,角度は保ったまま,距離のみ移動する事ができます.
さきほどの(1,1)にある点をnormalizeメソッドを使用し,距離5に変更すると,返ってくる座標は(3.5355,3.5355)です.
x,yの比率が1:1となってますね.

(座標値が巫女さんになってますね,素敵ですね)

var pt1:Point = new Point(1,1);

trace("距離=" + pt1.length + "座標 = " + pt1); //出力:距離=5 座標=(x=3,5355....y=3,5355....)
長さと角度を指定して,点を返すPoint.polar()

polarは引数を二つ,長さと角度を与えて,基準点からその長さ,角度に応じた場所の点を返します.
ちなみに角度はラジアンです.

距離√2,角度π/4を与えると,点(1,1)が返ってくるわけです.

var pt1:Point;

pt1=Point.polar(Math.sqrt(2),Math.PI/4); //距離√2,角度π/4を与える
trace(pt1); //出力:(x=1,y=1)

まとめ?

Point型についてはほとんど紹介しましたー.
結構ややこしい所もありますね><

いい加減,はてなシンタックスハイライトにAS3が無いのにイライラしてきた.
酷い迫害ですね!ぷんすか.



数学だいじだなー.



今日から後期です.夏休みおわりですって.やーねー.