List of commits:
Subject Hash Author Date (UTC)
implemented first version of visualization a218089ef758c0fd525d3bbe16163d71eb4c6833 SF2311 2018-04-25 20:32:26
implemented first version of 2-opt-change algorithm 376954bfb1e24116e0935d70263c0ec0c2792b92 SF2311 2018-04-25 16:29:06
just to update 2fa820634306068c8a97315ecb29661604bb34dc SF2311 2018-04-25 14:21:33
Merge branch 'dev' of T:\GIPS\Klassen\2017_GIPS_J1\Informatik JB\ts into dev 0fa550b00774b011f7e87ef1ac5b8fbdb9abb0bc ani.moosb 2018-04-25 13:25:48
prepared data structure ad7e293e1679e05d274ebcacf043522c2f3e8f5c SF2311 2018-04-25 13:21:54
new class Algorythm to implement BrutForce algorithm cd2f3565cc145dd9f14290b727f74ea0281ef2c7 ani.moosb 2018-04-25 13:12:14
prepared data structure 0d55315b39e973974793aadfc188dc9e055ef029 SF2311 2018-04-25 13:10:50
added class City for represnetation of data 057841348e42a9bf916d6b5bf8d8f069a8e4f555 SF2311 2018-04-25 12:42:18
new class Algorythm to implement BrutForce algorithm c0ba57e67447133ed5b2fcde4cc9c6a2c61a1036 ani.moosb 2018-04-25 12:29:31
Fixed menu loading problems 9858b4b11fd912d8b40e681b772bf0ef16678ca6 SF2311 2018-04-20 17:07:20
Added Menu loading 428354d568e6bf97e45ec4c416ce9b3db227eea4 SF2311 2018-04-20 16:12:55
designed main window added launching main window added first menu part in form of gridpane 1f4e52733f4aeb9524fb0f40f8cf7604aaf17898 SF2311 2018-04-19 16:15:30
prepared User interface cfad65413554fbd7a1026f2c8e73e73e996df69d SF2311 2018-04-18 18:51:26
initial commit 272ab94837f2e39f77b768df08a25a78466d52d1 SF2311 2018-04-18 18:43:17
Commit a218089ef758c0fd525d3bbe16163d71eb4c6833 - implemented first version of visualization
Author: SF2311
Author date (UTC): 2018-04-25 20:32
Committer name: SF2311
Committer date (UTC): 2018-04-25 20:32
Parent(s): 376954bfb1e24116e0935d70263c0ec0c2792b92
Signing key:
Tree: c356c4bb0511f5e71985d48093727c9db379b4bb
File Lines added Lines deleted
src/salesman/algorithms/AlgorithmBrutForce.java 18 0
src/salesman/data/Data.java 28 4
src/salesman/data/ObservableBoolean.java 53 0
src/salesman/ui/Algorythm.java 0 24
src/salesman/ui/BrutForceController.java 11 10
src/salesman/ui/MainWindow.fxml 7 3
src/salesman/ui/MainWindowController.java 65 16
src/salesman/ui/MenuBrutForce.fxml 2 2
src/salesman/ui/UILoader.java 2 1
File src/salesman/algorithms/AlgorithmBrutForce.java changed (mode: 100644) (index 8a0bc1f..1c07575)
1 1 package salesman.algorithms; package salesman.algorithms;
2 2
3 import salesman.data.City;
4 import salesman.ui.MainWindowController;
5
6 import java.util.Random;
7
3 8 public class AlgorithmBrutForce extends Thread{ public class AlgorithmBrutForce extends Thread{
9 private MainWindowController mwc;
4 10
11 City[] cities = new City[mwc.getNumOfCities()];
5 12
13 public AlgorithmBrutForce(MainWindowController mwc){
14 this.mwc=mwc;
15 }
6 16
7 17 @Override @Override
8 18 public void run(){ public void run(){
9 19
20 for(int i =0;i<cities.length;i++){
21 Random r = new Random();
22
23 cities[i] =new City(r.nextInt(600), r.nextInt(800), i);
24 }
25
26
27
10 28 } }
11 29
12 30 } }
File src/salesman/data/Data.java changed (mode: 100644) (index 77d21cb..76c0a3b)
1 1 package salesman.data; package salesman.data;
2 2
3 import javafx.collections.ArrayChangeListener;
4 import javafx.collections.FXCollections;
5 import javafx.collections.ObservableArray;
6 import javafx.scene.canvas.Canvas;
7 import javafx.scene.canvas.GraphicsContext;
8 import salesman.ui.MainWindowController;
9
3 10 import java.util.Random; import java.util.Random;
4 11
5 12 public class Data { public class Data {
6 City[] cities;
7 double[][] distances;
8 Order bestEver;
13 private City[] cities;
14 private double[][] distances;
15 private Order bestEver;
16
17 private ObservableArray currentOrder = FXCollections.observableIntegerArray();
18
9 19
10 20 public Data(int number){ public Data(int number){
11 21 Random r = new Random(); Random r = new Random();
 
... ... public class Data {
14 24
15 25
16 26 for(int i=0;i<number;i++){ for(int i=0;i<number;i++){
17 cities[i] = new City(r.nextInt(600),r.nextInt(780),i);
27 cities[i] = new City(r.nextInt(770),r.nextInt(560),i);
18 28 } }
19 29
20 30 for (int i = 0; i <number; i++) { for (int i = 0; i <number; i++) {
 
... ... public class Data {
22 32 distances[i][j]=City.getDistancce(cities[i],cities[j]); distances[i][j]=City.getDistancce(cities[i],cities[j]);
23 33 } }
24 34 } }
35
36 currentOrder.addListener(new ArrayListener());
25 37 }//constructor int number }//constructor int number
26 38
27 39 public Data(City[] cities){ public Data(City[] cities){
 
... ... public class Data {
37 49 distances[i][j] = Math.sqrt((deltaX*deltaX)+(deltaY*deltaY)); distances[i][j] = Math.sqrt((deltaX*deltaX)+(deltaY*deltaY));
38 50 } }
39 51 } }
52
53 currentOrder.addListener(new ArrayListener());
40 54 //constructor City[] //constructor City[]
41 55 } }
42 56
 
