Problemita con gráficas de funciones trigonométricas.

gjbr

Lanero Regular
13 Dic 2009
18
Hola a todos, estoy intentando crear una aplicación que muestre el gráfico de las funciones trigonométricas por separado. La idea la obtuve de una página web que no recuerdo su dirección.

El problema pretendo que sea auto suficiente, esto es, que el usuario pueda visualizar cuantas veces lo desee el comportamiento de cada una de las funciones trigonométricas.

La aplicación presenta unos inconvenientes que no he logrado superar. Explico. Si el usuario decide visualizar la gráfica del seno trigonométrico, o la del coseno trigonométrico, las mismas son presentadas a la perfección. Pero si el mismo decide continuar con la ejecución de la aplicación, al "clicar" (Si) en el botón, la aplicación es ejecutada nuevamente, pero mostrando las gráficas de ambas figuras y no de aquella que deseo visualizar nuevamente (cualesquiera de las seis opciones). Por otro lado, si el usuario decide visualizar la gráfica de la funciones trigonométricas tangente, secante, cotangente y cosecante, éstas presentan un comportamiento un tanto extraño (talvez problema de redimensionamiento de la escala en el eje de las abscisas). No obstante, si primero se opta por cualesquiera de las dos primeras funciones y luego, cualesqueieras de las otras cuatro, el comportamiento se presenta como debe ser.

El código fuente referente a la aplicación en sì es algo extenso (elaborado en Netbeans 6.9), por razones obvias. Dicho código fuente es el siguiente:

***************************************************
package ejemplosfisica229b;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;

