Finished graphics for undirected graph.
This commit is contained in:
parent
f04ca20a26
commit
d1b53ba645
@ -8,6 +8,7 @@ import javafx.scene.canvas.GraphicsContext;
|
|||||||
import javafx.scene.text.Text;
|
import javafx.scene.text.Text;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.Random;
|
||||||
import java.util.ResourceBundle;
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -85,6 +86,50 @@ public class GrafoController implements Initializable {
|
|||||||
scene = null;
|
scene = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
protected void botonLlenar() {
|
||||||
|
if (scene == null) {
|
||||||
|
initializeGrafo();
|
||||||
|
}
|
||||||
|
|
||||||
|
Array array = new Array(5);
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
if (nodes[i] != null) {
|
||||||
|
array.insertar(nodes[i].getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
if (nodes[i] == null) {
|
||||||
|
Random random = new Random();
|
||||||
|
int maximo = 99;
|
||||||
|
int minimo = 0;
|
||||||
|
int rango = maximo - minimo + 1;
|
||||||
|
|
||||||
|
int numero = random.nextInt(rango) + minimo;
|
||||||
|
// Check if value is in array
|
||||||
|
while (array.buscar(numero) != -1) {
|
||||||
|
numero = random.nextInt(rango) + minimo;
|
||||||
|
}
|
||||||
|
|
||||||
|
nodes[i] = new Node(numero);
|
||||||
|
grafoNoDirigido.addNode(nodes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
generarGrafico();
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
protected void botonVaciar() {
|
||||||
|
if (scene == null) {
|
||||||
|
initializeGrafo();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.grafoNoDirigido = new GrafoNoDirigido<>();
|
||||||
|
this.nodes = new Node[5];
|
||||||
|
generarGrafico();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insertar un valor al array y mostrar el codigo en la pantalla.
|
* Insertar un valor al array y mostrar el codigo en la pantalla.
|
||||||
*/
|
*/
|
||||||
@ -130,11 +175,11 @@ public class GrafoController implements Initializable {
|
|||||||
}
|
}
|
||||||
catch (NumberFormatException exception) {
|
catch (NumberFormatException exception) {
|
||||||
// El error no es fatal, sigue
|
// El error no es fatal, sigue
|
||||||
Main.mostrarError(resourceBundle.getString("grafoNoValor"), resourceBundle);
|
Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Main.mostrarError(resourceBundle.getString("grafoNoValor"), resourceBundle);
|
Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,41 +187,109 @@ public class GrafoController implements Initializable {
|
|||||||
* Insertar un valor al array y mostrar el codigo en la pantalla.
|
* Insertar un valor al array y mostrar el codigo en la pantalla.
|
||||||
*/
|
*/
|
||||||
@FXML
|
@FXML
|
||||||
|
protected void botonEliminar() {
|
||||||
|
if (scene == null) {
|
||||||
|
initializeGrafo();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mostrar el codigo
|
||||||
|
/*String codigoTexto = new Scanner(getClass().getResourceAsStream("/cl/cromer/estructuras/code/array" + tipo + "/insertar")).useDelimiter("\\Z").next();
|
||||||
|
codigoArray.setText(codigoTexto);*/
|
||||||
|
|
||||||
|
if (valorGrafo.getText() != null && ! valorGrafo.getText().trim().equals("")) {
|
||||||
|
try {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 5; i++) {
|
||||||
|
if (nodes[i] != null && nodes[i].getValue() == Integer.valueOf(valorGrafo.getText())) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i != 5) {
|
||||||
|
boolean exito = grafoNoDirigido.removeNode(nodes[i]);
|
||||||
|
if (exito) {
|
||||||
|
nodes[i] = null;
|
||||||
|
valorGrafo.setText("");
|
||||||
|
generarGrafico();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (NumberFormatException exception) {
|
||||||
|
// El error no es fatal, sigue
|
||||||
|
Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insertar un edge al grafo y mostrar el codigo en la pantalla.
|
||||||
|
*/
|
||||||
|
@FXML
|
||||||
protected void botonInsertarEdge() {
|
protected void botonInsertarEdge() {
|
||||||
if (scene == null) {
|
if (scene == null) {
|
||||||
initializeGrafo();
|
initializeGrafo();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (valorNodo1.getText() != null && ! valorNodo1.getText().trim().equals("") && valorNodo2.getText() != null && ! valorNodo2.getText().trim().equals("")) {
|
if (valorNodo1.getText() != null && ! valorNodo1.getText().trim().equals("") && valorNodo2.getText() != null && ! valorNodo2.getText().trim().equals("")) {
|
||||||
Node nodo1 = null;
|
Node[] nodos = getNodosEdge();
|
||||||
Node nodo2 = null;
|
|
||||||
for (int i = 0; i < 5; i++) {
|
|
||||||
if (nodes[i] != null) {
|
|
||||||
if (Integer.valueOf(valorNodo1.getText()) == nodes[i].getValue()) {
|
|
||||||
nodo1 = nodes[i];
|
|
||||||
}
|
|
||||||
if (Integer.valueOf(valorNodo2.getText()) == nodes[i].getValue()) {
|
|
||||||
nodo2 = nodes[i];
|
|
||||||
}
|
|
||||||
if (nodo1 != null && nodo2 != null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nodo1 != null && nodo2 != null && grafoNoDirigido.nodeExists(nodo1) && grafoNoDirigido.nodeExists(nodo2) && !grafoNoDirigido.edgeExists(nodo1, nodo2)) {
|
if (nodos[0] == null || nodos[1] == null || !grafoNoDirigido.nodeExists(nodos[0]) || !grafoNoDirigido.nodeExists(nodos[1])) {
|
||||||
grafoNoDirigido.addEdge(nodo1, nodo2);
|
Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
|
||||||
|
}
|
||||||
|
else if (grafoNoDirigido.edgeExists(nodos[0], nodos[1])) {
|
||||||
|
Main.mostrarError(resourceBundle.getString("grafoEdgeExiste"), resourceBundle);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
grafoNoDirigido.addEdge(nodos[0], nodos[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// TODO: Error no nodos
|
Main.mostrarError(resourceBundle.getString("grafoNoNumero"), resourceBundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
generarGrafico();
|
generarGrafico();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Crear un arbol nuevo.
|
* Insertar un edge al grafo y mostrar el codigo en la pantalla.
|
||||||
|
*/
|
||||||
|
@FXML
|
||||||
|
protected void botonEliminarEdge() {
|
||||||
|
if (scene == null) {
|
||||||
|
initializeGrafo();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (valorNodo1.getText() != null && ! valorNodo1.getText().trim().equals("") && valorNodo2.getText() != null && ! valorNodo2.getText().trim().equals("")) {
|
||||||
|
Node[] nodos = getNodosEdge();
|
||||||
|
|
||||||
|
if (nodos[0] == null || nodos[1] == null || !grafoNoDirigido.nodeExists(nodos[0]) || !grafoNoDirigido.nodeExists(nodos[1])) {
|
||||||
|
Main.mostrarError(resourceBundle.getString("grafoNoNodo"), resourceBundle);
|
||||||
|
}
|
||||||
|
else if (!grafoNoDirigido.edgeExists(nodos[0], nodos[1])) {
|
||||||
|
Main.mostrarError(resourceBundle.getString("grafoNoEdge"), resourceBundle);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
grafoNoDirigido.removeEdge(nodos[0], nodos[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Main.mostrarError(resourceBundle.getString("grafoNoEdge"), resourceBundle);
|
||||||
|
}
|
||||||
|
|
||||||
|
generarGrafico();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crear un grafo nuevo.
|
||||||
*/
|
*/
|
||||||
private void initializeGrafo() {
|
private void initializeGrafo() {
|
||||||
scene = contenidoGrafo.getScene();
|
scene = contenidoGrafo.getScene();
|
||||||
@ -185,6 +298,32 @@ public class GrafoController implements Initializable {
|
|||||||
this.nodes = new Node[5];
|
this.nodes = new Node[5];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Devolver los nodos que existen.
|
||||||
|
*
|
||||||
|
* @return Node[]: Los nodos que se busca.
|
||||||
|
*/
|
||||||
|
private Node[] getNodosEdge() {
|
||||||
|
Node[] nodos = new Node[2];
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
if (nodes[i] != null) {
|
||||||
|
if (Integer.valueOf(valorNodo1.getText()) == nodes[i].getValue()) {
|
||||||
|
nodos[0] = nodes[i];
|
||||||
|
}
|
||||||
|
if (Integer.valueOf(valorNodo2.getText()) == nodes[i].getValue()) {
|
||||||
|
nodos[1] = nodes[i];
|
||||||
|
}
|
||||||
|
if (nodos[0] != null && nodos[1] != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nodos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generar la canvas con el grafo.
|
||||||
|
*/
|
||||||
private void generarGrafico() {
|
private void generarGrafico() {
|
||||||
grafico.removerDestacar();
|
grafico.removerDestacar();
|
||||||
|
|
||||||
@ -214,7 +353,7 @@ public class GrafoController implements Initializable {
|
|||||||
graphicsContext.strokeOval(210, 10, 40, 40);
|
graphicsContext.strokeOval(210, 10, 40, 40);
|
||||||
|
|
||||||
graphicsContext.setStroke(colores.getTexto());
|
graphicsContext.setStroke(colores.getTexto());
|
||||||
int x = textX(225, String.valueOf(nodes[0].getValue()));
|
int x = textX(225, String.valueOf(nodes[1].getValue()));
|
||||||
graphicsContext.strokeText(String.valueOf(nodes[1].getValue()), x, 35);
|
graphicsContext.strokeText(String.valueOf(nodes[1].getValue()), x, 35);
|
||||||
}
|
}
|
||||||
colores.siguinteColor();
|
colores.siguinteColor();
|
||||||
@ -227,7 +366,7 @@ public class GrafoController implements Initializable {
|
|||||||
graphicsContext.strokeOval(10, 210, 40, 40);
|
graphicsContext.strokeOval(10, 210, 40, 40);
|
||||||
|
|
||||||
graphicsContext.setStroke(colores.getTexto());
|
graphicsContext.setStroke(colores.getTexto());
|
||||||
int x = textX(25, String.valueOf(nodes[0].getValue()));
|
int x = textX(25, String.valueOf(nodes[2].getValue()));
|
||||||
graphicsContext.strokeText(String.valueOf(nodes[2].getValue()), x, 235);
|
graphicsContext.strokeText(String.valueOf(nodes[2].getValue()), x, 235);
|
||||||
}
|
}
|
||||||
colores.siguinteColor();
|
colores.siguinteColor();
|
||||||
@ -240,7 +379,7 @@ public class GrafoController implements Initializable {
|
|||||||
graphicsContext.strokeOval(210, 210, 40, 40);
|
graphicsContext.strokeOval(210, 210, 40, 40);
|
||||||
|
|
||||||
graphicsContext.setStroke(colores.getTexto());
|
graphicsContext.setStroke(colores.getTexto());
|
||||||
int x = textX(225, String.valueOf(nodes[0].getValue()));
|
int x = textX(225, String.valueOf(nodes[3].getValue()));
|
||||||
graphicsContext.strokeText(String.valueOf(nodes[3].getValue()), x, 235);
|
graphicsContext.strokeText(String.valueOf(nodes[3].getValue()), x, 235);
|
||||||
}
|
}
|
||||||
colores.siguinteColor();
|
colores.siguinteColor();
|
||||||
@ -253,7 +392,7 @@ public class GrafoController implements Initializable {
|
|||||||
graphicsContext.strokeOval(105, 410, 40, 40);
|
graphicsContext.strokeOval(105, 410, 40, 40);
|
||||||
|
|
||||||
graphicsContext.setStroke(colores.getTexto());
|
graphicsContext.setStroke(colores.getTexto());
|
||||||
int x = textX(120, String.valueOf(nodes[0].getValue()));
|
int x = textX(120, String.valueOf(nodes[4].getValue()));
|
||||||
graphicsContext.strokeText(String.valueOf(nodes[4].getValue()), x, 435);
|
graphicsContext.strokeText(String.valueOf(nodes[4].getValue()), x, 435);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,22 @@ public final class GrafoNoDirigido<T> implements Iterable<T> {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a node from the graph.
|
||||||
|
*
|
||||||
|
* @param node The node to remove.
|
||||||
|
* @return Whether or not the node was removed.
|
||||||
|
*/
|
||||||
|
public boolean removeNode(T node) {
|
||||||
|
/* If the node already exists, don't do anything. */
|
||||||
|
if (!mGraph.containsKey(node))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* Otherwise, remove the node. */
|
||||||
|
mGraph.remove(node);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a node, returns whether that node exists in the graph.
|
* Given a node, returns whether that node exists in the graph.
|
||||||
*
|
*
|
||||||
|
@ -13,8 +13,8 @@ tituloListaEnlazadaSimple=Simple Linked List
|
|||||||
tituloListaEnlazadaCircular=Circular Linked List
|
tituloListaEnlazadaCircular=Circular Linked List
|
||||||
tituloListaEnlazadaDoble=Double Linked List
|
tituloListaEnlazadaDoble=Double Linked List
|
||||||
tituloArbolGeneral=General Tree
|
tituloArbolGeneral=General Tree
|
||||||
tituloGrafoDirigido=Grafo Dirigido
|
tituloGrafoDirigido=Directed Graph
|
||||||
tituloGrafoNoDirigido=Grafo No Dirigido
|
tituloGrafoNoDirigido=Undirected Graph
|
||||||
tituloTablaHash=Hash Table
|
tituloTablaHash=Hash Table
|
||||||
|
|
||||||
estructuras=Structures
|
estructuras=Structures
|
||||||
@ -96,9 +96,11 @@ arbolNoValor=Please input a numeric value.
|
|||||||
grafoNodos=Nodos:
|
grafoNodos=Nodos:
|
||||||
grafoEdges=Edges:
|
grafoEdges=Edges:
|
||||||
grafoLleno=Node not inserted because of a maxium of 5 nodes in this implementation.
|
grafoLleno=Node not inserted because of a maxium of 5 nodes in this implementation.
|
||||||
grafoNodoExiste=Node alredy exists.
|
grafoNodoExiste=Node already exists.
|
||||||
grafoNoEsta=Node does not exist.
|
grafoEdgeExiste=Edge already exists.
|
||||||
grafoNoNodo=Please input a numeric node number.
|
grafoNoNodo=Node does not exist.
|
||||||
|
grafoNoEdge=Edge does not exist.
|
||||||
|
grafoNoNumero=Please input a numeric node number.
|
||||||
|
|
||||||
tablaHashLleno=Key not inserted because the hash table is full.
|
tablaHashLleno=Key not inserted because the hash table is full.
|
||||||
tablaHashLlaveExiste=Key already exists.
|
tablaHashLlaveExiste=Key already exists.
|
||||||
|
@ -96,8 +96,10 @@ grafoNodos=Nodos:
|
|||||||
grafoEdges=Edges:
|
grafoEdges=Edges:
|
||||||
grafoLleno=El nodo no fue insertado porque esta implementaci\u00F3n tiene un maxiumo de 5 nodos.
|
grafoLleno=El nodo no fue insertado porque esta implementaci\u00F3n tiene un maxiumo de 5 nodos.
|
||||||
grafoNodoExiste=El nodo ya existe.
|
grafoNodoExiste=El nodo ya existe.
|
||||||
grafoNoEsta=El nodo no existe.
|
grafoEdgeExiste=El edge ya existe.
|
||||||
grafoNoNodo=Ingresar una llave y un valor num\u00E9rico por favor.
|
grafoNoNodo=El nodo no existe.
|
||||||
|
grafoNoEdge=El edge no existe.
|
||||||
|
grafoNoNumero=Ingresar un nodo num\u00E9rico por favor.
|
||||||
|
|
||||||
tablaHashLleno=La llave no fue insertado porque la tabla hash est\u00E1 lleno.
|
tablaHashLleno=La llave no fue insertado porque la tabla hash est\u00E1 lleno.
|
||||||
tablaHashLlaveExiste=La llave ya existe.
|
tablaHashLlaveExiste=La llave ya existe.
|
||||||
|
@ -13,17 +13,19 @@
|
|||||||
<HBox alignment="TOP_CENTER" VBox.vgrow="ALWAYS" spacing="50">
|
<HBox alignment="TOP_CENTER" VBox.vgrow="ALWAYS" spacing="50">
|
||||||
<VBox spacing="10">
|
<VBox spacing="10">
|
||||||
<HBox alignment="CENTER" spacing="10">
|
<HBox alignment="CENTER" spacing="10">
|
||||||
<!--<Button text="%llenar" onAction="#botonLlenar"/>-->
|
<Button text="%llenar" onAction="#botonLlenar"/>
|
||||||
<!--<Button text="%vaciar" onAction="#botonVaciar"/>-->
|
<Button text="%vaciar" onAction="#botonVaciar"/>
|
||||||
</HBox>
|
</HBox>
|
||||||
<HBox alignment="CENTER" spacing="10">
|
<HBox alignment="CENTER" spacing="10">
|
||||||
<Text text="%grafoNodos"/>
|
<Text text="%grafoNodos"/>
|
||||||
<Button text="%insertar" onAction="#botonInsertar"/>
|
<Button text="%insertar" onAction="#botonInsertar"/>
|
||||||
|
<Button text="%eliminar" onAction="#botonEliminar"/>
|
||||||
<TextFieldLimited fx:id="valorGrafo" maxLength="3" prefWidth="50"/>
|
<TextFieldLimited fx:id="valorGrafo" maxLength="3" prefWidth="50"/>
|
||||||
</HBox>
|
</HBox>
|
||||||
<HBox alignment="CENTER" spacing="10">
|
<HBox alignment="CENTER" spacing="10">
|
||||||
<Text text="%grafoEdges"/>
|
<Text text="%grafoEdges"/>
|
||||||
<Button text="%insertar" onAction="#botonInsertarEdge"/>
|
<Button text="%insertar" onAction="#botonInsertarEdge"/>
|
||||||
|
<Button text="%eliminar" onAction="#botonEliminarEdge"/>
|
||||||
<TextFieldLimited fx:id="valorNodo1" maxLength="3" prefWidth="50"/>
|
<TextFieldLimited fx:id="valorNodo1" maxLength="3" prefWidth="50"/>
|
||||||
<TextFieldLimited fx:id="valorNodo2" maxLength="3" prefWidth="50"/>
|
<TextFieldLimited fx:id="valorNodo2" maxLength="3" prefWidth="50"/>
|
||||||
</HBox>
|
</HBox>
|
||||||
|
Loading…
Reference in New Issue
Block a user