... ... public class Data {
47 61 public double[][] getDistances() { public double[][] getDistances() {
48 62 return distances; return distances;
49 63 } }
64
65
66
67 private class ArrayListener implements ArrayChangeListener {
68
69 @Override
70 public void onChanged(ObservableArray observableArray, boolean sizeChanged, int from, int to) {
71 MainWindowController.repaint.set(true);
72 }
73 }
50 74 } }
File src/salesman/data/ObservableBoolean.java added (mode: 100644) (index 0000000..4c9bb02)
1 package salesman.data;
2
3 import javafx.beans.InvalidationListener;
4 import javafx.beans.value.ChangeListener;
5 import javafx.beans.value.ObservableBooleanValue;
6
7 import java.util.ArrayList;
8 import java.util.EventListener;
9 import java.util.List;
10
11 public class ObservableBoolean implements ObservableBooleanValue {
12
13 private boolean value;
14 private List<ChangeListener> changeListeners = new ArrayList<>();
15
16 @Override
17 public boolean get() {
18 return value = false;
19 }
20
21 public void set(boolean toSet){
22 boolean oldValue = value;
23 value=toSet;
24 for (ChangeListener listener :changeListeners) {
25 listener.changed(this,oldValue,value);
26 }
27 }
28
29 @Override
30 public void addListener(ChangeListener<? super Boolean> listener) {
31 changeListeners.add(listener);
32 }
33
34 @Override
35 public void removeListener(ChangeListener<? super Boolean> listener) {
36 changeListeners.remove(listener);
37 }
38
39 @Override
40 public Boolean getValue() {
41 return value;
42 }
43
44 @Override
45 public void addListener(InvalidationListener listener) {
46
47 }
48
49 @Override
50 public void removeListener(InvalidationListener listener) {
51
52 }
53 }
File src/salesman/ui/Algorythm.java deleted (index ed7724d..0000000)
1 package salesman.ui;
2
3 import salesman.data.City;
4
5 import java.util.Random;
6
7 public class Algorythm extends Thread{
8
9 City[] cities = new City[MainWindowController.getNumOfCities()];
10
11 @Override
12 public void run(){
13
14 for(int i =0;i<cities.length;i++){
15 Random r = new Random();
16
17 cities[i] =new City(r.nextInt(600), r.nextInt(800), i);
18 }
19
20
21
22 }
23
24 }
File src/salesman/ui/BrutForceController.java changed (mode: 100644) (index 7fc0fd9..e270b5b)
1 1 package salesman.ui; package salesman.ui;
2 2
3 import javafx.event.ActionEvent;
4 import javafx.event.EventHandler;
5 3 import javafx.fxml.FXML; import javafx.fxml.FXML;
6 4 import javafx.scene.control.Button; import javafx.scene.control.Button;
7 5 import salesman.algorithms.AlgorithmBrutForce; import salesman.algorithms.AlgorithmBrutForce;
 
