MyTransクラス

MyTrans クラス

空間用の座標変換クラスを作ります。

MyTrans.java

ソースです。

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をつけます。


[前へ] [戻る] [次へ]