空間用の座標変換クラスを作ります。
ソースです。
package myMath; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; public class MyTrans extends MyTrans2D { public double z; MyPoint3D e0 = new MyPoint3D(); MyPoint3D e1 = new MyPoint3D(); MyPoint3D e2 = new MyPoint3D(); MyPoint3D e3 = new MyPoint3D(); public MyTrans() { e0.set(0, 0, 0); e1.set(1, 0, 0); e2.set(0, 1, 0); e3.set(0, 0, 1); z = 0; } // 空間 -> 平面座標 void to2D() { double x0, y0; int xx = 35; // x軸からの角度 int yy = 30; // xy平面からの角度 x0 = -x * Math.sin(Math.toRadians(xx)) + y * Math.cos(Math.toRadians(xx)); y0 = -x * Math.cos(Math.toRadians(xx)) * Math.sin(Math.toRadians(yy)) - y * Math.sin(Math.toRadians(xx)) * Math.sin(Math.toRadians(yy)) + z * Math.cos(Math.toRadians(yy)); x = x0; y = y0; } public void p(double x1, double y1, double z1) { x = e1.x * x1 + e2.x * y1 + e3.x * z1; y = e1.y * x1 + e2.y * y1 + e3.y * z1; z = e1.z * x1 + e2.z * y1 + e3.z * z1; to2D(); } public void p(double x1, double y1, double z1, double x2, double y2, double z2) { p(x1, y1, z1); super.x1 = x; super.y1 = y; p(x2, y2, z2); super.x2 = x; super.y2 = y; } // 軸の周りの回転 public void rotate3D(double angleX, double angleY, double angleZ) { e1.rotate(angleX, angleY, angleZ); e2.rotate(angleX, angleY, angleZ); e3.rotate(angleX, angleY, angleZ); } // /////////////////////////////////////////////////////////// // 直線 public Line2D Line(double x1, double y1, double z1, double x2, double y2, double z2) { p(x1, y1, z1, x2, y2, z2); return Line(super.x1, super.y1, super.x2, super.y2); } public Line2D Line(MyPoint3D p1, MyPoint3D p2) { return Line(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z); } // 軸 public Line2D LineX3D() { p(0, 0, 0, 10, 0, 0); return Line(super.x1, super.y1, super.x2, super.y2); } public Line2D LineY3D() { p(0, 0, 0, 0, 10, 0); return Line(super.x1, super.y1, super.x2, super.y2); } public Line2D LineZ3D() { p(0, 0, 0, 0, 0, 10); return Line(super.x1, super.y1, super.x2, super.y2); } // 点 public Ellipse2D Point(double x, double y, double z) { p(x, y, z); return Point(super.x, super.y); } }
空間用の座標変換クラスを作ります。 MyTrans2Dクラスを継承します。 名前は、MyTrans とします。
public class MyTrans3D extends MyTrans2D { }
x、y、z の値を代入するためのメソッドです。
// 座標を代入する public void p(double x, double y, double z) { int xx = 35; // x軸からの角度 int yy = 30; // xy平面からの角度 super.x = -x * Math.sin(Math.toRadians(xx)) + y * Math.cos(Math.toRadians(xx)); super.y = -x * Math.cos(Math.toRadians(xx)) * Math.sin(Math.toRadians(yy)) - y * Math.sin(Math.toRadians(xx)) * Math.sin(Math.toRadians(yy)) + z * Math.cos(Math.toRadians(yy)); }
ところで、空間をディスプレイで表現する。 それについてはx軸からの角度とxy平面からの角度を適当に決めます。 そして、MyTrans2D クラスの x、y に代入します。 MyTrans の x、y のために、MyTrans2D クラスのx、yが見えません。 そんなとき、superをつけます。