... ... import salesman.algorithms.AlgorithmBrutForce;
9 7
10 8 public class BrutForceController { public class BrutForceController {
11 9 @FXML @FXML
12 Button btnStart;
10 private Button btnStart;
11
12 private MainWindowController mwc;
13
14
15
16 public BrutForceController(MainWindowController mwc){
17 this.mwc=mwc;
18 }
13 19
14 20 @FXML @FXML
15 private void initialize(){
16 btnStart.setOnAction(new EventHandler<ActionEvent>() {
17 @Override
18 public void handle(ActionEvent event) {
19 new AlgorithmBrutForce().start();
20 }
21 });
21 public void initialize(){
22 btnStart.setOnAction(event -> new AlgorithmBrutForce(mwc).start());
22 23 } }
23 24 } }
File src/salesman/ui/MainWindow.fxml changed (mode: 100644) (index d47859a..6918f71)
1 1 <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
2 2
3 <?import javafx.scene.canvas.Canvas?>
3 4 <?import javafx.scene.chart.CategoryAxis?> <?import javafx.scene.chart.CategoryAxis?>
4 5 <?import javafx.scene.chart.LineChart?> <?import javafx.scene.chart.LineChart?>
5 6 <?import javafx.scene.chart.NumberAxis?> <?import javafx.scene.chart.NumberAxis?>
 
12 13 <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.AnchorPane?>
13 14 <?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.ColumnConstraints?>
14 15 <?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.GridPane?>
15 <?import javafx.scene.layout.Pane?>
16 16 <?import javafx.scene.layout.RowConstraints?> <?import javafx.scene.layout.RowConstraints?>
17 17 <?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
18 18
 
35 35 </rowConstraints> </rowConstraints>
36 36 <children> <children>
37 37 <Label text="Anzahl Städte" /> <Label text="Anzahl Städte" />
38 <TextField text="10" GridPane.columnIndex="1" fx:id="txtFieldNumCities"/>
38 <TextField fx:id="txtFieldNumCities" text="10" GridPane.columnIndex="1" />
39 39 <ComboBox fx:id="cBalgorithm" prefWidth="150.0" promptText="Algorithmus" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" /> <ComboBox fx:id="cBalgorithm" prefWidth="150.0" promptText="Algorithmus" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" />
40 40 </children> </children>
41 41 </GridPane> </GridPane>
 
