/* ----------------------------------------------------------------------------- Matrixクラス計算用関数 ファイル名 : mtx33.as as.Ver : AS 1.0 Flash 5 以降 製作 : Hakuhin (C) 2006/08/17 ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- -------------------------------------- マトリックスの型 -------------------------------------- matrix = { a : 0 , b : 0, c : 0 , d : 0, tx : 0 , ty : 0, }; -------------------------------------- Matrixクラスと互換性を持たせるために 同じオブジェクト形式で行列計算しています。 // 行列用関数 ------------------------------------------------------- function Mtx33Create(); // 単位行列作成 function Mtx33Clone (m); // 行列複製 function Mtx33GetPos(m); // 座標成分取得 // 平行移動行列 ----------------------------------------------------- function Mtx33Translate(x,y); // 平行行列作成 function Mtx33TranslatePref(x,y,m); // 平行行列 * 指定行列 function Mtx33TranslatePost(x,y,m); // 指定行列 * 平行行列 // 回転行列 ----------------------------------------------------- function Mtx33Rotate(rot); // 回転行列作成 function Mtx33RotatePref(rot,m); // 回転行列 * 指定行列 function Mtx33RotatePost(rot,m); // 指定行列 * 回転行列 // 拡大縮小行列 ----------------------------------------------------- function Mtx33Scale(x,y); // 拡縮行列作成 function Mtx33ScalePref(x,y,m); // 拡縮行列 * 指定行列 function Mtx33ScalePost(x,y,m); // 指定行列 * 拡縮行列 // 射影変換 --------------------------------------------------------- function Vec2dTransformPoint (x,y,m); // 点の射影 function Vec2dTransformVector (x,y,m); // ベクトルの射影 function Mtx33Transform (m,m); // 行列の射影(行列 * 行列) // 逆行列 --------------------------------------------------------- function Mtx33InvertOrthoNormal (m); // 逆マトリックスを計算(正規直交行列用) function Mtx33Invert (m); // 逆マトリックスを計算 注.Mtx33Transform() は計算量が多いので *Pref *Post 関数で計算できるときはそっちを優先して使用すること ----------------------------------------------------------------------------- */ /* ------------------------------------------------------------------- マトリックス作成 引数 なし 返り値 単位行列 ------------------------------------------------------------------- */ function Mtx33Create(){ return { a : 1, b : 0, c : 0, d : 1, tx: 0, ty: 0 }; } /* ------------------------------------------------------------------- マトリックス複製 引数 複製したい行列 返り値 複製後の行列 ------------------------------------------------------------------- */ function Mtx33Clone(m){ return { a : m.a, b : m.b, c : m.c, d : m.d, tx: m.tx, ty: m.ty }; } /* ------------------------------------------------------------------- 座標成分取得 引数 取得したい行列 返り値 座標ベクトル(オブジェクト) ------------------------------------------------------------------- */ function Mtx33GetPos(m){ return { x : m.tx, y : m.ty }; } /* ------------------------------------------------------------------- 平行行列作成 第01引数 x 座標 第02引数 y 座標 返り値 平行行列 ------------------------------------------------------------------- */ function Mtx33Translate(x,y){ return { a : 1, b : 0, c : 0, d : 1, tx: x, ty: y }; } /* ------------------------------------------------------------------- 平行移動行列計算(平行行列 * 指定行列) 第01引数 x 座標 第02引数 y 座標 第03引数 指定行列 返り値 計算後の行列 ------------------------------------------------------------------- */ function Mtx33TranslatePref(x,y,m){ return { a : m.a, b : m.b, c : m.c, d : m.d, tx: x * m.a + y * m.c + m.tx, ty: x * m.b + y * m.d + m.ty }; } /* ------------------------------------------------------------------- 平行移動行列計算(指定行列 * 平行行列) 第01引数 x 座標 第02引数 y 座標 第03引数 指定行列 返り値 計算後の行列 ------------------------------------------------------------------- */ function Mtx33TranslatePost(x,y,m){ return { a : m.a, b : m.b, c : m.c, d : m.d, tx: m.tx + x, ty: m.ty + y }; } /* ------------------------------------------------------------------- 回転行列作成 引数 角度 返り値 回転行列 ------------------------------------------------------------------- */ function Mtx33Rotate(rot){ var rad = rot * Math.PI / 180; var cos = Math.cos(rad); var sin = Math.sin(rad); return { a : cos, b : sin, c : -sin, d : cos, tx: 0, ty: 0 }; } /* ------------------------------------------------------------------- 回転行列計算(回転行列 * 指定行列) 第01引数 角度 第02引数 指定行列 返り値 計算後の行列 ------------------------------------------------------------------- */ function Mtx33RotatePref(rot,m){ var rad = rot * Math.PI / 180; var cos = Math.cos(rad); var sin = Math.sin(rad); return { a : cos * m.a + sin * m.c, b : cos * m.b + sin * m.d, c : -sin * m.a + cos * m.c, d : -sin * m.b + cos * m.d, tx: m.tx, ty: m.ty }; } /* ------------------------------------------------------------------- 回転行列計算(指定行列 * 回転行列) 第01引数 角度 第02引数 指定行列 返り値 計算後の行列 ------------------------------------------------------------------- */ function Mtx33RotatePost(rot,m){ var rad = rot * Math.PI / 180; var cos = Math.cos(rad); var sin = Math.sin(rad); return { a : m.a * cos + m.b * -sin, b : m.a * sin + m.b * cos, c : m.c * cos + m.d * -sin, d : m.c * sin + m.d * cos, tx: m.tx * cos + m.ty * -sin, ty: m.tx * sin + m.ty * cos }; } /* ------------------------------------------------------------------- 拡大縮小行列作成 第01引数 x 軸成分 第02引数 y 軸成分 返り値 拡縮行列 ------------------------------------------------------------------- */ function Mtx33Scale(x,y){ return { a : x, b : 0, c : 0, d : y, tx: 0, ty: 0 }; } /* ------------------------------------------------------------------- 拡大縮小行列計算(拡縮行列 * 指定行列) 第01引数 x 軸成分 第02引数 y 軸成分 第03引数 指定行列 返り値 計算後の行列 ------------------------------------------------------------------- */ function Mtx33ScalePref(x,y,m){ return { a : x * m.a, b : x * m.b, c : y * m.c, d : y * m.d, tx: m.tx, ty: m.ty }; } /* ------------------------------------------------------------------- 拡大縮小行列計算(指定行列 * 拡縮行列) 第01引数 x 軸成分 第02引数 y 軸成分 第03引数 指定行列 返り値 計算後の行列 ------------------------------------------------------------------- */ function Mtx33ScalePost(x,y,m){ return { a : m.a * x, b : m.b * y, c : m.c * x, d : m.d * y, tx: m.tx * x, ty: m.ty * y }; } /* ------------------------------------------------------------------- 点の射影変換 第01引数 x座標 第02引数 y座標 第03引数 指定行列 返り値 変換後の座標ベクトル(オブジェクト) ------------------------------------------------------------------- */ function Vec2dTransformPoint(x,y,m){ return { x : x * m.a + y * m.c + m.tx, y : x * m.b + y * m.d + m.ty }; } /* ------------------------------------------------------------------- ベクトルの射影変換 第01引数 x 軸成分 第02引数 y 軸成分 第03引数 指定行列 返り値 変換後のベクトル(オブジェクト) ------------------------------------------------------------------- */ function Vec2dTransformVector (x,y,m){ return { x : x * m.a + y * m.c, y : x * m.b + y * m.d }; }; /* ------------------------------------------------------------------- マトリックス同士の計算 第01引数 1つ目の行列 第02引数 2つ目の行列 返り値 計算後の行列 ------------------------------------------------------------------- */ function Mtx33Transform (m1,m2){ return { a : m1.a * m2.a + m1.b * m2.c, b : m1.a * m2.b + m1.b * m2.d, c : m1.c * m2.a + m1.d * m2.c, d : m1.c * m2.b + m1.d * m2.d, tx: m1.tx * m2.a + m1.ty * m2.c + m2.tx, ty: m1.tx * m2.b + m1.ty * m2.d + m2.ty }; }; /* ------------------------------------------------------------------- 逆マトリックスを計算(正規直交行列用) 第01引数 正規直交行列 返り値 逆行列 ------------------------------------------------------------------- */ function Mtx33InvertOrthoNormal (m){ return { a : m.a, b : m.c, c : m.b, d : m.d, tx: -m.tx * m.a + -m.ty * m.b, ty: -m.tx * m.c + -m.ty * m.d }; } /* ------------------------------------------------------------------- 逆マトリックスを計算 第01引数 行列 返り値 逆行列 ------------------------------------------------------------------- */ function Mtx33Invert (m){ var o = { a : 1.0, b : 0.0, c : 0.0, d : 1.0, tx: 0.0, ty: 0.0 } var _01 = m.b; var _11 = m.d; var _21 = m.ty; if(m.a){ o.a /= m.a; _01 /= m.a; } _11 -= m.c * _01; o.c -= m.c * o.a; _21 -= m.tx * _01; o.tx -= m.tx * o.a; if(_11){ o.c /= _11; } o.tx -= _21 * o.c; o.a -= _01 * o.c; _01 = m.b; _11 = m.d; _21 = m.ty; if(m.a){ o.b /= m.a; _01 /= m.a; } _11 -= m.c * _01; o.d -= m.c * o.b; _21 -= m.tx * _01; o.ty -= m.tx * o.b; if(_11){ o.d /= _11; } o.ty -= _21 * o.d; o.b -= _01 * o.d; return o; }