+ public Matrix getConstraint() {
+ if (bindingGroup==null) return Matrix.ONE;
+ Matrix v = getBindingMatrix(getMaster());
+ return v.inverse().times(bindingGroup.krank).times(v);
+ }
+ public void setConstraint(Matrix m) {
+ if (bindingGroup==null) bindingGroup = new BindingGroup(this);
+ Matrix v = getBindingMatrix(getMaster());
+ bindingGroup.krank = bindingGroup.krank.times(v.inverse().times(m).times(v));
+ }
+
+ public void unbind() {
+ if (bindingGroup==null) return;
+ bindingGroup.unbind(this);
+ bindingGroup = null;
+ bindingGroupChanged(bindingGroup);
+ }
+
+ public boolean isBoundTo(HasBindingGroup t) {
+ return t==this || (bindingGroup!=null && bindingGroup.contains(t));
+ }
+
+ public Iterable getBoundPeers() {
+ if (bindingGroup==null) bindingGroup = new BindingGroup(this);
+ return bindingGroup;
+ }
+ public void bindingGroupChanged(BindingGroup newBindingGroup) { }