checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / Point.java
index d54e631..bb149be 100644 (file)
@@ -1,19 +1,45 @@
 package edu.berkeley.qfat.geom;
 import javax.media.opengl.*;
+import javax.media.opengl.glu.*;
 
 /** point in 3-space; immutable */
-public final class Point {
+public final class Point extends HasPoint implements HasBoundingBox, AffineConstraint {
+
+    public static final Point ZERO = new Point(0,0,0);
+
     public final float x, y, z;
+
     public Point(double x, double y, double z) { this((float)x, (float)y, (float)z); }
     public Point(float x, float y, float z) { this.x = x; this.y = y; this.z = z; }
-    public float distance(Point p) { return distance(p.x, p.y, p.z); }
-    public float distance(float ox, float oy, float oz) { return (float)Math.sqrt((x-ox)*(x-ox)+(y-oy)*(y-oy)+(z-oz)*(z-oz)); }
-    public Point times(Matrix m) { return m.times(this); }
+
+    public float distance(Point p) { return (float)Math.sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z)); }
+
     public Vec minus(Point p) { return new Vec(x-p.x, y-p.y, z-p.z); }
     public Point plus(Vec v) { return new Point(x+v.x, y+v.y, z+v.z); }
-    public boolean equals(Object o) { return o!=null && (o instanceof Point) && ((Point)o).x==x && ((Point)o).y==y && ((Point)o).z==z; }
-    public void glVertex(GL gl) { _glVertex(gl); }
-    private void _glVertex(GL gl) { gl.glVertex3f(x, y, z); }
+    public Point midpoint(Point p) { return new Point((x+p.x)/2, (y+p.y)/2, (z+p.z)/2); }
+
+    public void glVertex(GL gl) { gl.glVertex3f(x, y, z); }
+
     public String toString() { return "("+x+","+y+","+z+")"; }
+
+    public boolean equals(Object o) { return o!=null && (o instanceof Point) && ((Point)o).x==x && ((Point)o).y==y && ((Point)o).z==z; }
     public int hashCode() { return Float.floatToIntBits(x) ^ Float.floatToIntBits(y) ^ Float.floatToIntBits(z); }
+
+    public Point getPoint() { return this; }
+
+    public float getMaxX() { return x; }
+    public float getMinX() { return x; }
+    public float getMaxY() { return y; }
+    public float getMinY() { return y; }
+    public float getMaxZ() { return z; }
+    public float getMinZ() { return z; }
+
+    public Point getProjection(Point p) { return this; }
+    public AffineConstraint intersect(AffineConstraint c, float epsilon) {
+        if (c.getProjection(this).distance(this) <= epsilon) return this;
+        System.err.println("off by: " + c.getProjection(this).distance(this));
+        return new AffineConstraint.Nothing();
+    }
+    public AffineConstraint multiply(Matrix m) { return m.times(this); }
 }
+