private PointSet<Vertex> vertices = new PointSet<Vertex>();
public boolean immutableVertices;
- public boolean ignorecollision = false;
public Mesh error_against = null;
public double error = 0;
vertices.add(this);
}
+ public void reinsert() { vertices.remove(this); vertices.add(this); }
+
public float olderror = 0;
public void setError(float nerror) {
error -= olderror;
unApplyQuadricToNeighbor();
- if (vertices.get(this.p)==null) throw new Error();
- vertices.remove(this);
- for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
- if (e.t != null) e.t.removeFromRTree();
this.p = newp;
- for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next)
- if (e.t != null) e.t.addToRTree();
- vertices.add(this);
+ for(E e = this.e; e!=null; e=e.pair.next==this.e?null:e.pair.next) e.t.reinsert();
+ reinsert();
applyQuadricToNeighbor();
- good = true;
-
- if (!ignoreProblems)
- 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)) good = false;
- if (e.t.aspect() < 0.1) good = false;
- e.p2.quadricStale = true;
- }
-
- if (!ignorecollision && !ignoreProblems && good)
- triangles.range(oldp, this.p, (Visitor<T>)this);
+ if (ignoreProblems) return true;
+ good = true;
+ 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)) good = false;
+ if (e.t.aspect() < 0.1) good = false;
+ e.p2.quadricStale = true;
+ }
+ if (good) triangles.range(oldp, this.p, (Visitor<T>)this);
return good;
}
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) {
return ret;
}
-
/** [UNIQUE] a triangle (face) */
public final class T extends Triangle {
public final E e1;
public final int color;
public final int colorclass;
- public void removeFromRTree() { triangles.remove(this); }
- public void addToRTree() { triangles.insert(this); }
-
- public void destroy() { triangles.remove(this); }
-
T(E e1, int colorclass) {
this.e1 = e1;
E e2 = e1.next;
public boolean hasE(E e) { return e1==e || e1.next==e || e1.prev==e; }
public boolean has(Vertex v) { return v1()==v || v2()==v || v3()==v; }
+ public void removeFromRTree() { triangles.remove(this); }
+ public void addToRTree() { triangles.insert(this); }
+ public void destroy() { triangles.remove(this); }
+ public void reinsert() { triangles.remove(this); triangles.add(this); }
+
public boolean shouldBeDrawn() {
if (e1().bind_to.set.size() == 0) return false;
if (e2().bind_to.set.size() == 0) return false;
new com.infomatiq.jsi.rtree.RTree();
private int lowid = 0;
- private HashMap<Integer, V> idToV = new HashMap<Integer, V>();
- private HashMap<V, Integer> vToId = new HashMap<V, Integer>();
+ private HashMap<Integer, V> idToV = new HashMap<Integer, V>();
+ private HashMap<V, Integer> vToId = new HashMap<V, Integer>();
+ private HashMap<V, Rectangle> vToRect = new HashMap<V, Rectangle>();
public Iterator<V> iterator() { return vToId.keySet().iterator(); }
private final MyIntProcedure myIntProcedure = new MyIntProcedure();
- private final com.infomatiq.jsi.Rectangle rect = new com.infomatiq.jsi.Rectangle(0,0,0,0,0,0);
+ private final Rectangle rect = new Rectangle(0,0,0,0,0,0);
private final com.infomatiq.jsi.Point point = new com.infomatiq.jsi.Point(0,0,0);
private V found = null;
private Visitor<V> visitor = null;
public void clear() {
idToV.clear();
vToId.clear();
+ vToRect.clear();
rtree.init(props);
}
int id = lowid++;
idToV.put(id, v);
vToId.put(v, id);
- rect.set(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
+ Rectangle rect = new Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
rtree.add(rect, id);
+ vToRect.put(v, rect);
}
public void remove(V v) {
idToV.remove(id);
vToId.remove(v);
rect.set(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
- rtree.delete(rect, id);
+ rtree.delete(vToRect.get(v), id);
+ vToRect.remove(v);
}
public V nearest(Point p) { return nearest(p, null); }