Finished graphics for undirected graph.

This commit is contained in:
Chris Cromer 2016-07-07 16:50:27 -04:00
parent f04ca20a26
commit d1b53ba645
5 changed files with 195 additions and 34 deletions

View File

@ -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);
} }

View File

@ -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.
* *

View File

@ -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.

View File

@ -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.

View File

@ -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>