Matrix3D.transpose()

transposeMatrix3D.transpose()メソッドについて
http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/geom/Matrix3D.html#transpose()
  
実体行列.transpose()

処理としては
行と列を入れ替える。
ただし、10,0,22,87未満ではhelp通りにはいかず
1,2,3,4,11,12,13,14,21,22,23,24,31,32,33,34

1,11,21,31*20,2,12,22,32*20,3,13,23,33*20,4/20,14/20,24/20,34
となる、1/20,20倍のバグがある。

▼Wonderfl

▼ActionScript AS3(FP10)
[sourcecode language=”as3″]
/*
Matrix3D.transpose();
と同じ機能の関数を作ってみる。
MAC 10,0,2,54,MAC 10,0,12,36,MAC 10,0,22,87で動作確認。

実体行列.transpose()

処理としては
行と列を入れ替える。
1,2,3,4,11,12,13,14,21,22,23,24,31,32,33,34

1,11,21,31*20,2,12,22,32*20,3,13,23,33*20,4/20,14/20,24/20,34
1/20,20倍のバグがある。

【追記】
10,0,22,87で20倍のバグは無くなった模様。

各要素をrandomで値を入れて、transposeし、
行列の各要素を比較して確認とした。

Matrix3D.transpose()
http://help.adobe.com/ja_JP/AS3LCR/Flash_10.0/flash/geom/Matrix3D.html#transpose()
*/
package {
import flash.display.Sprite;
import flash.geom.Matrix3D;
import flash.geom.Orientation3D;
import flash.text.TextField;
import flash.geom.Vector3D;
import flash.system.Capabilities;
public class Main extends Sprite {
public function Main() {
var txt:String="◆同機能関数Mtrx3D.transpose "+Capabilities.version+"での実行結果\n\n";

//確認用の値を用意
var entity:Matrix3D=new Matrix3D(Util.random16());
var entity1:Matrix3D=entity.clone();
var entity2:Matrix3D=entity.clone();

//実行
entity1.transpose();
Mtrx3D.transpose(entity2);

//確認
var entity1RawData:Vector.<Number>=entity1.rawData;
txt+="↓Matrix3D.transposeの結果\n"+entity1RawData+"\n";
var entity2RawData:Vector.<Number>=entity2.rawData;
txt+="\n↓同機能関数Mtrx3D.transposeの結果\n"+entity2RawData+"\n\n";
txt+=Util.hikaku(entity1RawData,entity2RawData);

//テキストフィールドを作りtxtを流し込み。
var tf:TextField = new TextField();
tf.width=stage.stageWidth;
tf.height=stage.stageHeight;
tf.wordWrap=true;
stage.addChild(tf);
tf.text=txt;
}
}
}
import flash.display.Sprite;
class Mtrx3D extends Sprite {
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
import flash.system.Capabilities;
public static function transpose(entity:Matrix3D):void {
//バグ対応。10,0,22,87未満の場合バグを含むように。
var bug:int = 1;
if(Util.version() <1000022087){
bug = 20;
}

var e:Vector.<Number>=entity.rawData;
var v:Vector.<Number>=new Vector.<Number>(16,true);
v[0]=e[0];
v[1]=e[4];
v[2]=e[8];
v[3]=e[12]*bug;
v[4]=e[1];
v[5]=e[5];
v[6]=e[9];
v[7]=e[13]*bug;
v[8]=e[2];
v[9]=e[6];
v[10]=e[10];
v[11]=e[14]*bug;
v[12]=e[3]/bug;
v[13]=e[7]/bug;
v[14]=e[11]/bug;
v[15]=e[15];
entity.rawData=v;
}
}
class Util {
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
import flash.system.Capabilities;
public static function version():uint{
//例10,0,22,87→10+00+022+087→1000022087
var ver_array:Array = Capabilities.version.substr(4).split(",");
return int(ver_array[0])*100000000+int(ver_array[1])*1000000+int(ver_array[2])*1000+int(ver_array[3]);
}

public static function hikaku(v0:Vector.<Number>,v1:Vector.<Number>):String {
var _str:String="↓二つのMatrix3Dの要素毎の差\n";
var _n:int=v0.length;
for (var i:int=0; i<_n; i++) {
_str += "["+i+"]:"+(v0[i]-v1[i])+"\n";
}
return _str;
}
public static function hikaku2(v0:Vector3D,v1:Vector3D):String {
var _str:String="↓二つのVector3Dの要素毎の差\n";
_str += ".x:"+(v0.x-v1.x)+"\n";
_str += ".y:"+(v0.y-v1.y)+"\n";
_str += ".z:"+(v0.z-v1.z)+"\n";
_str += ".w:"+(v0.w-v1.w)+"\n";
return _str;
}

public static function random16():Vector.<Number> {
var _v:Vector.<Number>=new Vector.<Number>(16,true);
for (var i:int=0; i<16; i++) {
_v[i]=Math.random()*200-100;
}
return _v;
}
public static function random9():Vector.<Number> {
var _mt:Matrix3D = new Matrix3D();
var v:Vector.<Vector3D>=new Vector.<Vector3D> ;
v[0]=new Vector3D(200*Math.random()-100,200*Math.random()-100,200*Math.random()-100);//平行移動、
v[1]=new Vector3D(10*Math.random()-5,10*Math.random()-5,10*Math.random()-5);//回転
v[2]=new Vector3D(100*Math.random(),100*Math.random(),100*Math.random());//拡大 / 縮小
_mt.recompose(v);
return _mt.rawData;
}
}
[/sourcecode]