- import java.awt.Color;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.geom.Rectangle2D;
- import java.text.DecimalFormat;
- import javax.swing.JPanel;
- /**
- *
- * Esta clase se encarga de
- * dibujar las graficas en
- * el plano, para ello utiliza
- * las librerias de awt
- *
- *
- * @author Byron Chaman
- *
- */
- public class grafica extends JPanel{
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private static Rectangle2D plano;
- public int Idss = 10;
- public int Vp = 10;
- public info datos = null;
- public int n_lineas = 10;
- DecimalFormat decimal = new DecimalFormat("######.##");
- /**
- *
- * Crea un contenedor en el
- * cual se dibuja todo, este
- * va enlazado al jpanel.
- *
- */
- public void paintComponent(Graphics G){
- super.paintComponents(G);
- areaPlano(G);
- }
- /**
- *
- * El unico objetivo de
- * este constructor es
- * enlazar la información
- * que se envia en el nodo
- * ya que esta clase extiende
- * de JPanel teniendo sus propios
- * constructores
- *
- * @param data Recibe como parametro un nodo
- * de la clase info.
- *
- */
- public grafica (info data){
- datos = data;
- }
- /**
- *
- * Creando el plano
- *
- * Esta es la función principal
- * de todo el programa, aquí se
- * hacen los calculos de la
- * escala y el ploteo de la
- * gráfica.
- *
- * */
- public void areaPlano (Graphics g) {
- int alto = 20;
- int largo = 20;
- plano = new Rectangle2D.Double ();
- plano.setRect(alto, largo, 500, 500);
- Graphics2D g2D;
- g2D = (Graphics2D) g;
- // dibujar rectángulo 2D en rojo
- g2D.setPaint( Color.white );
- //g2D.setStroke( new BasicStroke( 10.0f ) );
- g2D.fill( new Rectangle2D.Double(alto, largo, 500, 500 ) );
- g2D.setPaint(Color.black);
- g2D.draw( new Rectangle2D.Double(alto, largo, 500, 500 ) );
- //g2D.clearRect(0, 0, 1, 1);
- g2D.draw(plano);
- g2D.setColor (Color.blue);
- g2D.drawLine(alto + 250, largo , largo + 250, 500 + alto);
- g2D.drawLine(largo, alto + 250, largo + 500, alto + 250);
- int intervalo = (int) (250/(0.5*n_lineas)); //Separación entre linea y linea
- float mayor;
- if(Math.abs(datos.dar_Idss())<Math.abs(datos.dar_Vp()))
- mayor = Math.abs(datos.dar_Vp());
- else
- mayor = Math.abs(datos.dar_Idss());
- float inter = (mayor*2)/n_lineas;
- mayor = mayor*-1;
- //Dibujando escala sobre y
- int px1 = largo + 245;
- int px2 = largo + 255;
- for(int i=alto+500;i>alto;i=i-intervalo){
- g2D.drawLine(px1, i, px2, i);
- g2D.drawString(decimal.format(mayor)+"",px2,i);
- mayor = mayor + inter;
- }
- //Dibujando escala sobre x
- int py1 = alto + 245;
- int py2 = alto + 255;
- for(int i=largo+501; i>largo; i=i-intervalo){
- g2D.drawLine(i, py1, i, py2);
- if(i!=largo+251)
- if(i!=largo+501)
- g2D.drawString(decimal.format(mayor)+"",i,py1);
- mayor = mayor - inter;
- }
- mayor = (mayor + inter)*-1; //convirtiendo mayor en el dato real
- //Ploteando
- int pix = 250;
- g2D.setColor(Color.red);
- float id = datos.dar_Idss();
- float n = id/pix;
- int Plotx=0;
- String cadena = Float.toString(datos.dar_Vp());
- for(int i = 0; i<pix+1; i++){
- try{
- float vg;
- if(cadena.charAt(0)=='-')
- vg = (float) ( (1 - (Math.sqrt( id/datos.dar_Idss() )) )*(datos.dar_Vp()*-1) );
- else
- vg = (float) ( (1 - (Math.sqrt( id/datos.dar_Idss() )) )*datos.dar_Vp() );
- if(Float.isNaN(vg))
- vg = datos.dar_Vp();
- System.out.println("vg="+vg+" id="+id);
- int plotx= 0;
- //Creando la escala
- int pres = 250; //Presición de la gráfica, tamaño de un cuadrante
- float a = mayor/pres;
- float tmp = a;
- int b = 1;
- while(a<vg){
- plotx = b;
- a=a+tmp;
- b++;
- }
- if(cadena.charAt(0)=='-'){
- if(Math.abs(datos.dar_Idss())<Math.abs(datos.dar_Vp())){
- float div = (Math.abs(datos.dar_Idss())/Math.abs(datos.dar_Vp()));
- int extra = 250-(int)(div*250);
- //System.out.print("\n extra=" + extra);
- g2D.drawLine( (-Plotx+largo+250), (int)((i*div)+alto+extra), (-plotx+largo+250), (int)((i*div)+1+alto+extra));
- }
- else{
- g2D.drawLine( (-Plotx+largo+250), i+alto, (-plotx+largo+250), i+1+alto);
- }
- if(datos.dar_Vg()!=0){
- if(Math.abs(vg) >= Math.abs(datos.dar_Vg())){
- punto_q(-Plotx+largo+250, g2D);
- datos.cambiar_Vg(0);
- }
- }
- }
- else{
- if(datos.dar_Idss()<datos.dar_Vp()){
- float div = (datos.dar_Idss()/datos.dar_Vp());
- int extra = 250-(int)(div*250);
- //System.out.print("\n extra=" + extra);
- g2D.drawLine( Plotx+largo+250, (int)((i*div)+alto+extra), plotx+largo+250, (int)((i*div)+1+alto+extra));
- }
- else
- g2D.drawLine( Plotx+largo+250, i+alto, plotx+largo+250, i+1+alto);
- if(datos.dar_Vg()!=0){
- if(vg >= datos.dar_Vg()){
- punto_q(Plotx+largo+250, g2D);
- datos.cambiar_Vg(0);
- }
- }
- }
- if(plotx>0)
- Plotx = plotx;
- //Graficando punto Q
- }
- catch(Exception e){
- }
- id = id - n;
- }
- System.out.println("\n \n");
- }
- void punto_q(int vgg, Graphics2D g2d){
- g2d.setColor(Color.yellow);
- g2d.drawLine(vgg, 20, vgg, 270);
- g2d.setColor(Color.red);
- }
- }