Java - Problemita con gráficas trigonométricas I

 
Vista:

Problemita con gráficas trigonométricas I

Publicado por Alan Garcia (11 intervenciones) el 01/08/2010 11:15:46
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:

OBSEVACIÓN: COMO EL TEXTO ES ALGO EXTENSO, LO HE DIVIDIDO EN DOS PARTES.

************************************************** *
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[i] > max) max = x0[i];
if (x0[i] < min) min = x0[i];
}
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[i] = aux;
posx[i] = (int)((etiqx[i] - 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][i] = (int)((x0[i] - 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[i] > max) max = y0[i];
if(y0[i] < min) min = y0[i];
}
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[i] = aux;
posy[i] = (int)((etiqy[i] - 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][i] = (int)((y0[i] - 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().
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder