-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathUserInterface.java
More file actions
112 lines (94 loc) · 5.29 KB
/
UserInterface.java
File metadata and controls
112 lines (94 loc) · 5.29 KB
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
107
108
109
110
111
112
import java.util.ArrayList;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.canvas.Canvas;
public class UserInterface extends Application{
private Stage window;
private static final int WINDOW_WIDTH = 801;
private static final int WINDOW_HEIGHT = 601;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
this.window = primaryStage;
window.setTitle("Spirograph generator");
SliderBuilder sliderBuilder = new SliderBuilder(); // Factory class for building sliders in one line
LabelBuilder labelBuilder = new LabelBuilder(); // Label factory
Slider sliderFixedRadius = sliderBuilder.buildSlider(1, 100, 31, 0.1); // variable n
Slider sliderMovingRadius = sliderBuilder.buildSlider(1, 100, 12, 0.1); // variable m
Slider sliderPenOffset = sliderBuilder.buildSlider(-10, 10, 2.4, 0.01); // variable f
Slider sliderLoops = sliderBuilder.buildSlider(0, 150, 20, 0.1);
Slider sliderScale = sliderBuilder.buildSlider(0.1, 200, 10, 0.1);
Slider sliderXOffset = sliderBuilder.buildSlider(-500, 500, -100, 1);
Slider sliderYOffset = sliderBuilder.buildSlider(-500, 500, 0, 1);
Label labelFixedRadius = labelBuilder.buildLabel(" Fixed radius:");
Label labelMovingRadius = labelBuilder.buildLabel(" Moving radius:");
Label labelPenOffset = labelBuilder.buildLabel(" Pen offset:");
Label labelLoops = labelBuilder.buildLabel(" Number of loops:");
Label labelScale = labelBuilder.buildLabel(" Scale:");
Label labelXOffset = labelBuilder.buildLabel(" x Offset:");
Label labelYOffset = labelBuilder.buildLabel(" y Offset:");
Canvas canvas = new Canvas(WINDOW_WIDTH, WINDOW_HEIGHT);
Pane wrapperPane = new Pane();
wrapperPane.getChildren().add(canvas); // required for proper resizing of canvas
// Bind the width/height property to the wrapper Pane
canvas.widthProperty().bind(wrapperPane.widthProperty());
canvas.heightProperty().bind(wrapperPane.heightProperty());
GraphicsContext gc = canvas.getGraphicsContext2D(); // this is used to actually draw stuff
VBox leftMenu = new VBox(); // left aligned menu
leftMenu.getChildren().addAll(labelFixedRadius, sliderFixedRadius,
labelMovingRadius,sliderMovingRadius,
labelPenOffset, sliderPenOffset,
labelLoops, sliderLoops,
labelScale, sliderScale,
labelXOffset, sliderXOffset,
labelYOffset, sliderYOffset);
Slider[] sliderArray = new Slider[]{sliderFixedRadius, sliderMovingRadius, sliderPenOffset, sliderLoops, sliderScale, sliderXOffset, sliderYOffset};
for (Slider slider : sliderArray) {
makeSliderUpdateDynamically(slider, canvas, gc, sliderFixedRadius, sliderMovingRadius, sliderPenOffset, sliderLoops, sliderScale, sliderXOffset, sliderYOffset);
}
BorderPane borderPane = new BorderPane();
borderPane.setLeft(leftMenu);
borderPane.setCenter(wrapperPane);
// standard code present in every javafx GUI application
Scene scene = new Scene(borderPane, WINDOW_WIDTH, WINDOW_HEIGHT);
window.setScene(scene);
window.show();
paint(gc, sliderFixedRadius.getValue(), sliderMovingRadius.getValue(), sliderPenOffset.getValue(), sliderLoops.getValue(), sliderScale.getValue(), sliderXOffset.getValue(), sliderYOffset.getValue()); // paint the initial spirograph
}
private void paint(GraphicsContext gc, double fixedRadius, double movingRadius, double penOffset, double loops, double scale, double xOffset, double yOffset) {
// paints the spirograph
// Hypocycloid hypocloid = new Hypocycloid(250, 56, 5, 1, 10, -100, 0);
Hypocycloid hypocycloid = new Hypocycloid(fixedRadius, movingRadius, penOffset, loops, scale, xOffset, yOffset);
ArrayList<Tuple<Double, Double>> coordList = new ArrayList<Tuple<Double, Double>>();
coordList = hypocycloid.getCoordList();
gc.setStroke(Color.RED);
for (int i = 0; i < coordList.size() - 1; i++) {
Tuple<Double, Double> point1 = coordList.get(i);
Tuple<Double, Double> point2 = coordList.get(i + 1);
gc.strokeLine(point1.getX() + WINDOW_WIDTH / 2, point1.getY() + WINDOW_HEIGHT / 2, point2.getX() + WINDOW_WIDTH / 2, point2.getY() + WINDOW_HEIGHT / 2);
}
}
private void makeSliderUpdateDynamically(Slider masterSlider, Canvas canvas, GraphicsContext gc, Slider sliderFixedRadius, Slider sliderMovingRadius, Slider sliderPenOffset, Slider sliderLoops, Slider sliderScale, Slider sliderXOffset, Slider sliderYOffset) {
masterSlider.valueProperty().addListener(new ChangeListener<Object>() {
@Override
public void changed(ObservableValue<?> arg0, Object arg1, Object arg2) {
gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
paint(gc, sliderFixedRadius.getValue(), sliderMovingRadius.getValue(), sliderPenOffset.getValue(), sliderLoops.getValue(), sliderScale.getValue(), sliderXOffset.getValue(), sliderYOffset.getValue());
}
});
}
}