空間用の座標変換クラスを作ります。
ソースです。
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をつけます。