Dimension

目次

はじめに

Dimension クラスは 2 次元の値を扱う汎用的なクラスです。座標、ベクトル、その他汎用的な項目等にも使えます。
DHTML ではレイヤーのサイズ( width , height )やポジション( left , top )、移動方向等を一括して扱うことが可能です。
他のクラスでも多々使われる再利用性の高いクラスです。

使用例

var p = new Dimension( 10 , 20 );
var q = new Dimension( 30 , 40 );

p.scale( 3 ); // p の中身を 3 倍
p.add( q );   // p と q の中身の値を足したものを p に代入

status = p ; // 結果は Dimension : ( 60 , 100 )

/* DHTML での使用例 */

var f = new Dimension( 10 , 20 );
Elements["LAYER"].setPosition( f ); // ( 10 , 20 ) へ移動します。

インスタンス変数

number x ;
number y ;
2 次元の値を扱うので、インスタンス変数は x,y の2つを有しています。

コンストラクタ

Dimension();
Dimension( number x0 , number y0 );
Dimension( number[] a );
Dimension( Dimension p );
インスタンスを生成します。宣言の仕方は上の4つです。 ここで a は長さが 2 以上の配列です。この場合、x = a[0] , y = a[1] ; となります。
引数なしでは x = 0 , y = 0 ; になります。
var p0 = new Dimension();
var p1 = new Dimension( 10 , 20 );
var p2 = new Dimension( new Array( 30 , 40 ) );
var p3 = new Dimension( p2 );

インスタンスメソッド

値の変更 : set
void set();
void set( number x0 , number y0 );
void set( number[] a0 );
void set( Dimension p0 );
インスタンス変数の値を変更します。
引数でセットされる値の意味はコンストラクタと同じです。
var p = new Dimension( 10 , 20 );
p.set( 30 , 40 );

status = "( "+p.getX()+" , "+p.getY()+" )"; // 結果は ( 30 , 40 )
値の変更(個別) : set*
void setX( number x0 );
void setY( number y0 );
インスタンス変数 x , y の値を個別に変更します。
var p = new Dimension( 10 , 20 );
p.setX( 30 );
p.setY( 40 );

status = "( "+p.getX()+" , "+p.getY()+" )"; // 結果は ( 30 , 40 )
値の取得 : get*
number getX();
number getY();
インスタンス変数 x , y の値を取得します。
var p = new Dimension( 10 , 20 );

status = "( "+p.getX()+" , "+p.getY()+" )"; // 結果は ( 10 , 20 )
等しいか判定 : equals , intEquals
boolean equals( Dimension p0 );
引数 p0 の持つインスタンス変数と等しいか判定します。
等しいとき true が返ります。
boolean intEquals( Dimension p1 );
引数 p1 と自分の持つインスタンス変数を整数にしたものを考え、等しいか判定します。
等しいとき true が返ります。
var p = new Dimension( 0.1 , 1.2 );
var q = new Dimension( 0 , 1 );

status = p.equals(q);    // 結果は false
status = p.intEquals(q); // 結果は true
数か判定 : isNaN
boolean isNaN();
インスタンス変数が、数かどうかを判定します。
x , y一つでも数でないものが含まれる場合、true が返ります。
var p = new Dimension( "text" , 20 );

status = p.isNaN(); // 結果は true
絶対値 : absolute
void absolute();
インスタンス変数を絶対値に変換します。
var p = new Dimension( -10 , 20 );
p.absolute();

status = "( "+p.getX()+" , "+p.getY()+" )"; // 結果は ( 10 , 20 )
加減演算 : add , sub
void add( Dimension p0 );
void sub( Dimension p1 );
Dimension クラスをベクトルとして考え、加減演算を行います。
結果は引数だけオフセットしたものになります。add は足し算、sub は引き算です。 しいて書くなら、a.add(b) は a = a + b , a.sub(b) は a = a - b です。
var p0 = new Dimension( 10 , 20 );
p0.add( new Dimension( 30 , 40 ) );

status = "( "+p0.getX()+" , "+p0.getY()+" )"; // 結果は ( 40 , 60 )

var p1 = new Dimension( 10 , 20 );
p1.sub( new Dimension( 30 , 40 ) );

status = "( "+p1.getX()+" , "+p1.getY()+" )"; // 結果は ( -20 , -20 )
スケーリング : scale
void scale( number n );
インスタンス変数を引数倍します。
var p = new Dimension( 10 , 20 );
p.scale( 3 );

status = "( "+p.getX()+" , "+p.getY()+" )"; // 結果は ( 30 , 60 )
距離 : distance
number distance();
number distance( Dimension p );
Dimension クラスを座標と考え、引数 p までの距離を返します。
引数なしの場合は原点(0,0)からの距離を返します。
var p = new Dimension( 1 , 1 );
status = p.distance(); // 結果は 1.4142... ( √2 )

var q = new Dimension( 3 , 3 );
status = q.distance( p ); // 結果は 2.8284... ( 2√2 )
角度 : angle
number angle();
number angle( Dimension p );
Dimension クラスをベクトルと考え、引数 p とのなす角を返します。
引数なしでは x 軸からの角度を返します。 単位は rad です。返される値の範囲は Math.acos() と同じで、0-PI です。
var p = new Dimension( 1 , 1 );
status = p.angle(); // 結果は PI/4 ( 45度 )

var q = new Dimension( 0 , 1 );
status = q.angle( p ); // 結果は PI/4 ( 45度 )
内積 : mulin
number mulin( Dimension p );
Dimension クラスをベクトルと考え、引数 p と内積した値を返します。
var p = new Dimension( 10 , 20 );
var q = new Dimension( 30 , 40 );

status = p.mulin(q); // 結果は 1100 (=10*30+20*40)
大小 : max , min
number max();
number min();
インスタンス変数 x,y を比較して大きい(小さい)方の値を返します。
var p = new Dimension( 10 , 20 );
status = p.max(); // 結果は 20

var q = new Dimension( 30 , 40 );
status = q.min(); // 結果は 30
配列 : toArray
number[] toArray();
インスタンス変数 x,y の値を持つ配列を生成し、取得します。
var p = new Dimension( 10 , 20 );
var a = p.toArray();

status = a[0]+" , "+a[1]; // 結果は 10 , 20
整数 : toInteger
Dimension toInteger();
インスタンス変数を整数にしたものを生成し、取得します。
内部では Math.floor(少数点以下は切り捨て)を使用しています。
var p = new Dimension( 0.1 , 1.6 );
var q = p.toInteger();

status = "( "+q.getX()+" , "+q.getY()+" )"; // 結果は ( 0 , 1 )
標準出力文字列 : toString
string toString();
Dimension クラスの標準出力文字列を返します。 返される文字列は "Dimension : (" + x + " , " + y + " )" です。
var p = new Dimension( 10 , 20 );

status = p ; // 結果は Dimension : ( 10 , 20 )

メソッド一覧

Dimension クラスで使用できるメソッドのリストです。
メソッド名説明
voidsetインスタンス変数の設定
voidsetXインスタンス変数 x の設定
voidsetYインスタンス変数 y の設定
numbergetXインスタンス変数 x の取得
numbergetYインスタンス変数 y の取得
booleanequals等しいか判定
booleanintEquals整数にしたものが等しいか判定
booleanisNaN数か設定
voidabsolute絶対値に変換
voidaddベクトルの加算
voidsubベクトルの減算
voidscaleスケーリング
numberdistance距離を算出
numberangle角度を算出
numbermulin内積
numbermax大きい方の値を取得
numbermin小さい方の値を取得
number[]toArray配列にしたものを取得
DimensiontoInteger整数にしたものを取得
stringtoString標準出力文字列

補足

■ こんな使い方もできます 1
Dimension クラスのインスタンス変数 x,y の型は一応 number(数) となっていますが、JavaScript の性質上、本当は何でも良いです。
最初にも少し書いていますが、これを利用すると以下のような使い方もできます。
var persons = new Array(
    new Dimension( "名前0" , "住所0" ),
    new Dimension( "名前1" , "住所1" ),
    new Dimension( "名前2" , "住所2" )
);

status = persons[0].getX(); // 結果は 名前0
↑では Dimension クラスを使った DB みたいなものを作成しています。
また、次のようなこともできます。
var matrix = new Dimension(
    new Dimension( "00" , "01" ),
    new Dimension( "10" , "11" )
);

status = matrix.getX().getX(); // 結果は 00
↑のように Dimension クラスのインスタンス変数に Dimension クラスを指定することも可能です。この例では 2×2 の行列を生成しています。
勿論こういった使い方をする場合、メソッドの殆どは使用できません。
■ こんな使い方もできます 2
Dimension クラスのコンストラクタは4つありました。以下
Dimension();
Dimension( number x0 , number y0 );
Dimension( number[] a );
Dimension( Dimension p );
ソースを見てもらえば分かりますが、実をいうと
Dimension( number n );
という形式のものが存在します。この場合、インスタンス変数は
x = y = n ;
となります。これは管理人が楽をしようとした結果、出来たものです(^^);
だってイチイチ同じ値設定するのに
var p = new Dimension( 20 , 20 );
とやるよりか、
var p = new Dimension( 20 );
ってやった方が速いじゃん。分かり易いし。DHTML で正方形のオブジェクトとか作成するとき便利です。

これに関連して、add , sub メソッドにも同じように
void add( number a );
void sub( number s );
という形式があります。とりあえず実例↓
var p = new Dimension( 10 , 20 );
p.add( 30 );

status = p ; // 結果は Dimension : ( 40 , 50 )
ということです。中身が引数だけ足されています。sub は引きます。
■ Dimension クラスの私的な使い方
DHTML やってると円運動とか頻繁に出てきます。
分かる人は分かると思うけど例えば、以下のような感じのプログラム。
var r = 30 ; // 半径
var t = Math.PI*count ; // 位相

var x = r*Math.cos(t)+offsetX ; // x 座標
var y = r*Math.sin(t)+offsetY ; // y 座標
少なくとも僕はこれがしょっちゅう出てきます。
僕はこれを Dimension クラスを使って以下のように書いてます。
var p = new Dimension( Math.cos(t) , Math.sin(t) );
p.scale( r );
p.add( offset );
Dimension クラスの使い方のヒントになるのではないでしょうか?