71 71 <tabs> <tabs>
72 72 <Tab text="TSP"> <Tab text="TSP">
73 73 <content> <content>
74 <Pane fx:id="paneCities" onMouseClicked="#paneCitiesMouseClick" prefHeight="600.0" prefWidth="800.0" style="-fx-background-color: #FFFFFF;" />
74 <AnchorPane>
75 <children>
76 <Canvas fx:id="canvasCities" height="558.0" width="770.0" AnchorPane.bottomAnchor="1.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
77 </children>
78 </AnchorPane>
75 79 </content> </content>
76 80 </Tab> </Tab>
77 81 <Tab text="Daten"> <Tab text="Daten">
File src/salesman/ui/MainWindowController.java changed (mode: 100644) (index 57e82cd..ddb0880)
... ... import javafx.collections.FXCollections;
6 6 import javafx.collections.ObservableList; import javafx.collections.ObservableList;
7 7 import javafx.fxml.FXML; import javafx.fxml.FXML;
8 8 import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
9 import javafx.scene.canvas.Canvas;
10 import javafx.scene.canvas.GraphicsContext;
9 11 import javafx.scene.control.ComboBox; import javafx.scene.control.ComboBox;
10 12 import javafx.scene.control.TextField; import javafx.scene.control.TextField;
11 13 import javafx.scene.input.MouseEvent; import javafx.scene.input.MouseEvent;
12 14 import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
13 import javafx.scene.layout.Pane;
14 15 import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
16 import javafx.scene.paint.Color;
17 import salesman.data.City;
15 18 import salesman.data.Data; import salesman.data.Data;
19 import salesman.data.ObservableBoolean;
16 20
17 21 import java.io.IOException; import java.io.IOException;
18 22
 
