0% encontró este documento útil (0 votos)
156 vistas12 páginas

Grafos en Java: Estructura y Código

Este documento describe cómo implementar un grafo dinámico en Java. Define clases para nodos (circulo), aristas (linea) y un panel de dibujo (lienzo) que dibuja los nodos y aristas. El usuario puede agregar nodos haciendo clic y aristas seleccionando nodos inicial y final. El programa mantiene listas de nodos y aristas y redibuja cuando se modifican.

Cargado por

Renato Saavedra
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
156 vistas12 páginas

Grafos en Java: Estructura y Código

Este documento describe cómo implementar un grafo dinámico en Java. Define clases para nodos (circulo), aristas (linea) y un panel de dibujo (lienzo) que dibuja los nodos y aristas. El usuario puede agregar nodos haciendo clic y aristas seleccionando nodos inicial y final. El programa mantiene listas de nodos y aristas y redibuja cuando se modifican.

Cargado por

Renato Saavedra
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

GRAFOS EN JAVA

Estructura de Datos: Grafos


Un Grafo no es mas que un conjunto de nodos o vrtices que se encuentran
relacionados con unas aristas. Ademas los vrtices tienen un valor y
en ocasiones las aristas tambin y se le conoce como el costo.
Representacin Grfica de un Grafo

Como se puede ver los puntos son los nodos o vrtices, y las lineas son las aristas, en el caso
de la imagen es la representacin grfica de un grafo dirigido ya que las aristas tienen
un nico sentido, ya que de A a D se puede ir pero de D a A no. Si el grafo fuera no dirigido
se podra ya que las aristas no tienen direccin.

Aplicacin
La teora de Grafos se aplica hoy en da en muchos campos, tales como en Internet, ya que
cada computador es un vrtice y la conexin entre ellos son las aristas, ademas se usa para
hallar la ruta mas corta en empresas de transporte, y en muchas otras reas.

Imgenes
Cdigo
Clase Principal
package Clases;

import [Link];
import [Link];
import [Link];
import [Link];

import [Link].*;

