mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/terrain/DriftInterpolator.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: DriftInterpolator.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.4 $
2 26 Feb 07 jari 8  * $Date: 2006/02/23 20:59:56 $
2 26 Feb 07 jari 9  * $Author: caliente $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.microarray.mev.cluster.gui.impl.terrain;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.util.Enumeration;
2 26 Feb 07 jari 15
2 26 Feb 07 jari 16 import javax.media.j3d.Alpha;
2 26 Feb 07 jari 17 import javax.media.j3d.BoundingLeaf;
2 26 Feb 07 jari 18 import javax.media.j3d.Interpolator;
2 26 Feb 07 jari 19 import javax.media.j3d.Transform3D;
2 26 Feb 07 jari 20 import javax.media.j3d.TransformGroup;
2 26 Feb 07 jari 21 import javax.media.j3d.WakeupOnBehaviorPost;
2 26 Feb 07 jari 22 import javax.vecmath.Matrix3d;
2 26 Feb 07 jari 23 import javax.vecmath.Point3d;
2 26 Feb 07 jari 24 import javax.vecmath.Vector3d;
2 26 Feb 07 jari 25 import javax.vecmath.Vector3f;
2 26 Feb 07 jari 26
2 26 Feb 07 jari 27 public class DriftInterpolator extends Interpolator {
2 26 Feb 07 jari 28
2 26 Feb 07 jari 29     private static final int POST_ID = 0;
2 26 Feb 07 jari 30
2 26 Feb 07 jari 31     private TransformGroup target;
2 26 Feb 07 jari 32     private float min_distance = 0.15f;
2 26 Feb 07 jari 33     // initial position
2 26 Feb 07 jari 34     private Vector3d start_v3d = new Vector3d();
2 26 Feb 07 jari 35     private Point3d  start_eye_p3d = new Point3d();
2 26 Feb 07 jari 36     private Vector3d start_up_v3d = new Vector3d();
2 26 Feb 07 jari 37     // desired position
2 26 Feb 07 jari 38     private Point3d finish_p3d = new Point3d();
2 26 Feb 07 jari 39     private Point3d lookat_p3d = new Point3d();
2 26 Feb 07 jari 40
2 26 Feb 07 jari 41     public DriftInterpolator(TransformGroup target, BoundingLeaf boundingLeaf) {
2 26 Feb 07 jari 42         super(new Alpha(1, 3000));
2 26 Feb 07 jari 43         this.target = target;
2 26 Feb 07 jari 44         setSchedulingBoundingLeaf(boundingLeaf);
2 26 Feb 07 jari 45     }
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47     public void setMinDistance(float distance) {
2 26 Feb 07 jari 48         this.min_distance = distance;
2 26 Feb 07 jari 49     }
2 26 Feb 07 jari 50
2 26 Feb 07 jari 51     public float getMinDistance() {
2 26 Feb 07 jari 52         return this.min_distance;
2 26 Feb 07 jari 53     }
2 26 Feb 07 jari 54
2 26 Feb 07 jari 55     public void initialize() {
2 26 Feb 07 jari 56         wakeupOn(new WakeupOnBehaviorPost(this, POST_ID));
2 26 Feb 07 jari 57     }
2 26 Feb 07 jari 58
2 26 Feb 07 jari 59     public void processStimulus(Enumeration enumeration) {
2 26 Feb 07 jari 60         Alpha alpha = getAlpha();
2 26 Feb 07 jari 61         doDrifting(alpha);
2 26 Feb 07 jari 62         if (alpha.finished()) {
2 26 Feb 07 jari 63             wakeupOn(new WakeupOnBehaviorPost(this, POST_ID));
2 26 Feb 07 jari 64         } else {
2 26 Feb 07 jari 65             wakeupOn(super.defaultWakeupCriterion);
2 26 Feb 07 jari 66         }
2 26 Feb 07 jari 67     }
2 26 Feb 07 jari 68
2 26 Feb 07 jari 69     public void drift(Point3d point, Vector3f normal) {
2 26 Feb 07 jari 70         Transform3D target_t3d = new Transform3D();
2 26 Feb 07 jari 71         this.target.getTransform(target_t3d);
2 26 Feb 07 jari 72         target_t3d.get(this.start_v3d);        // position
2 26 Feb 07 jari 73         Matrix3d scale_m3d = new Matrix3d();
2 26 Feb 07 jari 74         target_t3d.getRotationScale(scale_m3d);// rotation
2 26 Feb 07 jari 75         Vector3d z_normal = new Vector3d();
2 26 Feb 07 jari 76         scale_m3d.getColumn(2, z_normal);      // z normal
2 26 Feb 07 jari 77         this.start_up_v3d.set(-scale_m3d.m10/scale_m3d.m22, scale_m3d.m00/scale_m3d.m22, 0);
2 26 Feb 07 jari 78         this.start_up_v3d.normalize();         // up vector
2 26 Feb 07 jari 79         // sets a desired position
2 26 Feb 07 jari 80         this.lookat_p3d.set(point);
2 26 Feb 07 jari 81         this.finish_p3d.x = point.x + min_distance*normal.x;
2 26 Feb 07 jari 82         this.finish_p3d.y = point.y + min_distance*normal.y;
2 26 Feb 07 jari 83         this.finish_p3d.z = point.z + min_distance*normal.z;
2 26 Feb 07 jari 84         // init eye
2 26 Feb 07 jari 85         Transform3D eye_t3d = new Transform3D();
2 26 Feb 07 jari 86         Vector3d temp_v3d = new Vector3d(0, 0, -1);
2 26 Feb 07 jari 87         eye_t3d.set(temp_v3d);
2 26 Feb 07 jari 88         target_t3d.mul(eye_t3d);
2 26 Feb 07 jari 89         target_t3d.get(temp_v3d);
2 26 Feb 07 jari 90         this.start_eye_p3d.set(temp_v3d);
2 26 Feb 07 jari 91         // start the motion
2 26 Feb 07 jari 92         getAlpha().setStartTime(System.currentTimeMillis());
2 26 Feb 07 jari 93         postId(POST_ID);
2 26 Feb 07 jari 94     }
2 26 Feb 07 jari 95
2 26 Feb 07 jari 96     private void doDrifting(Alpha alpha) {
2 26 Feb 07 jari 97         Transform3D target_t3d = new Transform3D();
2 26 Feb 07 jari 98         this.target.getTransform(target_t3d);
2 26 Feb 07 jari 99
2 26 Feb 07 jari 100         move(target_t3d, alpha);
2 26 Feb 07 jari 101         rotate(target_t3d, alpha);
2 26 Feb 07 jari 102
2 26 Feb 07 jari 103         this.target.setTransform(target_t3d);
2 26 Feb 07 jari 104     }
2 26 Feb 07 jari 105
2 26 Feb 07 jari 106     private void move(Transform3D target_t3d, Alpha alpha) {
2 26 Feb 07 jari 107         // getting current direction
2 26 Feb 07 jari 108         Vector3d target_v3d = new Vector3d();
2 26 Feb 07 jari 109         target_t3d.get(target_v3d);
2 26 Feb 07 jari 110         Matrix3d scale_m3d = new Matrix3d();
2 26 Feb 07 jari 111         target_t3d.getRotationScale(scale_m3d);
2 26 Feb 07 jari 112         Vector3d finish_v3d = new Vector3d(this.finish_p3d);
2 26 Feb 07 jari 113         Matrix3d diff_m3d = new Matrix3d();
2 26 Feb 07 jari 114         diff_m3d.m00 = finish_v3d.x - target_v3d.x;
2 26 Feb 07 jari 115         diff_m3d.m10 = finish_v3d.y - target_v3d.y;
2 26 Feb 07 jari 116         diff_m3d.m20 = finish_v3d.z - target_v3d.z;
2 26 Feb 07 jari 117         scale_m3d.transpose();
2 26 Feb 07 jari 118         scale_m3d.mul(diff_m3d);
2 26 Feb 07 jari 119         Vector3d direction_v3d = new Vector3d();
2 26 Feb 07 jari 120         scale_m3d.getColumn(0, direction_v3d);
2 26 Feb 07 jari 121         double desired_distance = distance(this.start_v3d, finish_v3d)*(1-alpha.value());
2 26 Feb 07 jari 122         if (desired_distance < 0.000001)
2 26 Feb 07 jari 123             return;
2 26 Feb 07 jari 124         double current_distance = distance(target_v3d, finish_v3d);
2 26 Feb 07 jari 125         direction_v3d.scale(1-desired_distance/current_distance);
2 26 Feb 07 jari 126         Transform3D move_t3d = new Transform3D();
2 26 Feb 07 jari 127         move_t3d.set(direction_v3d);
2 26 Feb 07 jari 128         target_t3d.mul(move_t3d);
2 26 Feb 07 jari 129     }
2 26 Feb 07 jari 130
2 26 Feb 07 jari 131     private void rotate(Transform3D target_t3d, Alpha alpha) {
2 26 Feb 07 jari 132         Point3d diff_p3d = new Point3d();
2 26 Feb 07 jari 133         diff_p3d.sub(this.lookat_p3d, this.start_eye_p3d);
2 26 Feb 07 jari 134         diff_p3d.scale(alpha.value());
2 26 Feb 07 jari 135         Point3d curr_p3d = new Point3d();
2 26 Feb 07 jari 136         curr_p3d.add(this.start_eye_p3d, diff_p3d);
2 26 Feb 07 jari 137
2 26 Feb 07 jari 138         Matrix3d scale_m3d = new Matrix3d();
2 26 Feb 07 jari 139         target_t3d.getRotationScale(scale_m3d);
2 26 Feb 07 jari 140         double up_y = this.start_up_v3d.y+(1-this.start_up_v3d.y)*alpha.value();
2 26 Feb 07 jari 141         double up_x = Math.sqrt(1-up_y*up_y);
2 26 Feb 07 jari 142         up_x = (scale_m3d.m10 < 0 && scale_m3d.m22 < 0 || scale_m3d.m10 > 0 && scale_m3d.m22 > 0) ? -up_x : up_x;
2 26 Feb 07 jari 143         Vector3d up_v3d = new Vector3d(up_x, up_y, 0);
2 26 Feb 07 jari 144
2 26 Feb 07 jari 145         Vector3d current_v3d = new Vector3d();
2 26 Feb 07 jari 146         target_t3d.get(current_v3d);
2 26 Feb 07 jari 147         if (current_v3d.x == curr_p3d.x)
2 26 Feb 07 jari 148             curr_p3d.x -= 0.000001;
2 26 Feb 07 jari 149         if (current_v3d.y == curr_p3d.y)
2 26 Feb 07 jari 150             curr_p3d.y -= 0.000001;
2 26 Feb 07 jari 151         if (current_v3d.z == curr_p3d.z)
2 26 Feb 07 jari 152             curr_p3d.z -= 0.000001;
2 26 Feb 07 jari 153         Transform3D t3d = new Transform3D();
2 26 Feb 07 jari 154         t3d.lookAt(new Point3d(current_v3d), curr_p3d, up_v3d);
2 26 Feb 07 jari 155         t3d.invert();
2 26 Feb 07 jari 156         target_t3d.set(t3d);
2 26 Feb 07 jari 157     }
2 26 Feb 07 jari 158
2 26 Feb 07 jari 159     private final double distance(Vector3d v1, Vector3d v2) {
2 26 Feb 07 jari 160         double x = v1.x - v2.x;
2 26 Feb 07 jari 161         double y = v1.y - v2.y;
2 26 Feb 07 jari 162         double z = v1.z - v2.z;
2 26 Feb 07 jari 163         return Math.sqrt(x*x + y*y + z*z);
2 26 Feb 07 jari 164     }
2 26 Feb 07 jari 165 }