[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互助会ホームページ)