public class Principal extends JApplet{

PanelDibujo pd;
int max=0;
JTextField valor;

public void init(){

pd=new PanelDibujo();
add(pd);

JPanel pdatos=new JPanel();


JButton agregar=new JButton("Agregar Nodo");
[Link](new ActionListener(){

@Override
public void actionPerformed(ActionEvent e) {
if(max<10){
try{
Grafo gf=new Grafo(""+[Link]([Link]()));
[Link]().add(gf);
[Link]();
repaint();
max++;
}catch(NumberFormatException ne){
[Link](null, "Digite un numero valido");
}
}
}
});

valor=new JTextField(5);
[Link](new JLabel("Valor Vertice" +
""));
[Link](valor);
[Link](agregar);
add(pdatos,[Link]);

Clase PanelDibujo
package Clases;

import [Link];
import [Link];
import [Link];
import [Link].Graphics2D;
import [Link];

import [Link].*;

public class PanelDibujo extends JPanel {

int x=150;
int y=150;
int ancho=30;
int alto=30;
public Vector<Integer> xvs;
public Vector<Integer> yvs;
public Vector<Grafo> vgrafos;
int indice=0;
public PanelDibujo(){
vgrafos=new Vector();
xvs=new Vector<Integer>();
yvs=new Vector<Integer>();
setDoubleBuffered(true);
}

public void paintComponent(Graphics grafico){


[Link](grafico);
Graphics2D g=(Graphics2D)grafico;
if([Link]()!=0){
[Link]([Link]);
[Link](0, 0, getWidth(), getHeight());
[Link]([Link]);
int radio = 100;
float angulo = 360/10;
angulo = (float) [Link](angulo);
for(int i=indice;i<[Link]();i++){
int xv=(int)(x+radio*[Link](i * angulo));
int yv=(int) (y- radio * [Link](i * angulo));
[Link](xv);
[Link](yv);
indice++;
}
}
for(int i=0;i<[Link]();i++){
for(int j=0;j<[Link]();j++){
[Link](new BasicStroke(2));
[Link]([Link]);
[Link]([Link](i)+15,[Link](i)+15,[Link](j)+15,[Link](j)+15);
[Link]([Link]);
[Link]([Link](i), [Link](i), ancho, alto);
[Link]([Link]);
[Link]([Link](i),[Link](i), ancho, alto);
[Link](""+[Link](i).obtenerDato(), [Link](i)+((ancho/2)-3),
[Link](i)+((alto/2)+3));
[Link]([Link]);
[Link]([Link](j), [Link](j), ancho, alto);
[Link]([Link]);
[Link]([Link](j),[Link](j), ancho, alto);
[Link](""+[Link](j).obtenerDato(), [Link](j)+((ancho/2)-3),
[Link](j)+((alto/2)+3));
}
}
}
public Vector<Grafo> getVgrafos() {
return vgrafos;
}
public void setVgrafos(Vector<Grafo> vgrafos) {
[Link] = vgrafos;
}
}
Clase Grafo
package Clases;

import [Link];

public class Grafo {

private String dato;

public Grafo(String s){


dato=s;
}

public String obtenerDato(){


return dato;
}
}

La clase Grafo solo es para almacenar el valor de cada grafo, ademas as es mas orientada a
objetos y facilita la programacin.

La clase PanelDibujo es la que se encargar de dibujar los vrtices o nodos y de pintar las lineas
que vendran a hacer las aristas. Ademas dibuja el valor del vrtice. En esta clase hay una parte
del cdigo que es pura matemtica, esto lo que hace es hacer que el grafo pinte los nodos en
forma circular y as hacer que se vea mas limpia a la vista la grfica.

Lo que hacemos es primero calcular el angulo de separacin entre nodos, por eso 360 lo divido
entre 10, ya que este es el mximo de vrtices a dibujar. Y luego en el para el angulo se va
multiplicando por i, para poder ir movindose y as dibujar correctamente el grafo.

La clase Principal es la encargada de crear el campo de texto para colocar el valor del vrtice a
insertar y de crear el botn que va ir aadiendo vrtices al grafo.

Grafo Dinmico
Ahora veremos como podemos ir construyendo nuestro grafo sencillo paso a paso, podemos ir
colocando nuestros nodos y despues ir asignando las aristas. Este proyecto fue aportado
por Michael Manjarres.

Imgenes
Cdigo

Clase Principal

package Clases;

import [Link];

public class Principal extends JApplet {

public void init(){


lienzo l=new lienzo(this);
[Link](0, 0, 400, 400);
add(l);
}
}

Clase lienzo
package Clases;

import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];

public class lienzo extends JPanel implements MouseListener,MouseMotionListener{

int x=0,y=0;
linea linea;
circulo circulo;
circulo jalada=null;
List<circulo> ListCirculo = new ArrayList<circulo>();
List<linea> ListArista = new ArrayList<linea>();
Principal p;

public lienzo(Principal prin) {


p=prin;
[Link](this);
[Link](this);
[Link](true);
[Link](true);
}

public void anadirCirculo(int x, int y){


circulo = new circulo([Link](),x,y);
[Link](circulo);
repaint();
[Link]();
}

public void anadirLinea( int x, int y){


try{
linea = new linea ([Link](x),[Link](y));
[Link](linea);
repaint();
[Link]();
}catch(IndexOutOfBoundsException e){
[Link](null, "No se encontro circulo");
}
}
@Override
public void paintComponent(Graphics g){
[Link](g);
for (linea f:ListArista)
{
[Link](g);
}

for (circulo f:ListCirculo)


{
[Link](g,this);
}

public void mouseClicked(MouseEvent e) {


try{
if([Link]()==1){
x = [Link]();
y = [Link]();
anadirCirculo(x,y);
}else
{
if([Link]()==3)
{
int ini = [Link]([Link]("Numero de circulo
inicual"));
int fin = [Link]([Link]("Numero de circulo
final"));
anadirLinea(ini, fin);
}
}
}catch(Exception ex){

}
}

public void mousePressed(MouseEvent e) {}

public void mouseReleased(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mouseDragged(MouseEvent e) {


if(jalada==null)
{
for (circulo f:ListCirculo)
{
if([Link]([Link]()))
{
jalada=f;
}
x=[Link]().x;
y=[Link]().y;
repaint();
[Link]();
}
}
else{
[Link]([Link]().x-x,[Link]().y-y);
x=[Link]().x;
y=[Link]().y;
repaint();
[Link]();
}
}

public void mouseMoved(MouseEvent e){


jalada=null;
}

Clase circulo
package Clases;

import [Link].*;
import [Link];

public class circulo{

int x,y,n;
Image image;

public circulo(int n, int x, int y) {


this.n=n;
this.x=x;
this.y=y;
image = new
ImageIcon(getClass().getResource("../Imagenes/[Link]")).getImage();
}

public void painter(Graphics g,lienzo l) {


[Link](image, x-15, y-15, l);
[Link]([Link]);
[Link](""+n, x-15, y-15);
[Link](""+n, x-14, y-14);
}

public int getX() {


return x;
}
public int getY() {
return y;
}

public int getN() {


return n;
}

public void transladar(int dx,int dy) {


this.x+=dx; this.y+=dy;
}

public void setImage(Image image) {


[Link] = image;
}

public boolean jaladopor(Point d) {


if([Link](x, y)<=15) {
return true;
}
else {
return false;
}
}
}

Clase linea
package Clases;

import [Link];
import [Link];

public class linea{

circulo inicial;
circulo ffinal;
Color color= [Link];

public linea(circulo inicial, circulo ffinal) {


[Link]=inicial;
[Link]=ffinal;
}

public void painter(Graphics g) {


[Link]([Link]);
[Link](color);
[Link]([Link](), [Link](), [Link](), [Link]());
}

public void setColor(Color color) {


[Link] = color;
}
public circulo getFfinal() {
return ffinal;
}

public circulo getInicial() {


return inicial;
}

La clase Principal solo crea un objeto lienzo y lo adiciona para ser mostrado. La clase lienzo es
la encargada de mostrar el grafo, en ella se encuentran dos listas las cuales guardan los nodos
y las lineas que se han creado, para luego ser dibujados en el metodo paintComponent.

La clase circulo tiene la imagen que representa un nodo, ademas muestra el indice del nodo.
La clase linea posee dos nodos el inicial y el final, para poder dibujar la linea entre dichos nodos.

(http://www.monografias.com/trabajos/grafos/Image354.gif)GRAFOS EN JAVA 
Estructura de Datos: Grafos 
 
Un Grafo no es mas q
(http://2.bp.blogspot.com/_73t-OXs9bAc/TQgURiMEuMI/AAAAAAAAAGA/EuYP_aZEiIg/s1600/grafos2.png) (http://2.bp.blogspot.com/_73t
(http://4.bp.blogspot.com/_73t-OXs9bAc/TQgUSPBDg3I/AAAAAAAAAGE/I-v0tLNHP0U/s1600/grafos3.png) 
 
 
 
Código 
 
Clase Princip
JButton agregar=new JButton("Agregar Nodo"); 
  agregar.addActionListener(new ActionListener(){ 
 
   @Override 
   public
public PanelDibujo(){ 
  vgrafos=new Vector(); 
  xvs=new Vector<Integer>(); 
  yvs=new Vector<Integer>(); 
  setDoubleBuffe
Clase Grafo 
 
package Clases; 
 
import java.util.Vector; 
 
public class Grafo { 
  
 private String dato; 
  
 public Graf
(https://lh5.googleusercontent.com/-6Ll6pYV7GiE/TYLab0gnvDI/AAAAAAAAAVc/TzbknsSH28Y/s1600/grafo2.png) (https://lh3.googleuse
} 
} 
 
Clase lienzo 
 
package Clases; 
 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.MouseEve
@Override 
    public void paintComponent(Graphics g){ 
     super.paintComponents(g); 
      for (linea f:ListArista)
} 
             x=e.getPoint().x; 
             y=e.getPoint().y; 
             repaint(); 
             p.rep

También podría gustarte