aboutsummaryrefslogtreecommitdiffstats
path: root/src/jcgp/gui/population/ChromosomePane.java
blob: 7fa8a54bed9bab37e52a6c989c8408ceba4d0a7a (plain)
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
102
103
104
105
106
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.GUI;
import jcgp.population.Chromosome;
import jcgp.population.Connection;
import jcgp.population.Input;
import jcgp.population.Node;


public class ChromosomePane extends ScrollPane {

	private GUINode[][] guiNodes;
	private GUIInput[] guiInputs;
	private GUIOutput[] guiOutputs;
	
	private Pane content;
	
	private ArrayList<Line> connectionLines;
	
	private boolean target = false;
	
	public ChromosomePane(Chromosome chromosome) {
		super();		
		connectionLines = new ArrayList<Line>();
		
		//setMouseTransparent(true);
		
		content = new Pane();
		content.setId("content pane for genes");
		
		// generate the GUIGenes
		// inputs
		guiInputs = new GUIInput[(int) GUI.resources.get("inputs")];
		for (int i = 0; i < guiInputs.length; i++) {
			// make the GUI elements
			guiInputs[i] = new GUIInput(this, chromosome.getInput(i));
			content.getChildren().addAll(guiInputs[i]);
		}
		// nodes
		guiNodes = new GUINode[(int) GUI.resources.get("rows")][(int) GUI.resources.get("columns")];
		double angle, xPos, yPos;
		for (int r = 0; r < guiNodes.length; r++) {
			for (int c = 0; c < guiNodes[r].length; c++) {
				// make the connection lines
				Line lines[] = new Line[(int) GUI.resources.get("arity")];
				for (int l = 0; l < lines.length; l++) {
					angle = ((((double) (l + 1)) / ((double) (lines.length + 1))) * GUIGene.THETA) - (GUIGene.THETA / 2);
					xPos = (-Math.cos(angle) * GUIGene.NODE_RADIUS) + (((c + 1) * (2 * GUIGene.NODE_RADIUS + GUIGene.SPACING)) + GUIGene.NODE_RADIUS);
					yPos = (Math.sin(angle) * GUIGene.NODE_RADIUS) + ((r * (2 * GUIGene.NODE_RADIUS + GUIGene.SPACING)) + GUIGene.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(this, chromosome.getNode(r, c), lines);
			}
			content.getChildren().addAll(guiNodes[r]);
		}
		
		// outputs
		guiOutputs = new GUIOutput[(int) GUI.resources.get("outputs")];
		for (int i = 0; i < guiOutputs.length; i++) {
			xPos = (((int) GUI.resources.get("columns") + 1) * (2 * GUIGene.NODE_RADIUS + GUIGene.SPACING));
			yPos = (chromosome.getOutput(i).getIndex() * (2 * GUIGene.NODE_RADIUS + GUIGene.SPACING)) + GUIGene.NODE_RADIUS;
			// make the line
			Line line = new Line(xPos, yPos, xPos, yPos);
			line.setMouseTransparent(true);
			line.setVisible(false);
			connectionLines.add(line);
			// make the GUI elements
			guiOutputs[i] = new GUIOutput(this, chromosome.getOutput(i), line);
			content.getChildren().addAll(guiOutputs[i]);
		}

		content.getChildren().addAll(connectionLines);
		setPrefWidth(620);	
		setContent(content);
	}
	
	public 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();
		}
		
	}
	
	public boolean isTarget() {
		return target;
	}
	
	public void setTarget(boolean newValue) {
		target = newValue;
	}
}