空間座標

座標系の回転

TestMySpace03.java

軸の周りの回転です。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Scrollbar;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;

import myMath.MyPoint3D;
import myMath.Tpl10;

public class TestMySpace03 extends Tpl10 implements AdjustmentListener {

	Label myLabelX, myLabelY, myLabelZ;
	Scrollbar myScrollbarX, myScrollbarY, myScrollbarZ; // スクロールバー
	int angleX = 0, angleY = 0, angleZ = 0;
	int angleX0 = 0, angleY0 = 0, angleZ0 = 0;

	public void init() {
		tr.move(getWidth() / 2, getHeight() / 2);
		tr.set(1, 0, 0, -1);
		tr.scale(50);

		// パネル作成
		Panel myPanel2 = new Panel();
		myPanel2.setLayout(new GridLayout(2, 3));

		myLabelX = new Label("X = " + angleX);
		myLabelY = new Label("Y = " + angleY);
		myLabelZ = new Label("Z = " + angleZ);

		myScrollbarX = new Scrollbar(Scrollbar.HORIZONTAL, angleX, 0, -180, 180);
		myScrollbarY = new Scrollbar(Scrollbar.HORIZONTAL, angleY, 0, -180, 180);
		myScrollbarZ = new Scrollbar(Scrollbar.HORIZONTAL, angleZ, 0, -180, 180);

		myPanel2.add(myLabelX);
		myPanel2.add(myLabelY);
		myPanel2.add(myLabelZ);

		myPanel2.add(myScrollbarX);
		myPanel2.add(myScrollbarY);
		myPanel2.add(myScrollbarZ);

		// 全体のレイアウト
		setLayout(new BorderLayout());
		add("South", myPanel2);

		// イベントリスナーへの登録
		myScrollbarX.addAdjustmentListener(this);
		myScrollbarY.addAdjustmentListener(this);
		myScrollbarZ.addAdjustmentListener(this);
	}

	// スクロールバーに変位があったときのイベント処理
	public void adjustmentValueChanged(AdjustmentEvent e) {
		angleX0 = angleX;
		angleY0 = angleY;
		angleZ0 = angleZ;
		angleX = myScrollbarX.getValue();
		angleY = myScrollbarY.getValue();
		angleZ = myScrollbarZ.getValue();
		myLabelX.setText("x = " + angleX);
		myLabelY.setText("y = " + angleY);
		myLabelZ.setText("z = " + angleZ);
		repaint();
	}

	public void draw(Graphics2D g2) {

		tr.rotate3D(angleX - angleX0, angleY - angleY0, angleZ - angleZ0);

		MyPoint3D p0 = new MyPoint3D();
		MyPoint3D p1 = new MyPoint3D();
		MyPoint3D p2 = new MyPoint3D();
		MyPoint3D p3 = new MyPoint3D();
		MyPoint3D p4 = new MyPoint3D();

		p0.set(0, 0, 0);
		// 軸
		g2.setColor(Color.red);
		g2.draw(tr.Line(0, 0, 0, 3, 0, 0));
		g2.setColor(Color.green);
		g2.draw(tr.Line(0, 0, 0, 0, 3, 0));
		g2.setColor(Color.blue);
		g2.draw(tr.Line(0, 0, 0, 0, 0, 3));

		// 図形1
		g2.setColor(Color.cyan);
		p1.set(1, 0, 0);
		p2.set(0, 1, 0);
		p3.set(1, 1, 0);

		g2.draw(tr.Line(p0.x, p0.y, p0.z, p2.x, p2.y, p2.z));
		g2.draw(tr.Line(p1.x, p1.y, p1.z, p3.x, p3.y, p3.z));
		g2.draw(tr.Line(p2.x, p2.y, p2.z, p3.x, p3.y, p3.z));

		// 図形2
		g2.setColor(Color.blue);
		p1.set(1, 0, 1);
		p2.set(1, 1, 1);
		p3.set(0, 1, 1);
		p4.set(0, 0, 1);

		g2.draw(tr.Line(p1.x, p1.y, p1.z, p4.x, p4.y, p4.z));
		g2.draw(tr.Line(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z));
		g2.draw(tr.Line(p2.x, p2.y, p2.z, p3.x, p3.y, p3.z));
		g2.draw(tr.Line(p3.x, p3.y, p3.z, p4.x, p4.y, p4.z));
	}
}

実行例

x軸、y軸、z軸の周りに回転します。


[戻る]