private static final float epsilon2 = (float)0.001;
private static final boolean debug = false;
- private Vector triangles = new Vector();
- private Hash edges = new Hash();
+ private Vector triangles = new Vector(); /* we no longer need this */
+ private Hash edges = new Hash(); /* we no longer need this either */
private int numvertices = 0;
private Triangle triangle0 = null;
private Vertex vertex0 = null;
public void add(Mesh m, Affine a) { iterateTriangles(ITERATE_ADD, m, a); }
public static long seekTime = 0;
- public static final int ITERATE_SUBTRACT = 1;
- public static final int ITERATE_INTERSECT = 2;
- public static final int ITERATE_ADD = 3;
+ public static final int ITERATE_SUBTRACT = 1;
+ public static final int ITERATE_INTERSECT = 2;
+ public static final int ITERATE_ADD = 3;
+ public static final int ITERATE_CLEAR_WASSET = 4;
+ public static final int ITERATE_CLEAR = 5;
+ public static final int ITERATE_STROKE = 6;
int tick = 0;
Triangle[] iter = new Triangle[100];
- private void iterateTriangles(int mode, Mesh m, Affine a) {
+ private void iterateTriangles(int mode, Mesh m, Affine a) { iterateTriangles(mode, m, a, null, 0); }
+ private void iterateTriangles(int mode, Mesh m, Affine a, PixelBuffer buf, int color) {
tick++;
int numiter = 0;
if (iter.length < triangles.size()) iter = new Triangle[triangles.size()];
Triangle t = iter[--numiter];
if (t.tick >= this.tick) continue;
switch(mode) {
+ case ITERATE_STROKE: t.stroke(buf, a, color); break;
+ case ITERATE_CLEAR: t.clear(); break;
+ case ITERATE_CLEAR_WASSET: t.inWasSet = false; break;
case ITERATE_INTERSECT:
case ITERATE_SUBTRACT: {
if (!t.in) break;
// Edge //////////////////////////////////////////////////////////////////////////////
public Edge newEdge(Vertex v1, Vertex v2) {
+ return getEdge(v1,v2);
+ /*
if (v1==v2) throw new Error();
Edge ret = (Edge)edges.get(v1,v2);
+ //if (ret != null) throw new Error("tried to get an edge that already exists!");
if (ret == null) ret = new Edge(v1,v2);
return ret;
}
public boolean hasVertex(Vertex v) { return v1==v || v2==v; }
public boolean hasTriangle(Triangle t) { return t==t1 || t==t2; }
public String toString() { return v(1) + "--" + v(2); }
- public void rmTriangle(Triangle t) { if (t1==t) t1 = null; else if (t2==t) t2 = null; else throw new Error(); }
+ public void rmTriangle(Triangle t) {
+ if (t1==t) t1 = null;
+ else if (t2==t) t2 = null;
+ else throw new Error();
+ if (t1==null && t2==null) delete();
+ }
public boolean convex() { return this.intersects(t1.opposingVertex(t2), t2.opposingVertex(t1)); }
public boolean colinear(Point v) { return area(v,v1,v2)<=epsilon; }
// Drawing //////////////////////////////////////////////////////////////////////////////
public void setIn(boolean evenOdd) {
- for (int i=0; i<triangles.size(); i++) ((Triangle)triangles.elementAt(i)).inWasSet = false;
+ iterateTriangles(ITERATE_CLEAR_WASSET, null, null);
triangle0.setIn(evenOdd, 1);
}
public void fill(PixelBuffer buf, Affine a, Mesh.Chain clip, int color, boolean strokeOnly) {
if (triangle0==null) return;
- System.out.println("I have " + triangles.size() + " triangles");
- for (int i=0; i<triangles.size(); i++) ((Triangle)triangles.elementAt(i)).clear();
+ iterateTriangles(ITERATE_CLEAR, null, null);
triangle0.fill(buf, a, clip, color, strokeOnly);
}
public void stroke(PixelBuffer buf, Affine a, int color) {
if (triangle0==null) return;
- for (int i=0; i<triangles.size(); i++) ((Triangle)triangles.elementAt(i)).stroke(buf, a, color);
+ iterateTriangles(ITERATE_STROKE, null, a, buf, color);
}
public void newcontour() {