checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / Vec.java
1 package edu.berkeley.qfat.geom;
2 import javax.media.opengl.*;
3 import javax.media.opengl.glu.*;
4
5 /** vector in 3-space; immutable */
6 public final class Vec {
7
8     public static final Vec ZERO = new Vec(0,0,0);
9
10     public final float x, y, z;
11     public Vec(double x, double y, double z) { this((float)x, (float)y, (float)z); }
12     public Vec(float x, float y, float z) { this.x = x; this.y = y; this.z = z; }
13     public Vec(Point p1, Point p2) { this(p2.x-p1.x, p2.y-p1.y, p2.z-p1.z); }
14     public Vec cross(Vec v) { return new Vec(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x); }
15     public Vec plus(Vec v) { return new Vec(x+v.x, y+v.y, z+v.z); }
16     public Point plus(Point p) { return p.plus(this); }
17     public Vec minus(Vec v) { return new Vec(x-v.x, y-v.y, z-v.z); }
18     public Vec norm() { return mag()==0 ? this : div(mag()); }
19     public float mag() { return (float)Math.sqrt(x*x+y*y+z*z); }
20     public float dot(Vec v) { return x*v.x + y*v.y + z*v.z; }
21     public Vec times(float mag) { return new Vec(x*mag, y*mag, z*mag); }
22     public Vec div(float mag) { return new Vec(x/mag, y/mag, z/mag); }
23     public String toString() { return "<"+x+","+y+","+z+">"; }
24     public void glNormal(GL gl) { gl.glNormal3f(x, y, z); }
25
26     /** fundamental error quadric for the plane with this normal passing through p */
27     public Matrix fundamentalQuadric(Point p) {
28         Vec n = this;
29         if (mag() != 1) n = norm();
30         float a = n.x;
31         float b = n.y;
32         float c = n.z;
33         float d = (-a * p.x) + (-b * p.y) + (-c * p.z);
34         return new Matrix(a*a, a*b, a*c, a*d,
35                           a*b, b*b, b*c, b*d,
36                           a*c, b*c, c*c, c*d,
37                           a*d, b*d, c*d, d*d);
38     }
39 }