アフィン変換は次のような性質を持つ:
これらはいずれも、座標の変換公式を見て、直線/曲線/曲面の方程式に当てはめれば容易にわかることである。
回転に関する性質:
public class _xyz { double x,y,z; }必要なときに、このクラスを import して使う(これまでも、graphics クラスを使うときにそうしてきたが、それを使うソースファイルと同じディレクトリに置いておく。そうすれば、わざわざ import 文を書かなくてもよい)。
// 3次元の平行移動 // coordinate で与えられる点を dist で与えられる距離だけ平行移動した点を求める public static _xyz Parallel(_xyz coordinates, _xyz dist) { _xyz new_coordinates = new _xyz(); new_coordinates.x = coordinates.x+dist.x; new_coordinates.y = coordinates.y+dist.y; new_coordinates.z = coordinates.z+dist.z; return new_coordinates; }_xyz クラスを使って平行移動した結果を描いたものが これ である(正しく平行移動が行なわれたかどうかは xy 座標についてしか分からない) (ソースコード)。
// 3次元の回転 // xyz で与えられる点を axis 軸の回りに theta 度回転した点を求める public static _xyz Rotate(_xyz xyz, char axis, double theta) { _xyz new_xyz = new _xyz(); final double RADIAN = Math.PI/180; switch (axis) { case 'x': new_xyz.x = Rotate3X_x(xyz.x,xyz.y,xyz.z,theta); new_xyz.y = Rotate3X_y(xyz.x,xyz.y,xyz.z,theta); new_xyz.z = Rotate3X_z(xyz.x,xyz.y,xyz.z,theta); break; case 'y': new_xyz.x = Rotate3Y_x(xyz.x,xyz.y,xyz.z,theta); new_xyz.y = Rotate3Y_y(xyz.x,xyz.y,xyz.z,theta); new_xyz.z = Rotate3Y_z(xyz.x,xyz.y,xyz.z,theta); break; case 'z': new_xyz.x = Rotate3Z_x(xyz.x,xyz.y,xyz.z,theta); new_xyz.y = Rotate3Z_y(xyz.x,xyz.y,xyz.z,theta); new_xyz.z = Rotate3Z_z(xyz.x,xyz.y,xyz.z,theta); break; } return new_xyz; }
cuboid4c を使って、まず、スケーリングと平行移動 を行なってみよう(ソースコード):