... ... public class MainWindowController {
21 25 @FXML @FXML
22 26 private ComboBox cBalgorithm; private ComboBox cBalgorithm;
23 27 @FXML @FXML
24 private Pane paneCities;
28 private Canvas canvasCities;
25 29 @FXML @FXML
26 30 private VBox upperMenu; private VBox upperMenu;
27 31 @FXML @FXML
28 private static TextField txtFieldNumCities;
32 private TextField txtFieldNumCities;
29 33
30 public static int getNumOfCities(){
31 return Integer.valueOf(txtFieldNumCities.getText());
34 public int getNumOfCities() {
35 return Integer.valueOf(txtFieldNumCities.
36 getText());
32 37 } }
38
33 39 public static Data data = new Data(10); public static Data data = new Data(10);
40 public static ObservableBoolean repaint = new ObservableBoolean();
34 41
35 42 private GridPane actualMenu; private GridPane actualMenu;
36 43
37 44
38 45 @FXML @FXML
39 public void initialize(){
46 public void initialize() {
40 47 try { try {
41 48 loadNewMenu("BrutForce"); loadNewMenu("BrutForce");
42 49 } catch (IOException e) { } catch (IOException e) {
 
... ... public class MainWindowController {
51 58 //TODO implement menu changes //TODO implement menu changes
52 59 } }
53 60 }); });
54 ObservableList<String> items= FXCollections.observableArrayList();
61 ObservableList<String> items = FXCollections.observableArrayList();
55 62 cBalgorithm.setItems(items); cBalgorithm.setItems(items);
56 63 cBalgorithm.getItems().add("BrutForce"); cBalgorithm.getItems().add("BrutForce");
57 }
58 64
65 repaint.addListener(new RepaintListener());
66 repaint.set(true);
67
68 }//initialize()
59 69
60 private void loadNewMenu(String menuName)throws IOException {
61 GridPane newMenu=null;
62 switch (menuName){
70
71 private void loadNewMenu(String menuName) throws IOException {
72 GridPane newMenu = null;
73 switch (menuName) {
63 74 case "BrutForce": case "BrutForce":
64 newMenu = FXMLLoader.load(getClass().getResource("MenuBrutForce.fxml"));
75 FXMLLoader loader = new FXMLLoader(getClass().getResource("MenuBrutForce.fxml"));
76 BrutForceController c = new BrutForceController(this);
77 loader.setController(c);
78 newMenu = loader.load();
65 79 break; break;
66 80 default: default:
67 81 throw new IllegalArgumentException("String 'menuName' didn't match aany menu available"); throw new IllegalArgumentException("String 'menuName' didn't match aany menu available");
68 82 } }
69 if(!(actualMenu ==null))
70 upperMenu.getChildren().remove(actualMenu);
83 if (!(actualMenu == null))
84 upperMenu.getChildren().remove(actualMenu);
71 85 upperMenu.getChildren().add(newMenu); upperMenu.getChildren().add(newMenu);
72 actualMenu=newMenu;
86 actualMenu = newMenu;
73 87 } }
74 88
75 89 @FXML @FXML
76 public void paneCitiesMouseClick(MouseEvent event){
90 public void paneCitiesMouseClick(MouseEvent event) {
77 91 //TODO implement city-generation here //TODO implement city-generation here
78 92 } }
93
94
95
96
97
98
99 private class RepaintListener implements ChangeListener<Boolean> {
100
101 @Override
102 public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
103 int numCities =getNumOfCities();
104 if (newValue) {
105 GraphicsContext gc = canvasCities.getGraphicsContext2D();
106 gc.clearRect(0, 0, canvasCities.getWidth(), canvasCities.getHeight());
107 for (int i = 0; i < numCities; i++) {
108 City current = data.getCities()[i];
109 City next;
110 if ((i + 1) > numCities - 1) {
111 next = data.getCities()[0];
112 } else {
113 next = data.getCities()[i + 1];
114 }
115
116
117
118 gc.setStroke(new Color(0, 0, 0, 1));
119 gc.setFill((Color.GRAY));
120 gc.fillOval(current.getX()-5, current.getY()-5, 10, 10);
121 gc.strokeLine(current.getX(),current.getY(),next.getX(),next.getY());
122
123 }
124 repaint.set(false);
125 }
126 }
127 }
79 128 } }
File src/salesman/ui/MenuBrutForce.fxml changed (mode: 100644) (index 0e6a994..07d3a2c)
6 6 <?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.GridPane?>
7 7 <?import javafx.scene.layout.RowConstraints?> <?import javafx.scene.layout.RowConstraints?>
8 8
9 <GridPane maxHeight="230.0" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="230.0" prefWidth="220.0" style="-fx-border-color: #ffffff;" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="salesman.ui.BrutForceController">
9 <GridPane maxHeight="230.0" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="230.0" prefWidth="220.0" style="-fx-border-color: #ffffff;" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1">
10 10 <columnConstraints> <columnConstraints>
11 11 <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
12 12 <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
 
17 17 <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
18 18 </rowConstraints> </rowConstraints>
19 19 <children> <children>
20 <Button mnemonicParsing="false" text="Start" fx:id="btnStart" />
20 <Button fx:id="btnStart" mnemonicParsing="false" text="Start" />
21 21 </children> </children>
22 22 <padding> <padding>
23 23 <Insets left="5.0" /> <Insets left="5.0" />
File src/salesman/ui/UILoader.java changed (mode: 100644) (index b39e9eb..08701c6)
... ... import javafx.stage.Stage;
9 9 public class UILoader extends Application { public class UILoader extends Application {
10 10 @Override @Override
11 11 public void start(Stage primaryStage) throws Exception { public void start(Stage primaryStage) throws Exception {
12 Parent root = FXMLLoader.load(getClass().getResource("MainWindow.fxml"));
12 FXMLLoader loader =new FXMLLoader(getClass().getResource("MainWindow.fxml"));
13 Parent root = loader.load();
13 14 Scene scene = new Scene(root); Scene scene = new Scene(root);
14 15 primaryStage.setScene(scene); primaryStage.setScene(scene);
15 16 primaryStage.show(); primaryStage.show();
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/SF2311/travelling-salesman

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/SF2311/travelling-salesman

Clone this repository using git:
git clone git://git.rocketgit.com/user/SF2311/travelling-salesman

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main