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: