/** a vertex in the mesh */
public final class Vertex extends HasQuadric implements Visitor {
- public String toString() { return p.toString(); }
public Point p;
E e; // some edge *leaving* this point
vertices.add(this);
}
- private void glNormal(GL gl) {
- Vec norm = norm();
- gl.glNormal3f(norm.x, norm.y, norm.z);
+ public float oldscore = 0;
+ public void setScore(float nscore) {
+ score -= oldscore;
+ oldscore = nscore;
+ score += oldscore;
}
- public void _recomputeFundamentalQuadric() {
+ public Matrix _recomputeFundamentalQuadric() {
Matrix m = Matrix.ZERO;
int count = 0;
for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) {
- T t = e.t;
- m = m.plus(t.norm().fundamentalQuadric(t.centroid()));
+ m = m.plus(e.t.norm().fundamentalQuadric(e.t.centroid()));
count++;
}
- quadricStale = false;
- fundamentalQuadric = m.times(1/(float)count);
+ return m.times(1/(float)count);
}
- public void reComputeErrorAround() {
- reComputeError();
- if (nearest_in_other_mesh != null) nearest_in_other_mesh.reComputeError();
- for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
- e.p2.reComputeError();
- }
- public void reComputeError() {
- unComputeError();
- computeError();
- }
- public void unComputeError() {
- score -= oldscore;
- oldscore = 0;
- }
public HasQuadric nearest() {
if (score_against==null) return null;
return score_against.vertices.nearest(p, this);
}
+ public void unComputeError() { setScore(0); }
public void computeError() {
- oldscore =
+ float nscore =
quadric_count != 0
? (quadric.preAndPostMultiply(p) * 100) / quadric_count
- : immutableVertices
- ? oldscore
: nearest_in_other_mesh != null
? nearest_in_other_mesh.fundamentalQuadric().preAndPostMultiply(p) * 100 * 10
: score_against != null
double ang = Math.abs(e.crossAngle());
if (ang > Math.PI) throw new Error();
float minangle = (float)(Math.PI * 0.8);
- if (ang > minangle)
- oldscore += (ang - minangle);
+ if (ang > minangle) nscore += (ang - minangle);
}
- score += oldscore;
+ setScore(nscore);
}
private void removeTrianglesFromRTree() {
if (!ignorecollision && good) triangles.range(oldp, this.p, (Visitor<T>)this);
reComputeErrorAround();
+
return good;
}
+ public void reComputeErrorAround() {
+ reComputeError();
+ if (nearest_in_other_mesh != null) nearest_in_other_mesh.reComputeError();
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
+ e.p2.reComputeError();
+ }
+
public boolean visit(Object o) {
if (o instanceof T) {
T t = (T)o;
return null;
}
+ private void glNormal(GL gl) {
+ Vec norm = norm();
+ gl.glNormal3f(norm.x, norm.y, norm.z);
+ }
public Vec norm() {
Vec norm = new Vec(0, 0, 0);
for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)