X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FVec.java;h=c601b15916069bad7e85bfc0b3447fcd0d1bb0a1;hp=c331d392fe78d981435822d43cc25e72cee62eed;hb=5f15a6155bf7fbf2d62b3ab9fd992a54af10a95a;hpb=965caa65c5048f85c4335fd4d0f962f8c5ae7012 diff --git a/src/edu/berkeley/qfat/geom/Vec.java b/src/edu/berkeley/qfat/geom/Vec.java index c331d39..c601b15 100644 --- a/src/edu/berkeley/qfat/geom/Vec.java +++ b/src/edu/berkeley/qfat/geom/Vec.java @@ -1,4 +1,5 @@ package edu.berkeley.qfat.geom; +import javax.media.opengl.*; /** vector in 3-space; immutable */ public final class Vec { @@ -8,11 +9,26 @@ public final class Vec { public Vec(Point p1, Point p2) { this(p2.x-p1.x, p2.y-p1.y, p2.z-p1.z); } 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); } public Vec plus(Vec v) { return new Vec(x+v.x, y+v.y, z+v.z); } + public Vec minus(Vec v) { return new Vec(x-v.x, y-v.y, z-v.z); } public Vec norm() { return mag()==0 ? this : div(mag()); } - public Vec times(Matrix m) { return m.apply(this); } public float mag() { return (float)Math.sqrt(x*x+y*y+z*z); } public float dot(Vec v) { return x*v.x + y*v.y + z*v.z; } public Vec times(float mag) { return new Vec(x*mag, y*mag, z*mag); } public Vec div(float mag) { return new Vec(x/mag, y/mag, z/mag); } public String toString() { return "<"+x+","+y+","+z+">"; } + public void glNormal(GL gl) { gl.glNormal3f(x, y, z); } + + /** fundamental error quadric for the plane with this normal passing through p */ + public Matrix fundamentalQuadric(Point p) { + Vec n = this; + if (mag() != 1) n = norm(); + float a = n.x; + float b = n.y; + float c = n.z; + float d = (-a * p.x) + (-b * p.y) + (-c * p.z); + return new Matrix(a*a, a*b, a*c, a*d, + a*b, b*b, b*c, b*d, + a*c, b*c, c*c, c*d, + a*d, b*d, c*d, d*d); + } }