[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Java3Djp:00524] タートルグラフィック・ライブラリー(2/3)
------------------------------------
メーリングリストはDNS
http://www.dns-ml.co.jp
初心者でも簡単開設・運用が可能です!
------------------------------------
Tutlte.java
=========================================
// Turtle graphics library
// Turtle.java
// copyright(c)1999 ENDO Yasuyuki <yasuyuki@xxxxxxxxxx>
package org.javaopen.j3d;
import java.util.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import org.javaopen.j3d.IPointColor;
import org.javaopen.j3d.ITurtle;
/**
* タートルグラフィッククラス Turtle
* @xxxxxxxxxx えんどう やすゆき
*/
public class Turtle implements IPointColor, ITurtle {
protected boolean penDown = false;
protected Point3d point = null;
protected Color3f color = null;
protected Vector3d vx = null;
protected Vector3d vy = null;
protected Vector3d vz = null;
protected TransformGroup viewTransform = null;
protected Vector points = new Vector();
protected Vector colors = new Vector();
/**
* コンストラクター<BR>
* <UL>
* <LI>位置=原点(x=0, y=0, z=0)
* <LI>色=白
* <LI>亀の向き=頭がy軸方向、甲羅がz軸方向、右がx軸方向
* </UL>
*/
public Turtle() {
point = new Point3d(0.0, 0.0, 0.0);
color = new Color3f(1.0f, 1.0f, 1.0f);
vx = new Vector3d(1.0, 0.0, 0.0);
vy = new Vector3d(0.0, 1.0, 0.0);
vz = new Vector3d(0.0, 0.0, 1.0);
}
/**
* コンストラクター<BR>
* <UL>
* <LI>位置=原点(x=0, y=0, z=0)
* <LI>色=白
* <LI>亀の向き=頭がy軸方向、甲羅がz軸方向、右がx軸方向
* </UL>
*/
public Turtle(TransformGroup viewTrans) {
this();
this.viewTransform = viewTrans;
}
// /**
// * 視点を現在地点まで移動 (方向は同じ)
// */
// protected void translateView() {
// if (viewTransform != null) {
// Transform3D trans = new Transform3D();
// trans.set(new Vector3d((Tuple3d)point));
// viewTransform.setTransform(trans);
// }
// }
/**
* 視点をy軸ベクトル方向に向ける (移動も伴う)
*/
protected void lookAt() {
if (viewTransform != null) {
double x = point.x + 800.0 * vy.x;
double y = point.y + 800.0 * vy.y;
double z = point.z + 800.0 * vy.z;
Point3d center = new Point3d(x, y, z);
Transform3D t3d = new Transform3D();
t3d.lookAt(point, center, vz);
t3d.invert();
viewTransform.setTransform(t3d);
}
}
/**
* 座標配列と色配列に現在位置、現在の色を追加
*/
protected void addPointAndColor() {
points.addElement(new Point3d(point));
colors.addElement(new Color3f(color));
}
/**
* 座標配列と色配列の最後の要素を削除
*/
protected void removeLastPointAndColor() {
if (points.size() > 1) points.removeElementAt(points.size() - 1);
if (colors.size() > 1) colors.removeElementAt(colors.size() - 1);
}
/**
* 座標配列と色配列に現在位置、色を追加して視点移動する
*/
protected void addEndPoint() {
if (penDown) addPointAndColor();
if (viewTransform != null) lookAt();
}
/**
* 指定座標まで移動する
* @xxxxxxxxxx point 移動後の座標
*/
public void setPoint(Point3d point) {
this.point = point;
addEndPoint();
}
/**
* 現在座標を取得する
* @xxxxxxxxxx 現在の座標
*/
public Point3d getPoint() {
return point;
}
/**
* 色をセットする
* @xxxxxxxxxx color 色
*/
public void setColor(Color3f color) {
this.color = color;
}
/**
* 現在の色を取得する
* @xxxxxxxxxx 現在の色
*/
public Color3f getColor() {
return color;
}
/**
* ペンアップ
*/
public void penUp() {
penDown = false;
//ペンダウン直後なら最後の要素を取り除く処理
}
/**
* ペンダウン
*/
public void penDown() {
if (!penDown) {
penDown = true;
addPointAndColor();
}
}
/**
* 原点に戻る (亀の方向も初期化)
*/
public void home() {
point.x = 0.0;
point.y = 0.0;
point.z = 0.0;
vx.x = 1.0; vx.y = 0.0; vx.z = 0.0;
vy.x = 0.0; vy.y = 1.0; vy.z = 0.0;
vz.x = 0.0; vz.y = 0.0; vz.z = 1.0;
if (penDown) addPointAndColor();
}
/**
* 前進する<BR>
* (y軸ベクトル方向への移動)
* @xxxxxxxxxx distance 移動距離 (マイナスなら後退)
*/
public void forward(double distance) {
point.x += distance * vy.x;
point.y += distance * vy.y;
point.z += distance * vy.z;
addEndPoint();
}
/**
* 上昇する<BR>
* (z軸ベクトル方向への移動)
* @xxxxxxxxxx distance 移動距離 (マイナスなら下降)
*
*/
public void moveUp(double distance) {
point.x += distance * vz.x;
point.y += distance * vz.y;
point.z += distance * vz.z;
addEndPoint();
}
/**
* 右移動する<BR>
* (x軸ベクトル方向への移動)
* @xxxxxxxxxx distance 移動距離 (マイナスなら左移動)
*/
public void moveRight(double distance) {
point.x += distance * vx.x;
point.y += distance * vx.y;
point.z += distance * vx.z;
addEndPoint();
}
/**
* 2つのベクトルを回転させる
* @xxxxxxxxxx v1 回転対象のベクトル1
* @xxxxxxxxxx v2 回転対象のベクトル2
* @xxxxxxxxxx s sin要素
* @xxxxxxxxxx c cos要素
*/
protected void rotateVectors(Vector3d v1, Vector3d v2, double s, double c) {
double d1, d2;
d1 = v1.x; d2 = v2.x;
v1.x = c * d1 + s * d2;
v2.x = -s * d1 + c * d2;
d1 = v1.y; d2 = v2.y;
v1.y = c * d1 + s * d2;
v2.y = -s * d1 + c * d2;
d1 = v1.z; d2 = v2.z;
v1.z = c * d1 + s * d2;
v2.z = -s * d1 + c * d2;
}
/**
* 右回転<BR>
* (z軸ベクトルを中心に回転)
* @xxxxxxxxxx radian 回転角(マイナスなら左回転)(単位ラジアン)
*/
public void turnRight(double radian) {
double s = Math.sin(-radian);
double c = Math.cos(-radian);
rotateVectors(vx, vy, s, c);
if (viewTransform != null) lookAt();
}
/**
* 右旋回<BR>
* (y軸ベクトルを中心に回転)
* @xxxxxxxxxx radian 回転角(マイナスなら左旋回)(単位ラジアン)
*/
public void rolleRight(double radian) {
double s = Math.sin(radian);
double c = Math.cos(radian);
rotateVectors(vz, vx, s, c);
if (viewTransform != null) lookAt();
}
/**
* ティルト・アップ<BR>
* (x軸ベクトルを中心に回転)
* @xxxxxxxxxx radian 回転角(マイナスならティルト・ダウン)(単位ラジアン)
*/
public void up(double radian) {
double s = Math.sin(radian);
double c = Math.cos(radian);
rotateVectors(vy, vz, s, c);
if (viewTransform != null) lookAt();
}
/**
* 視点側のTransformGroupをセットする<BR>
* @xxxxxxxxxx viewTrans ViewPlatform に結びついた TransformGroup
*/
public void addViewTransform(TransformGroup viewTrans) {
this.viewTransform = viewTrans;
//ここで視線方向をy軸ベクトル方向にセット
//translateView();
lookAt();
}
/**
* 視点側のTransformGroupを削除する
*/
public void removeViewTransform() {
this.viewTransform = null;
}
/**
* いままでの移動で蓄積された座標配列と色配列をGeometryArrayにセットする
* @xxxxxxxxxx geom セットしたい GeometryArray
*/
public void copyIntoGeometryArray(GeometryArray geom) throws IndexOutOfBoundsException {
geom.setCoordinates(0, getVertices());
geom.setColors(0, getColors());
}
/**
* 座標配列の要素数を取得する
* @xxxxxxxxxx 座標配列の要素数
*/
public int getVertexCount() { return points.size(); }
/**
* いままでの移動で蓄積された座標配列を取得する
* @xxxxxxxxxx 座標の配列
*/
public Point3d[] getVertices() throws IndexOutOfBoundsException {
Point3d[] verts = new Point3d[points.size()];
points.copyInto(verts);
return verts;
}
/**
* いままで蓄積された色の配列を取得する
* @xxxxxxxxxx 色の配列
*/
public Color3f[] getColors() throws IndexOutOfBoundsException {
Color3f[] rcolors = new Color3f[colors.size()];
colors.copyInto(rcolors);
return rcolors;
}
}
=========================================
--
えんどう やすゆき <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/ (Java互助会ホームページ)