X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FHasBindingGroup.java;h=d884672ac7109bb0b1ebbca9c5805593dd4bb212;hp=1c3737a808677ef23a28811a684d3d4ccddb0933;hb=5f15a6155bf7fbf2d62b3ab9fd992a54af10a95a;hpb=de98420094a537a70140842ff185e6d113ad270e diff --git a/src/edu/berkeley/qfat/geom/HasBindingGroup.java b/src/edu/berkeley/qfat/geom/HasBindingGroup.java index 1c3737a..d884672 100644 --- a/src/edu/berkeley/qfat/geom/HasBindingGroup.java +++ b/src/edu/berkeley/qfat/geom/HasBindingGroup.java @@ -4,7 +4,7 @@ import java.util.*; public abstract class HasBindingGroup { - BindingGroup bindingGroup; + public BindingGroup bindingGroup; // know: self = bindingGroup[self] * master // know: other = other.bindingGroup[other] * other.bindingGroup.master @@ -16,22 +16,53 @@ public abstract class HasBindingGroup { if (other.bindingGroup == null) other.bindingGroup = new BindingGroup(other); if (other.bindingGroup == this.bindingGroup) { - if (bindingGroup.getMatrix(other).equals(Matrix.ONE)) return; - throw new Error("rebind attempt with " + bindingGroup.getMatrix(other)); + if (getBindingMatrix(other).equals(bindingMatrix)) + return; + /* + throw new Error("rebind attempt: "+this+" and "+other+" with " + + bindingMatrix + + "; expected " + + getBindingMatrix(other)); + */ + Matrix vom = other.getBindingMatrix(bindingGroup.getMaster()); + Matrix v2 = bindingMatrix; + Matrix v3 = getBindingMatrix(other); + Matrix m = vom.inverse().times(v2.inverse()).times(v3).times(vom); + bindingGroup.krank = bindingGroup.krank.times(m); + /* + System.err.println("WARNING: discarding rebind attempt: "+this+" and "+other+m); + */ + //" with " + //+ bindingMatrix + //+ "; expected " + //+ getBindingMatrix(other)); + return; } + bindingMatrix = - getBindingMatrix() + getBindingMatrix().inverse() .times(bindingMatrix) .times(other.getBindingMatrix()); other.bindingGroup.merge(bindingGroup, bindingMatrix); } + public int bindingGroupSize() { + if (bindingGroup == null) return 1; + return bindingGroup.size(); + } + + public Matrix getBindingMatrix() { if (bindingGroup==null) return Matrix.ONE; return bindingGroup.getMatrix(this); } + public Matrix getBindingMatrix(HasBindingGroup other) { + if (other==this) return Matrix.ONE; + return bindingGroup.getMatrix(this, other); + } + public HasBindingGroup getMaster() { if (bindingGroup==null) return this; return bindingGroup.getMaster(); @@ -41,11 +72,16 @@ public abstract class HasBindingGroup { if (bindingGroup==null) return; bindingGroup.unbind(this); bindingGroup = null; + bindingGroupChanged(bindingGroup); } public boolean isBoundTo(HasBindingGroup t) { - return bindingGroup.contains(t); + return t==this || (bindingGroup!=null && bindingGroup.contains(t)); } - public Iterable getBoundPeers() { return bindingGroup; } + public Iterable getBoundPeers() { + if (bindingGroup==null) bindingGroup = new BindingGroup(this); + return bindingGroup; + } + public void bindingGroupChanged(BindingGroup newBindingGroup) { } }