docs: public Point eval(double t, AbstractPoint p)
      {
          if (t < 0 || t > 1)
          {
              throw new IllegalArgumentException("t="+t+" not in [0,1]");
          }
          p.set(0, 0);
          double c0 = Math.pow(1-t, 3);
          double c1 = 3*Math.pow(1-t, 2)*t;
          double c2 = 3*(1-t)*t*t;
          double c3 = t*t*t;
          p.add(c0*P[start].getX(), c0*P[start].getY());
          p.add(c1*P[start+1].getX(), c1*P[start+1].getY());
          p.add(c2*P[start+2].getX(), c2*P[start+2].getY());
          p.add(c3*P[start+3].getX(), c3*P[start+3].getY());
          return p;
      }