checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / Triangle.java
index 9d16661..fece872 100644 (file)
@@ -44,13 +44,40 @@ public abstract class Triangle implements HasBoundingBox {
     }
 
     /** ratio of the area of the triangle to that of the square formed from its longest edge */
+    /*
     public float aspect() {
         float max = Math.max(Math.max(p1().distance(p2()),
                                       p2().distance(p3())),
                              p3().distance(p1())) / 2;
         return 1/(1+area()/(max*max));
     }
+    */
 
+    public float circumcircleRadius() {
+        double a = p1().distance(p2());
+        double b = p2().distance(p3());
+        double c = p3().distance(p1());
+        return (float)((a*b*c)/Math.sqrt((a+b+c)*(b+c-a)*(c+a-b)*(a+b-c)));
+    }
+
+    public float shortestEdgeLength() {
+        float a = p1().distance(p2());
+        float b = p2().distance(p3());
+        float c = p3().distance(p1());
+        return Math.min(a, Math.min(b,c));
+    }
+
+    /** a number ranging from 0..1 with 0 being lower quality */
+    public float quality() {
+        float d = shortestEdgeLength();
+        float r = circumcircleRadius();
+        if (r==0) throw new Error();
+        float ret = (float)((d*Math.cos(Math.PI/6))/(r*2));
+        if (ret < 0 || ret > 1) throw new Error("ret="+ret);
+        return ret;
+    }
+
+    // FIXME: I stole this off the net, and I need to credit whoever wrote it
     /** decide if the segment from p1-p2 intersects this triangle */
     public boolean intersects(Point p1, Point p2) {
         double A0=p1().x, A1=p1().y, A2=p1().z;