+ private int wishes = 0;
+ private Point wish = Point.ZERO;
+ public void clearWish() { wishes = 0; wish = Point.ZERO; }
+ public void wish(HasPoint hp) {
+ Point p = hp.getPoint();
+ wishes++;
+ wish = new Point(wish.x+p.x, wish.y+p.y, wish.z+p.z);
+ }
+ public void grantWish() {
+ for(Vertex v : (Iterable<Vertex>)getBoundPeers()) {
+ if (v==this) continue;
+ if (v.wishes==0) continue;
+ Point p = this.getBindingMatrix(v).times(v.wish.minus(Point.ZERO).div(v.wishes).plus(Point.ZERO));
+ wish = p.minus(Point.ZERO).times(v.wishes).plus(wish);
+ wishes += v.wishes;
+ v.clearWish();
+ }
+ if (wishes==0) return;
+ Vec d = wish.minus(Point.ZERO).div(wishes).plus(Point.ZERO).minus(getPoint());
+ move(d, false);
+ clearWish();
+ }
+ public void avgWish() {
+ if (wishes==0) return;
+ wish = wish.minus(Point.ZERO).div(wishes).plus(Point.ZERO);
+ wishes = 1;
+ }
+