aboutsummaryrefslogtreecommitdiffstats
path: root/src/jcgp/gui/population/ChromosomePane.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jcgp/gui/population/ChromosomePane.java')
-rw-r--r--src/jcgp/gui/population/ChromosomePane.java106
1 files changed, 79 insertions, 27 deletions
diff --git a/src/jcgp/gui/population/ChromosomePane.java b/src/jcgp/gui/population/ChromosomePane.java
index f09d452..ede01e0 100644
--- a/src/jcgp/gui/population/ChromosomePane.java
+++ b/src/jcgp/gui/population/ChromosomePane.java
@@ -1,7 +1,10 @@
package jcgp.gui.population;
+import java.util.ArrayList;
+
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.Pane;
+import javafx.scene.shape.Line;
import jcgp.backend.population.Chromosome;
import jcgp.backend.population.Connection;
import jcgp.backend.population.Input;
@@ -26,16 +29,20 @@ public class ChromosomePane extends ScrollPane {
private GUIInput[] guiInputs;
private GUIOutput[] guiOutputs;
+ private ArrayList<Line> connectionLines;
+
private Pane content;
private int rows, columns;
private boolean target = false;
- public ChromosomePane(Chromosome chromosome, GUI gui, PopulationPane parent) {
+ public ChromosomePane(Chromosome chromosome) {
super();
- final Resources resources = gui.getExperiment().getResources();
+ final Resources resources = GUI.resources;
+
+ connectionLines = new ArrayList<Line>();
rows = resources.rows();
columns = resources.columns();
@@ -44,7 +51,9 @@ public class ChromosomePane extends ScrollPane {
content.setId("content pane for genes");
// generate the GUIGenes
- // inputs
+ /*
+ * inputs
+ */
guiInputs = new GUIInput[resources.inputs()];
for (int i = 0; i < guiInputs.length; i++) {
// make the GUI elements
@@ -54,43 +63,91 @@ public class ChromosomePane extends ScrollPane {
GUIHandlers.addHandlers(guiInputs[i]);
}
content.getChildren().addAll(guiInputs);
- // nodes
+
+ /*
+ * nodes
+ */
guiNodes = new GUINode[rows][columns];
+ double angle, xPos, yPos;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < columns; c++) {
+ // make the connection lines
+ Line lines[] = new Line[resources.arity()];
+ for (int l = 0; l < lines.length; l++) {
+ angle = ((((double) (l + 1)) / ((double) (lines.length + 1))) * Constants.THETA) - (Constants.THETA / 2);
+ xPos = (-Math.cos(angle) * Constants.NODE_RADIUS) + (((c + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS);
+ yPos = (Math.sin(angle) * Constants.NODE_RADIUS) + ((r * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS);
+
+ lines[l] = new Line(xPos, yPos, xPos, yPos);
+ lines[l].setMouseTransparent(true);
+ //lines[l].setVisible(false);
+ connectionLines.add(lines[l]);
+ }
// make the GUI elements
- guiNodes[r][c] = new GUINode(chromosome.getNode(r, c));
+ guiNodes[r][c] = new GUINode(chromosome.getNode(r, c), lines) {
+ @Override
+ public GUIConnection getGUIConnection(Connection connection) {
+ if (connection instanceof Input) {
+ return guiInputs[((Input) connection).getIndex()];
+ } else if (connection instanceof Node) {
+ return guiNodes[((Node) connection).getRow()][((Node) connection).getColumn()];
+ } else {
+ // something bad happened!
+ throw new ClassCastException();
+ }
+ }
+ };
guiNodes[r][c].relocate(((chromosome.getNode(r, c).getColumn() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS,
(chromosome.getNode(r, c).getRow() * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS);
GUIHandlers.addHandlers(guiNodes[r][c]);
}
content.getChildren().addAll(guiNodes[r]);
}
- // outputs
+
+ /*
+ * outputs
+ */
guiOutputs = new GUIOutput[resources.outputs()];
for (int i = 0; i < guiOutputs.length; i++) {
// make the GUI elements
- guiOutputs[i] = new GUIOutput(chromosome.getOutput(i));
+ guiOutputs[i] = new GUIOutput(chromosome.getOutput(i)) {
+
+ @Override
+ public GUIConnection getGUIConnection(Connection connection) {
+ if (connection instanceof Input) {
+ return guiInputs[((Input) connection).getIndex()];
+ } else if (connection instanceof Node) {
+ return guiNodes[((Node) connection).getRow()][((Node) connection).getColumn()];
+ } else {
+ // something bad happened!
+ throw new ClassCastException();
+ }
+ }
+
+ };
guiOutputs[i].relocate(((resources.columns() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS,
(chromosome.getOutput(i).getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS);
GUIHandlers.addHandlers(guiOutputs[i]);
}
content.getChildren().addAll(guiOutputs);
+ // add lines to the pane as on top of genes
+ content.getChildren().addAll(connectionLines);
+
setPrefWidth(620);
setContent(content);
}
- protected GUIGene getGuiGene(Connection gene) {
- if (gene instanceof Input) {
- return guiInputs[((Input) gene).getIndex()];
- } else if (gene instanceof Node) {
- return guiNodes[((Node) gene).getRow()][((Node) gene).getColumn()];
- } else {
- // something bad happened!
- throw new ClassCastException();
- }
- }
+// protected GUIGene getGuiGene(Connection gene) {
+// if (gene instanceof Input) {
+// return guiInputs[((Input) gene).getIndex()];
+// } else if (gene instanceof Node) {
+// return guiNodes[((Node) gene).getRow()][((Node) gene).getColumn()];
+// } else {
+// // something bad happened!
+// throw new ClassCastException();
+// }
+// }
protected boolean isTarget() {
return target;
@@ -111,7 +168,7 @@ public class ChromosomePane extends ScrollPane {
}
}
- public static boolean isAllowed(GUIGene source, GUIGene target) {
+ public static boolean isAllowed(GUIMutable source, GUIConnection target) {
if (source instanceof GUINode) {
// if the source is a node, all inputs and some nodes are valid
if (target instanceof GUIInput) {
@@ -119,23 +176,18 @@ public class ChromosomePane extends ScrollPane {
} else if (target instanceof GUINode) {
// target and source are nodes, let's look at levels back
Node t = ((GUINode) target).getNode(), s = ((GUINode) source).getNode();
- if (s.getColumn() - t.getColumn() > 0 && s.getColumn() - t.getColumn() <= 1 /* TODO this should be levels back */) {
+ if (s.getColumn() - t.getColumn() > 0 && s.getColumn() - t.getColumn() <= GUI.resources.levelsBack()) {
return true;
}
- return false;
- } else if (target instanceof GUIOutput) {
- return false;
- } else {
- throw new ClassCastException("Target was neither GUINode nor GUIInput nor GUIOutput.");
}
+ return false;
} else if (source instanceof GUIOutput) {
// if the source is an output, any node or input is valid
if (target instanceof GUINode || target instanceof GUIInput) {
return true;
- } else if (target instanceof GUIOutput) {
- return false;
} else {
- throw new ClassCastException("Target was neither GUINode nor GUIInput nor GUIOutput.");
+ // this should never happen...
+ return false;
}
}
// if the source was neither node nor output, something bad is happening