public static Random random = new Random();
private PointSet<Vert> pointset = new PointSet<Vert>();
- public Vert nearest(Point p) { return pointset.nearest(p); }
+
+ public Iterable<Vert> vertices() { return pointset; }
public Iterable<E> edges() {
return
return new FaceIterator();
}
- public Point origin() { return new Point(0, 0, 0); }
-
public Mesh score_against = null;
public double score = 0;
public float score() { return (float)score; }
for(Vert v : set) v.transform(m);
}
- public Vec diagonal() { return pointset.diagonal(); }
- public Point centroid() { return pointset.centroid(); }
-
public float volume() {
double total = 0;
for(T t : this) {
}
}
+ public Vec diagonal() { return pointset.diagonal(); }
+ public Point centroid() { return pointset.centroid(); }
+ public Vert nearest(Point p) { return pointset.nearest(p); }
+
public Vert register(Point p) { Vert v = pointset.get(p); return v==null ? new Vert(p) : v; }
public final class Vert extends HasPoint {
public Point p;
/** [UNIQUE] an edge */
public final class E implements Comparable<E> {
- public boolean intersects(T t) {
- double A0=t.v1().p.x, A1=t.v1().p.y, A2=t.v1().p.z;
- double B0=t.v2().p.x, B1=t.v2().p.y, B2=t.v2().p.z;
- double C0=t.v3().p.x, C1=t.v3().p.y, C2=t.v3().p.z;
- double j0=p1.p.x, j1=p1.p.y, j2=p1.p.z;
- double k0=p2.p.x, k1=p2.p.y, k2=p2.p.z;
- double J0, J1, J2;
- double K0, K1, K2;
- double i0, i1, i2;
- double a0, a1, a2;
- double b0, b1, b2;
- double c0, c1, c2;
- double in_det;
- double R00, R01, R02, R03,
- R10, R11, R12, R13,
- R20, R21, R22, R23,
- R30, R31, R32, R33;
-
-
- /* a = B - A */
- a0 = B0 - A0;
- a1 = B1 - A1;
- a2 = B2 - A2;
- /* b = C - B */
- b0 = C0 - A0;
- b1 = C1 - A1;
- b2 = C2 - A2;
- /* c = a × b */
- c0 = a1 * b2 - a2 * b1;
- c1 = a2 * b0 - a0 * b2;
- c2 = a0 * b1 - a1 * b0;
-
- /* M^(-1) = (1/det(M)) * adj(M) */
- in_det = 1 / (c0 * c0 + c1 * c1 + c2 * c2);
- R00 = (b1 * c2 - b2 * c1) * in_det;
- R01 = (b2 * c0 - b0 * c2) * in_det;
- R02 = (b0 * c1 - b1 * c0) * in_det;
- R10 = (c1 * a2 - c2 * a1) * in_det;
- R11 = (c2 * a0 - c0 * a2) * in_det;
- R12 = (c0 * a1 - c1 * a0) * in_det;
- R20 = (c0) * in_det;
- R21 = (c1) * in_det;
- R22 = (c2) * in_det;
-
- /* O = M^(-1) * A */
- R03 = -(R00 * A0 + R01 * A1 + R02 * A2);
- R13 = -(R10 * A0 + R11 * A1 + R12 * A2);
- R23 = -(R20 * A0 + R21 * A1 + R22 * A2);
-
- /* fill in last row of 4x4 matrix */
- R30 = R31 = R32 = 0;
- R33 = 1;
-
- J2 = R20 * j0 + R21 * j1 + R22 * j2 + R23;
- K2 = R20 * k0 + R21 * k1 + R22 * k2 + R23;
- if (J2 * K2 >= 0) return false;
-
- J0 = R00 * j0 + R01 * j1 + R02 * j2 + R03;
- K0 = R00 * k0 + R01 * k1 + R02 * k2 + R03;
- i0 = J0 + J2 * ((K0 - J0) / (J2 - K2));
- if (i0 < 0 || i0 > 1) return false;
-
- J1 = R10 * j0 + R11 * j1 + R12 * j2 + R13;
- K1 = R10 * k0 + R11 * k1 + R12 * k2 + R13;
- i1 = J1 + J2 * ((K1 - J1) / (J2 - K2));
- if (i1 < 0 || i1 > 1 || i0 + i1 > 1) return false;
-
- return true;
- }
-
- public int compareTo(E e) {
- return e.length() > length() ? 1 : -1;
- }
-
public final Vert p1, p2;
T t; // triangle to our "left"
E prev; // previous half-edge
E next; // next half-edge
E pair; // partner half-edge
-
-
public BindingGroup bg = new BindingGroup(this);
+ public int compareTo(E e) { return e.length() > length() ? 1 : -1; }
+
public void bind(E e) { bind(e, new Matrix()); }
public void bind(E e, Matrix m) { e.bg.add(this); }
public boolean has(Vert v) { return v==p1 || v==p2; }
public float length() { return p1.p.minus(p2.p).mag(); }
public String toString() { return p1+"->"+p2; }
+
+ public boolean intersects(T t) {
+ double A0=t.v1().p.x, A1=t.v1().p.y, A2=t.v1().p.z;
+ double B0=t.v2().p.x, B1=t.v2().p.y, B2=t.v2().p.z;
+ double C0=t.v3().p.x, C1=t.v3().p.y, C2=t.v3().p.z;
+ double j0=p1.p.x, j1=p1.p.y, j2=p1.p.z;
+ double k0=p2.p.x, k1=p2.p.y, k2=p2.p.z;
+ double J0, J1, J2;
+ double K0, K1, K2;
+ double i0, i1, i2;
+ double a0, a1, a2;
+ double b0, b1, b2;
+ double c0, c1, c2;
+ double in_det;
+ double R00, R01, R02, R03,
+ R10, R11, R12, R13,
+ R20, R21, R22, R23,
+ R30, R31, R32, R33;
+
+
+ /* a = B - A */
+ a0 = B0 - A0;
+ a1 = B1 - A1;
+ a2 = B2 - A2;
+ /* b = C - B */
+ b0 = C0 - A0;
+ b1 = C1 - A1;
+ b2 = C2 - A2;
+ /* c = a × b */
+ c0 = a1 * b2 - a2 * b1;
+ c1 = a2 * b0 - a0 * b2;
+ c2 = a0 * b1 - a1 * b0;
+
+ /* M^(-1) = (1/det(M)) * adj(M) */
+ in_det = 1 / (c0 * c0 + c1 * c1 + c2 * c2);
+ R00 = (b1 * c2 - b2 * c1) * in_det;
+ R01 = (b2 * c0 - b0 * c2) * in_det;
+ R02 = (b0 * c1 - b1 * c0) * in_det;
+ R10 = (c1 * a2 - c2 * a1) * in_det;
+ R11 = (c2 * a0 - c0 * a2) * in_det;
+ R12 = (c0 * a1 - c1 * a0) * in_det;
+ R20 = (c0) * in_det;
+ R21 = (c1) * in_det;
+ R22 = (c2) * in_det;
+
+ /* O = M^(-1) * A */
+ R03 = -(R00 * A0 + R01 * A1 + R02 * A2);
+ R13 = -(R10 * A0 + R11 * A1 + R12 * A2);
+ R23 = -(R20 * A0 + R21 * A1 + R22 * A2);
+
+ /* fill in last row of 4x4 matrix */
+ R30 = R31 = R32 = 0;
+ R33 = 1;
+
+ J2 = R20 * j0 + R21 * j1 + R22 * j2 + R23;
+ K2 = R20 * k0 + R21 * k1 + R22 * k2 + R23;
+ if (J2 * K2 >= 0) return false;
+
+ J0 = R00 * j0 + R01 * j1 + R02 * j2 + R03;
+ K0 = R00 * k0 + R01 * k1 + R02 * k2 + R03;
+ i0 = J0 + J2 * ((K0 - J0) / (J2 - K2));
+ if (i0 < 0 || i0 > 1) return false;
+
+ J1 = R10 * j0 + R11 * j1 + R12 * j2 + R13;
+ K1 = R10 * k0 + R11 * k1 + R12 * k2 + R13;
+ i1 = J1 + J2 * ((K1 - J1) / (J2 - K2));
+ if (i1 < 0 || i1 > 1 || i0 + i1 > 1) return false;
+
+ return true;
+ }
}
+ public T newT(Point p1, Point p2, Point p3, Vec norm) { return newT(register(p1), register(p2), register(p3), norm); }
public T newT(Vert p1, Vert p2, Vert p3, Vec norm) {
if (norm != null) {
Vec norm2 = p3.p.minus(p1.p).cross(p2.p.minus(p1.p));