X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FBindingGroup.java;h=34259abd7b6fd5f57bd42985c5811f97d2535d22;hp=4c2d114de3ca4e584bd6e553a3a4cb1cd7695261;hb=eabe4f7acd947415f183290dc3269b2502a25a1c;hpb=de2400d58116bd995e73baf7a429e22def1e4067 diff --git a/src/edu/berkeley/qfat/geom/BindingGroup.java b/src/edu/berkeley/qfat/geom/BindingGroup.java index 4c2d114..34259ab 100644 --- a/src/edu/berkeley/qfat/geom/BindingGroup.java +++ b/src/edu/berkeley/qfat/geom/BindingGroup.java @@ -5,10 +5,9 @@ import java.util.*; /** tracks an equivalence class of geometric objects which are related to each other by transformation matrices */ public class BindingGroup implements Iterable { - public Matrix krank = Matrix.ONE; - - private T master = null; - private HashMap matrices = new HashMap(); + private T master = null; + private AffineConstraint constraint = new AffineConstraint.All(); + private HashMap matrices = new HashMap(); public BindingGroup(T master) { this.master = master; @@ -17,16 +16,21 @@ public class BindingGroup implements Iterable { public int size() { return matrices.size(); } - public void setKrank(Matrix k) { krank = krank.times(k); } public void merge(BindingGroup bg, Matrix m) { - if (bg==this) throw new Error(); + if (bg==this) { + if (m.equalsModuloEpsilon(Matrix.ONE, 0.001f)) return; + constraint = constraint.intersect(m.getAffineConstraint(0.001f), 0.001f); + return; + } + for(HasBindingGroup hbg : bg.matrices.keySet()) { matrices.put((T)hbg, bg.matrices.get(hbg).times(m)); hbg.bindingGroup = this; } - Matrix v = getMatrix(bg.master, master); - //krank = krank.times(v.inverse().times(bg.krank).times(v)); + // FIXME: what if points do not fall on the merged constraint-line? + AffineConstraint ac = bg.constraint.multiply(getMatrix(master, bg.master)); + constraint = constraint.intersect(ac, 0.001f); HashSet stuff = new HashSet(); for(HasBindingGroup hbg : bg.matrices.keySet()) @@ -49,6 +53,10 @@ public class BindingGroup implements Iterable { return getMatrix(t1).times(getMatrix(t2).inverse()); } + public AffineConstraint getConstraint(T t) { + return constraint.multiply(matrices.get(t)); + } + public void unbind(T trem) { if (trem != master) { matrices.remove(trem);