X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FBindingGroup.java;h=0c3049ff70b3ffdde0bac1010435a40c0db47ba5;hp=ca07312ad88e317eab2cb207b78ab7de3c855306;hb=30607e6bf4827d90fc055c8db1e7f363ef2693e6;hpb=bebc4007cb48fe93ca03f97047d3445a881afe9e diff --git a/src/edu/berkeley/qfat/geom/BindingGroup.java b/src/edu/berkeley/qfat/geom/BindingGroup.java index ca07312..0c3049f 100644 --- a/src/edu/berkeley/qfat/geom/BindingGroup.java +++ b/src/edu/berkeley/qfat/geom/BindingGroup.java @@ -2,7 +2,9 @@ package edu.berkeley.qfat.geom; import javax.media.opengl.*; import java.util.*; -public class BindingGroup { +public class BindingGroup implements Iterable { + + public Matrix krank = Matrix.ONE; private T master = null; private HashMap matrices = new HashMap(); @@ -12,24 +14,65 @@ public class BindingGroup { matrices.put(master, Matrix.ONE); } + 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(); 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)); + + HashSet stuff = new HashSet(); + for(HasBindingGroup hbg : bg.matrices.keySet()) + stuff.add(hbg); bg.matrices.clear(); bg.master = null; + for(HasBindingGroup hbg : stuff) + hbg.bindingGroupChanged(this); } public T getMaster() { return master; } public Matrix getMatrix(T t) { return matrices.get(t); } - // t1 = getMatrix(t1) * master - // getMatrix(t2)^-1 * t2 = master - // t1 = getMatrix(t1) * getMatrix(t2)^-1 * t2 + public Iterator iterator() { return matrices.keySet().iterator(); } + /** t1 = getMatrix(t1, t2) * t2 */ public Matrix getMatrix(T t1, T t2) { + // t1 = getMatrix(t1) * master + // getMatrix(t2)^-1 * t2 = master + // t1 = getMatrix(t1) * getMatrix(t2)^-1 * t2 return getMatrix(t1).times(getMatrix(t2).inverse()); } + public void unbind(T trem) { + if (trem != master) { + matrices.remove(trem); + return; + } + if (matrices.size()==1) { + master = null; + matrices.remove(trem); + return; + } + Iterator it = iterator(); + T newmaster = it.next(); + if (newmaster==trem) newmaster = it.next(); + if (newmaster==trem) throw new Error(); + HashMap newmatrices = new HashMap(); + for(T t : matrices.keySet()) { + if (t==trem) continue; + newmatrices.put(t, getMatrix(t, newmaster)); + } + master = newmaster; + matrices = newmatrices; + } + + public boolean contains(HasBindingGroup t) { + return matrices.get((T)t) != null; + } }