X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMesh.java;h=babad37acb604937337d81c0d48a01ba3bd6a367;hp=3da4835a80416402374799f13cf1de5fb081f445;hb=0525dcc815af1e875699147e9f203969eeae723d;hpb=9c8449ec3a4e9a70399bbcb5cfeadea9dc18a646 diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index 3da4835..babad37 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -104,6 +104,25 @@ public class Mesh implements Iterable { error += olderror; } + public float averageTriangleArea() { + int count = 0; + float ret = 0; + for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) { + ret += e.t.area(); + count++; + } + return ret/count; + } + public float averageEdgeLength() { + int count = 0; + float ret = 0; + for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) { + ret += e.length(); + count++; + } + return ret/count; + } + public Matrix _recomputeFundamentalQuadric() { Matrix m = Matrix.ZERO; int count = 0; @@ -116,19 +135,23 @@ public class Mesh implements Iterable { public HasQuadric nearest() { return error_against==null ? null : error_against.vertices.nearest(p, this); } public void computeError() { + if (error_against==null) return; float nerror = quadric_count != 0 - ? (quadric.preAndPostMultiply(p) * 100) / quadric_count + ? (quadric.preAndPostMultiply(p) * 100)/quadric_count : nearest_in_other_mesh != null - ? nearest_in_other_mesh.fundamentalQuadric().preAndPostMultiply(p) * 100 * 10 - : error_against != null - ? nearest().fundamentalQuadric().preAndPostMultiply(p) * 100 * 10 - : 0; + ? nearest_in_other_mesh.fundamentalQuadric().preAndPostMultiply(p) * 100 + : nearest().fundamentalQuadric().preAndPostMultiply(p) * 100; for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) { double ang = Math.abs(e.crossAngle()); if (ang > Math.PI) throw new Error(); float minangle = (float)(Math.PI * 0.8); if (ang > minangle) nerror += (ang - minangle); + /* + if (e.t.aspect() < 0.2) { + nerror += (0.2-e.t.aspect()) * 300; + } + */ } setError(nerror); } @@ -143,20 +166,21 @@ public class Mesh implements Iterable { reinsert(); applyQuadricToNeighbor(); - if (ignoreProblems) return true; - - illegal = false; - checkLegality(); + if (!ignoreProblems) { + illegal = false; + checkLegality(); + } + for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) e.p2.quadricStale = true; return !illegal; } public void checkLegality() { for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) { - if (Math.abs(e.crossAngle()) > (Math.PI * 0.9) || Math.abs(e.next.crossAngle()) > (Math.PI * 0.9)) illegal = true; - if (e.t.aspect() < 0.1) illegal = true; - e.p2.quadricStale = true; + if (Math.abs(e.crossAngle()) > (Math.PI * 0.9) || + Math.abs(e.next.crossAngle()) > (Math.PI * 0.9)) illegal = true; + //if (e.t.aspect() < 0.1) illegal = true; } - if (illegal) triangles.range(oldp, this.p, (Visitor)this); + if (!illegal) triangles.range(oldp, this.p, (Visitor)this); } public void reComputeErrorAround() { @@ -305,8 +329,18 @@ public class Mesh implements Iterable { public boolean intersects(T t) { return t.intersects(p1.p, p2.p); } public float comparator() { + /* Vertex nearest = error_against.nearest(midpoint()); - return (float)Math.max(length(), midpoint().distance(nearest.p)); + //return (float)Math.max(length(), midpoint().distance(nearest.p)); + //return length(); + float nearest_distance = midpoint().distance(nearest.p); + float other_distance = + (p1.p.distance(error_against.nearest(p1.p).p)+ + p2.p.distance(error_against.nearest(p2.p).p))/2; + return nearest_distance/other_distance; + */ + //return length(); + return t==null?0:(1/t.aspect()); } public int compareTo(E e) { return e.comparator() > comparator() ? 1 : -1;