Gráfico de funciones

  void grafica(Pizarra p, double xmin, double xmax) {
    double factorMargen= 0.1;
    // El eje x
    int ancho= p.maxx()+1;    // ancho de la pizarra en numero de puntos
    int alto= p.maxy()+1;     // alto de la pizarra en numero de puntos
    int n= ancho-trunc(ancho*factorMargen+0.5); // nro. de puntos a evaluar
    double dx= (xmax-xmin)/(n-1); // diferencia entre puntos en el eje x
    // Calcular la coordenada x en la pizarra del origen del sistema de coord.
    // xmin + dx*x0piz= 0 => x0piz= -xmin/dx
    int x0piz= trunc(-xmin/dx+0.5);

    // El eje y
    double[] yvals= new double[n];
    for (int xpiz= 0; xpiz<n; xpiz++)
      yvals[xpiz]= eval(xmin+dx*xpiz); // Evaluar la funcion
    double ymax= yvals[0];    // maximo en el eje y
    double ymin= yvals[0];    // minimo en el eje y
    for (int xpiz= 0; xpiz<n; xpiz++) {
      ymax= max(ymax, yvals[xpiz]);
      ymin= min(ymin, yvals[xpiz]);
    }
    int m= alto-trunc(alto*factorMargen+0.5); // nro. de puntos en el eje y
    double dy= (ymax-ymin)/(m-1);   // diferencia en el eje y
    // Calcular la coordenada y en la pizarra del origen del sistema de coord.
    // ymin + dy*y0piz= 0 => y0piz= -ymin/dy
    int y0piz= trunc(-ymin/dy+0.5);

    // dibujar los ejes
    int margenIzq= trunc(ancho*factorMargen/2);
    int margenAbajo= trunc(alto*factorMargen/2);
    // El eje x
    if (0<=y0piz && y0piz<m)
      p.drawLine(margenIzq,     margenAbajo+y0piz,
                 margenIzq+n-1, margenAbajo+y0piz);
    // El eje y
    if (0<=x0piz && x0piz<n)
      p.drawLine(margenIzq+x0piz, margenAbajo,
                 margenIzq+x0piz, margenAbajo+m-1);
    // dibujar la funcion
    // yvals[xpiz]= ymin + dy*ypiz => ypiz= (yvals[xpiz]-ymin)/dy
    for (int xpiz= 0; xpiz<n; xpiz++) {
      int ypiz= trunc((yvals[xpiz]-ymin)/dy+0.5);
      p.drawPoint(margenIzq+xpiz, margenAbajo+ypiz);
    }
  }
(Ver el programa completo en Grafico.java.)

Ejercicios: