Java - Necesito ayuda para dibujar un grafo a partir de su matriz de adyacencia

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 6 puestos en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda para dibujar un grafo a partir de su matriz de adyacencia

Publicado por Miguel Paz (8 intervenciones) el 09/09/2020 02:47:57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// lo que llevo me imprime los vertices dependiendo de la matriz que le entra, pero tengo el inconveniente que //algunos me quedan uno encima de otro y no sé como unirlos por medio de las lineas
//agradeceria mucho me echaran una mano con el codigo o que me dieran una pista de como hacer. muchas //gracias
 
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import javax.swing.JFrame;
 
/**
 *
 * @author Miguel Angel
 */
public class dibujarGrafo extends JFrame {
    Container contenedor;
	FlowLayout layout;
        static int  longitud;
 
    public dibujarGrafo(){
        super("Grafos");
        contenedor = getContentPane();
        layout = new FlowLayout();
        contenedor.setLayout(layout);
 
        setSize(300,300);
        setVisible(true);
    }
 
    public void paint( Graphics g )
   {
       // g.drawOval(100,100,50,50);
       for (int i = 0; i < longitud; i++) {
           g.drawOval((int) (Math.random()*250), (int) (Math.random()*250) , 30, 30);
 
       }
   }
 
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
 
 
        try{
 
        int[][] matriz;
            System.out.println(" Ingrese el nombre del archivo");
            Scanner scanner = new Scanner (System.in);
            String archivo = scanner.next();
			BufferedReader br = new BufferedReader(new FileReader(archivo));
			//Primera linea nos dice longitud de la matriz
			String linea = br.readLine();
			longitud = Integer.parseInt(linea);
			matriz = new int[longitud][longitud];
			//Las siguientes lineas son filas de la matriz
			linea = br.readLine();
			int fila = 0; //Para recorrer las filas de la matriz
			while(linea != null) {
				/*
				 * Tenemos todos los enteros JUNTOS en el String linea.
				 * Con split() los SEPARAMOS en un array donde cada entero
				 * es un String individual. Con un bucle, los parseamos a Integer
				 * para guardarlos en la matriz
				 */
				String[] enteros = linea.split(" ");
				for (int i = 0; i < enteros.length; i++)
					matriz[fila][i] = Integer.parseInt(enteros[i]);
 
				fila++; //Incrementamos fila para la próxima línea de enteros
				linea = br.readLine(); //Leemos siguiente línea
			}
            br.close(); //Cerramos el lector de ficheros
            //Mostramos la matriz leída
            for (int i = 0; i < longitud; i++) {
		for (int j = 0; j < longitud; j++)
                    System.out.print(matriz[i][j] + " ");
                    System.out.println();
 
            }
            dibujarGrafo canvaz = new dibujarGrafo();
            canvaz.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        catch (FileNotFoundException e) {
            System.out.println("No se encuentra archivo");
            e.printStackTrace();
	} catch (NumberFormatException e) {
            System.out.println("No se pudo convertir a entero");
            e.printStackTrace();
	} catch (IOException e) {
            System.out.println("Error accediendo al archivo.");
            e.printStackTrace();
	}
    }
 
}
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
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda para dibujar un grafo a partir de su matriz de adyacencia

Publicado por Rodrigo (623 intervenciones) el 09/09/2020 16:10:56
Es rara la descripcion que haces.
La linea 37 parece dibujar en posiciones aleatorias, mientras que la linea 82 parece escribir en consola los datos de la matriz de adyacencia.

El comentario que aparece al inicio dice "// lo que llevo me imprime los vertices dependiendo de la matriz que le entra"

Que es lo que no esta bien entonces?

Sugiero esto para resolver el problema;

- Si sabes definir clases, define una para los nodos. Luego pon los nodos en un arreglo, y que el indice calce con el que se maneja en la matriz.
- SI prefieres no usar clases, define varios arrays y maneja todo con indices
- En vez de dibujar aleatoriamente sin control, podrias distribuir aleatoriamente los nodos, tal vez poniendo solo el primero aleatoriamente, pero el resto considerando la posicion de las demas, y recalculando cuando haya colisiones.
- Ejemplo: Pones el primero en la posicion 10, 10. El siguiente, eliges aleatoriamente si moverte 5 a la derecha, 5 a la izquierda, 5 arriba o 5 abajo y lo dibujas (5 puede ser muy poco, usa otro valor si es asi). El siguiente eliges cualquiera de los 2 nodos, o el que esta mas a la derecha, o el que esta mas abajo, o arriba, etc. y repites la eleccion aleatoria entre las 4 opciones. Cada vez que eliges donde, preguntas a los otros nodos su posicion y si el nuevo usaria la posicion del otro, vuelves a elegir hasta encontrar una posicion que no este ocupada.
- Para generar un grafico mejor distribuido, te sugiero hacer sort de los nodos de acuerdo al numero de conexiones que tiene, y empezar a dibujar los nodos, o bien usando el que tiene mas conexiones primero, o bien el que tiene menos. No se cual de las 2 opciones quedaria mejor si usas la eleccion aleatoria que sugeri previamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar