anchor.diff:          elems = new List<Elem>.generate(x*y, (int _) => new Elem(0));
       }
   
  -    Elem getElem(int xi, int yi) {
  -        return elems[yi*x + xi];
  -    }
  -
  -    void setElem(int xi, int yi, Elem e) {
  -       elems[yi*x + xi] = e;
  +    Elem getElem(GridPoint p) {
  +        return elems[p.y*x + p.x];
  +    }
  +
  +    void setElem(GridPoint p, Elem e) {
  +       elems[p.y*x + p.x] = e;
       }
   
       void incElem(int xi, int yi, int lvl) {
  
positive.code:     void addItem(num x, num y) {
          GridPoint sq = getGridCoords(x,y);
  
          if (sq == null) {
              return;
          }
  
          if (!grid.getElem(sq.x, sq.y).isEmpty()) {
              return;
          }
  
          updateElem(sq.x, sq.y, 1);
      }
  
  }
  
  void main() {
  
negative.code:         var y = boxBorderSize + (p.y*stepSizeY);
          ctx.fillRect(x, y, boxDimX, boxDimY);
  
          var elem = grid.getElem(p);
          if (!elem.isEmpty()) {
              x += boxDimX/2;
              y += boxDimY/2;
  