public class PRUEBA extends JFrame implements ActionListener {
int x[][], y[][], numd, n, MaxX, MaxY, posx[], posy[];
private int numser, inser;
private double maxy, miny, etiqx[], etiqy[];
private double maxx, minx;
private int pos_ejex, pos_ejey;
Container contenedor = getContentPane();
private JButton
Si, No,
Seno, // Grafica la función seno.
Coseno, // Grafica la función coseno.
Tangente, // Grafica la función tangente.
Secante, // Grafica la función secante.
Cotangente, // Grafica la función cotangente.
Cosecante; // Grafica la función cosecante.

public PRUEBA() {
contenedor.setBackground(Color.WHITE);
contenedor.setLayout(null);

// Parámetros indispensables para la construcción de la gráfica.
MaxX = 450;
MaxY = 450;
numd = 5;
setBounds(150, 0, 900, 500);
pos_ejex = 50;
pos_ejey = 450;
numser = 5;
etiqx = new double[numd];
etiqy = new double[numd];
posx = new int[numd];
posy = new int[numd];
inser = 0;

// Crea y coloca los seis botones de opción.
Seno = new JButton("Gráfica de la función seno.");
Coseno = new JButton("Gráfica de la función coseno.");
Tangente = new JButton("Gráfica de la función tangente.");
Secante = new JButton("Gráfica de la función secante.");
Cotangente = new JButton("Gráfica de la función cotangente.");
Cosecante = new JButton("Gráfica de la función cosecante.");
Si = new JButton("Si");
No = new JButton("No");

// Permite desencadenar un evento al accionar clic.
Seno.addActionListener(this);
Coseno.addActionListener(this);
Tangente.addActionListener(this);
Secante.addActionListener(this);
Cotangente.addActionListener(this);
Cosecante.addActionListener(this);

// Coloca los botones en las coordenadas indicadas.
add(Seno);
add(Coseno);
add(Tangente);
add(Secante);
add(Cotangente);
add(Cosecante);
Seno.setBounds(550, 50, 250, 30);
Coseno.setBounds(new Rectangle(550, 100, 250, 30));
Tangente.setBounds(new Rectangle(550, 150, 250, 30));
Secante.setBounds(new Rectangle(550, 200, 250, 30));
Cotangente.setBounds(new Rectangle(550, 250, 250, 30));
Cosecante.setBounds(new Rectangle(550, 300, 250, 30));
} // cierre del constructor PRUEBA().

public void paint(Graphics g) {
super.paint(g);
setTitle("********* GRAFICAS DE FUNCIONES TRIGONOMÉTRICAS *********");
} // cierre del método paint

void Datos(double xx[], double yy[]) {
SerieX(xx);
SerieY(yy);
} // cierre del método Datos().

void SerieX(double x0[]) {
int i;
double min, max, inc, aux;

n = x0.length;
if (inser == 0) {
x = new int[numser][n];
max = min = x0[0];

for(i = 1; i < n; i++) {
if (x0 > max) max = x0;
if (x0 < min) min = x0;
}
minx = min;
maxx = max;
inc = (max - min)/numd;
if (Math.abs(max - min) > 1.0) {
if (Math.abs(inc) < 1.0) inc = (double)1.0;
else inc = Math.round(inc + 0.5);
}

for(i = 0; i < numd; i++) {
aux = min + inc * i;
aux = (Math.round(aux * 10000.0))/10000.0;
etiqx = aux;
posx = (int)((etiqx - min)/(max - min) * (MaxX - 50));
}

if(min < 0 && max > 0) pos_ejex += (int)(-min/(max - min) * (MaxX - 50));
} else {
min = minx;
max = maxx;
}
for (i = 0; i < n; i++)
x[inser] = (int)((x0 - min)/(maxx - minx) * (MaxX - 50));
} // cierre del método SerieX.

void SerieY(double y0[]) {
int i;
double min, max, inc, aux;

if(inser >= numser) return;
if(inser == 0) {
y = new int[numser][n];
max = min = y0[0];

for(i = 1; i < n; i++) {
if(y0 > max) max = y0;
if(y0 < min) min = y0;
}

maxy = max;
miny = min;

inc = (max - min)/numd;
if(Math.abs(max - min) > 1.0) {
if(Math.abs(inc) < 1.0) inc = (double)1.0;
else inc = Math.round(inc+0.5);
}

for(i = 0; i < numd; i++) {
aux = min + inc * i;
aux = (Math.round(aux*10000.0))/10000.0;
etiqy = aux;
posy = (int)((etiqy - min)/(max - min) *
(MaxY - 50));
}
if(min < 0 && max > 0)
pos_ejey = MaxY -(int)(-min/(max - min) * (MaxY - 50));
} // cierre de la instrucción if externa.
else {
max = maxy;
min = miny;
}

for(i = 0; i < n; i++)
y[inser] = (int)((y0 - min)/(max - min) * (MaxY - 50));
inser++;
} // cierre del método SerieY().

public void actionPerformed(ActionEvent evento) {
if(evento.getSource() == Seno) {
evento.getActionCommand();
SENO(this.getGraphics());
continuacion(this.getGraphics());
} else if(evento.getSource() == Coseno) {
evento.getActionCommand();
COSENO(this.getGraphics());
continuacion(this.getGraphics());
} else if(evento.getSource() == Tangente) {
evento.getActionCommand();
TANGENTE(this.getGraphics());
continuacion(this.getGraphics());
} else if(evento.getSource() == Secante) {
evento.getActionCommand();
SECANTE(this.getGraphics());
continuacion(this.getGraphics());
} else if(evento.getSource() == Cosecante) {
evento.getActionCommand();
COSECANTE(this.getGraphics());
continuacion(this.getGraphics());
} else if(evento.getSource() == Cotangente) {
evento.getActionCommand();
COTANGENTE(this.getGraphics());
continuacion(this.getGraphics());
} else if(evento.getSource() == Si) {
evento.getActionCommand();
// paint(this.getGraphics()); // hace el llamado nuevamente a paint.
this.repaint(); // permite repintar nuevamente la figura.
} else if(evento.getSource() == No) {
evento.getActionCommand();
salida();
System.exit(0);
}
} // cierre del método actionPerformed().

public static void main(String args[]) {
/* JOptionPane.showMessageDialog(null, "El programa muestra el " +
"gráfico de las principales funciones trigonométricas \n",
"Objetivo", JOptionPane.INFORMATION_MESSAGE); */
PRUEBA aplicacion = new PRUEBA();
aplicacion.setBackground(Color.WHITE);
aplicacion.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
aplicacion.setLocation(150, 150);
aplicacion.setVisible(true);
} // cierre del método main().

void SENO(Graphics g) {
int mm, N;
double inicio = 0, fin = 5, incremento = 0.01;
N = (int)((fin - inicio)/incremento) + 1; // determina el número de puntos.
double xx[] = new double[N];
double yy[] = new double[N];

for(int i = 0; i < N; i++) { // crea las parejas de puntos.
xx = inicio + incremento * i;
yy = Math.sin(3.0 * xx) ;
}

Datos(xx,yy); // genera las parejas de puntos y la curva a ser trazada.

EjesCoordenados(g);

if(inser > numser) mm = numser;
else mm = inser;

for(int j = 0; j <= mm; j++) {
// pausa();
COLOR(g);
for(int i = 0; i < n - 1; i++)
g.drawLine(50 + x[j], MaxY - y[j], 50 + x[j][i+1],
MaxY - y[j][i+1]);
}
} // cierre del método SENO().

void COSENO(Graphics g) {
int mm, N;
double inicio = 0, fin = 5, incremento = 0.01;
N = (int)((fin - inicio)/incremento) + 1; // determina el número de puntos.
double xx[] = new double[N];
double yy[] = new double[N];

for(int i = 0; i < N; i++) { // crea las parejas de puntos.
xx = inicio + incremento * i;
yy = Math.cos(3.0 * xx) ;
}
// g.clearRect(0, 0, 460, 500);
Datos(xx,yy); // genera las parejas de puntos y la curva a ser trazada.

EjesCoordenados(g);
if(inser > numser) mm = numser;
else mm = inser;

for(int j = 0; j <= mm; j++) {
COLOR(g);
for(int i = 0; i < n - 1; i++)
g.drawLine(50 + x[j], MaxY - y[j], 50 + x[j][i+1],
MaxY - y[j][i+1]);

}
} // cierre del método COSENO().

void TANGENTE(Graphics g) {
int mm, N;
double inicio = 0, fin = 5, incremento = 0.01;
N = (int)((fin - inicio)/incremento) + 1; // determina el número de puntos.
double xx[] = new double[N];
double yy[] = new double[N];

for(int i = 0; i < N; i++) { // crea las parejas de puntos.
xx = inicio + incremento * i;
yy = Math.tan(xx);
}
Datos(xx,yy); // genera las parejas de puntos y la curva a ser trazada.

EjesCoordenados(g);
if(inser > numser) mm = numser;
else mm = inser;

for(int j = 0; j <= mm; j++) { // realiza el trazado de la curva.
COLOR(g);
for(int i = 0; i < n - 1; i++)
g.drawLine(50 + x[j], MaxY - y[j], 50 + x[j][i+1],
MaxY - y[j][i+1]);

}
} // cierre del método TANGENTE().

void SECANTE(Graphics g) {
int mm, N;
double inicio = 0, fin = 5, incremento = 0.01;
N = (int)((fin - inicio)/incremento) + 1; // determina el número de puntos.
double xx[] = new double[N];
double yy[] = new double[N];

for(int i = 0; i < N; i++) { // crea las parejas de puntos.
xx = inicio + incremento * i;
yy = 1.0/Math.cos(3.0 * xx);
}
Datos(xx,yy); // genera las parejas de puntos y la curva a ser trazada.

EjesCoordenados(g);
if(inser > numser) mm = numser;
else mm = inser;

for(int j = 0; j <= mm; j++) { // realiza el trazado de la curva.
COLOR(g);
for(int i = 0; i < n - 1; i++)
g.drawLine(50 + x[j], MaxY - y[j], 50 + x[j][i+1],
MaxY - y[j][i+1]);

}
} // cierre del método SECANTE().

void COSECANTE(Graphics g) {
int mm, N;
double inicio = 0, fin = 5, incremento = 0.01;
N = (int)((fin - inicio)/incremento) + 1; // determina el número de puntos.
double xx[] = new double[N];
double yy[] = new double[N];

for(int i = 0; i < N; i++) { // crea las parejas de puntos.
xx = inicio + incremento * i;
yy = 1.0/Math.sin(3.0 * xx);
}
Datos(xx,yy); // genera las parejas de puntos y la curva a ser trazada.

EjesCoordenados(g);
if(inser > numser) mm = numser;
else mm = inser;

for(int j = 0; j <= mm; j++) { // realiza el trazado de la curva.
COLOR(g);
for(int i = 0; i < n - 1; i++)
g.drawLine(50 + x[j], MaxY - y[j], 50 + x[j][i+1],
MaxY - y[j][i+1]);

}
} // cierre del método COSECANTE().

void COTANGENTE(Graphics g) {
int mm, N;
double inicio = 0, fin = 5, incremento = 0.01;
N = (int)((fin - inicio)/incremento) + 1; // determina el número de puntos.
double xx[] = new double[N];
double yy[] = new double[N];

for(int i = 0; i < N; i++) { // crea las parejas de puntos.
xx = inicio + incremento * i;
yy = 1.0/Math.tan(xx);
}
Datos(xx,yy); // genera las parejas de puntos y la curva a ser trazada.

EjesCoordenados(g);
if(inser > numser) mm = numser;
else mm = inser;

for(int j = 0; j <= mm; j++) { // realiza el trazado de la curva.
COLOR(g);
for(int i = 0; i < n - 1; i++)
g.drawLine(50 + x[j], MaxY - y[j], 50 + x[j][i+1],
MaxY - y[j][i+1]);

}
} // cierre del método COTANGENTE().

void EjesCoordenados(Graphics g) {
g.setColor(Color.black);
g.drawLine(pos_ejex, 0, pos_ejex, 500); // dibuja semieje x.
g.drawLine(0, pos_ejey, 500, pos_ejey); // dibuja semieje y.

for(int i = 0; i < numd - 2; i++) { /* coloca los valores de los ejes
* coordenados. */
g.drawString(Double.toString(etiqx), 50 + posx, 20);
g.drawString(Double.toString(etiqx), 50 + posx, pos_ejey + 20);
g.drawLine(50 + posx, pos_ejey - 5, 50 + posx, pos_ejey + 5);
g.drawString(Double.toString(etiqy), pos_ejex - 20, MaxY - posy);
g.drawLine(pos_ejex - 5, MaxY - posy, pos_ejex + 5, MaxY - posy);
}
} // cierre del método EjesCoordenados ();

static void pausa() {
try {
Thread.sleep(1500); // Pausa en milisegundos.
}
catch(InterruptedException exc) {}
return;
} // cierre del método pausa.

void COLOR(Graphics g) {
Random rnd = new Random(); // generador de números rnd
g.setColor(new Color(rnd.nextInt(255), rnd.nextInt(255), rnd.nextInt(255)));
return;
}
void continuacion(Graphics g) {
g.setFont(new Font("Arial Rounded MT Bold", Font.PLAIN,14));
g.drawString("¿Deseas seguir ejecutando?", 570, 400);
Si.addActionListener(this);
No.addActionListener(this);
add(Si);
Si.setBounds(new Rectangle(600, 380, 50, 30));
add(No);
No.setBounds(new Rectangle(670, 380, 50, 30));
}

void salida() {
JOptionPane.showMessageDialog(null, "Ha sido un placer haber " +
"trabajado con usted. Hasta luego...", "Salida",
JOptionPane.INFORMATION_MESSAGE);
return;
} // cierre del método prueba.
} // cierre de la clase PRUEBA.

***************************************************************

Me gustaría que me ayudaran a resolver esta dificultad, es decir, en que al decidir continuar con la aplicación, ésta sólo presente la gráfica elegida y no las anteriores. Además, de corregir las gráficas de las funciones más complicaditas (las cuatro últimas).

Saludos a todos y les agredezco de antemano su valiosa ayuda a mi problemita.
 

Los últimos temas