code: function (ax, ay, bx, by, cx, cy, dx, dy) {
          var tobx = bx - ax;
          var toby = by - ay;
          var tocx = cx - bx;
          var tocy = cy - by;
          var todx = dx - cx;
          var tody = dy - cy;
          var precision = 40;
          var d, i, px, py, qx, qy, rx, ry, tx, ty, sx, sy, x, y, minx, miny, maxx, maxy, toqx, toqy, torx, tory, totx, toty;
          for (i = 0; i < (precision + 1); i++) {
              d = i / precision;
              px = ax + d * tobx;
              py = ay + d * toby;
              qx = bx + d * tocx;
              qy = by + d * tocy;
              rx = cx + d * todx;
              ry = cy + d * tody;
              toqx = qx - px;
              toqy = qy - py;
              torx = rx - qx;
              tory = ry - qy;
  
              sx = px + d * toqx;
              sy = py + d * toqy;
              tx = qx + d * torx;
              ty = qy + d * tory;
              totx = tx - sx;
              toty = ty - sy;
  
              x = sx + d * totx;
              y = sy + d * toty;
              if (i == 0) {
                  minx = x;
                  miny = y;
                  maxx = x;
                  maxy = y;
              } else {
                  minx = Math.min(minx, x);
                  miny = Math.min(miny, y);
                  maxx = Math.max(maxx, x);
                  maxy = Math.max(maxy, y);
              }
          }
          return new Rectangle(Math.round(minx), Math.round(miny), Math.round(maxx - minx), Math.round(maxy - miny));
      }
docs: De Casteljau algorithm