aboutsummaryrefslogtreecommitdiffstats
path: root/src/jcgp/gui/constants/Position.java
diff options
context:
space:
mode:
authorEduardo Pedroni <e.pedroni91@gmail.com>2014-11-23 16:06:59 +0000
committerEduardo Pedroni <e.pedroni91@gmail.com>2014-11-23 16:06:59 +0000
commit98e02b48ea5b83fa6c3247869b841b0afd260a89 (patch)
tree1dd0270f7639fb53a8dce42eda6b22112283b542 /src/jcgp/gui/constants/Position.java
parent80ed9dc59ece5913f7403dd669f74074080a3867 (diff)
Commented some new files, optimised some methods, moved as much setting up as possible into the GUIGene constructors - ChromosomePane is slightly tidier now.
Diffstat (limited to 'src/jcgp/gui/constants/Position.java')
-rw-r--r--src/jcgp/gui/constants/Position.java79
1 files changed, 72 insertions, 7 deletions
diff --git a/src/jcgp/gui/constants/Position.java b/src/jcgp/gui/constants/Position.java
index a13d21e..144ba6d 100644
--- a/src/jcgp/gui/constants/Position.java
+++ b/src/jcgp/gui/constants/Position.java
@@ -1,5 +1,6 @@
package jcgp.gui.constants;
+import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import jcgp.gui.GUI;
import jcgp.gui.population.GUIGene;
@@ -7,34 +8,98 @@ import jcgp.gui.population.GUIInput;
import jcgp.gui.population.GUINode;
import jcgp.gui.population.GUIOutput;
+/**
+ * Abstracts the task of positioning GUI components.
+ * <br>
+ * Do not instantiate this class; instead, use the {@code public static} methods provided.
+ *
+ * @author Eduardo Pedroni
+ *
+ */
public final class Position {
+ /**
+ * Private constructor to prevent instantiation.
+ */
+ private Position() {}
+
+ /**
+ * Sets the X and Y layouts of the specified input to the appropriate values, according to its index.
+ *
+ * @param input the {@code GUIInput} instance to relocate.
+ */
public static void place(GUIInput input) {
- input.relocate(0,
- input.getInput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING));
+ // inputs are the first column, so we only worry about the margin and their index
+ input.relocate(Constants.CHROMOSOME_PANE_MARGIN,
+ input.getInput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN);
}
+ /**
+ * Sets the X and Y layouts of the specified node to the appropriate values, according to its row and column values.
+ * This also connects the start of every line with its respective socket. Therefore, this method should be called at least
+ * once when the {@code GUINode} is instantiated.
+ *
+ * @param node the {@code GUINode} instance to relocate.
+ */
public static void place(GUINode node) {
- // TODO cut down method calls
- double xOffset = ((node.getNode().getColumn() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING));
- double yOffset = node.getNode().getRow() * (2 * Constants.NODE_RADIUS + Constants.SPACING);
+ // calculate x and y offsets, in relation to the layout origin
+ double xOffset = (node.getNode().getColumn() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN;
+ double yOffset = node.getNode().getRow() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN;
+
+ // move node
node.relocate(xOffset, yOffset);
+ // use the offset and the socket positions to connect the lines
for (int i = 0; i < GUI.resources.arity(); i++) {
node.getLine(i).setStartX(node.getSocket(i).getCenterX() + xOffset + Constants.NODE_RADIUS + Constants.SOCKET_RADIUS);
node.getLine(i).setStartY(node.getSocket(i).getCenterY() + yOffset + Constants.NODE_RADIUS);
}
}
+ /**
+ * Sets the X and Y layouts of the specified output to the appropriate values, according to its index.
+ * This also connects the start of the output's single line to its single input socket.Therefore,
+ * this method should be called at least once when the {@code GUIOutput} is instantiated.
+ *
+ * @param output the {@code GUIOutput} instance to relocate.
+ */
public static void place(GUIOutput output) {
- output.relocate(((GUI.resources.columns() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)),
- output.getOutput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING));
+ // the output's position is a function of the number of columns and its own index
+ output.relocate(((GUI.resources.columns() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.CHROMOSOME_PANE_MARGIN,
+ output.getOutput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN);
output.getLine().setStartX(output.getLayoutX() - Constants.NODE_RADIUS);
output.getLine().setStartY(output.getLayoutY());
}
+
+
+ /**
+ * Connects the end of a specified line to the specified gene.
+ *
+ * @param line the line to connect.
+ * @param target the target gene to connect to.
+ */
public static void connect(Line line, GUIGene target) {
+ // set line ends based on the layout position of the target
line.setEndX(target.getLayoutX() + Constants.NODE_RADIUS);
line.setEndY(target.getLayoutY());
}
+
+ /**
+ * Relocates the given socket to the appropriate position given the
+ * socket's index.
+ *
+ * @param index the socket index.
+ * @param socket the {@code Circle} instance to relocate.
+ */
+ public static void placeSocket(int index, Circle socket) {
+ // calculate the angle with respect to the x-axis
+ double angle = (((index + 1) / ((double) (GUI.resources.arity() + 1))) * Constants.THETA) - (Constants.THETA / 2);
+ // convert to cartesian form
+ double xPos = -Math.cos(angle) * Constants.NODE_RADIUS;
+ double yPos = Math.sin(angle) * Constants.NODE_RADIUS;
+ // set centre
+ socket.setCenterX(xPos);
+ socket.setCenterY(yPos);
+ }
}