-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 6652d70
Showing
14 changed files
with
528 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
.idea/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<module type="JAVA_MODULE" version="4"> | ||
<component name="NewModuleRootManager" inherit-compiler-output="true"> | ||
<exclude-output /> | ||
<content url="file://$MODULE_DIR$"> | ||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> | ||
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" /> | ||
</content> | ||
<orderEntry type="inheritedJdk" /> | ||
<orderEntry type="sourceFolder" forTests="false" /> | ||
</component> | ||
</module> |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
|
||
<?import javafx.geometry.Insets?> | ||
<?import javafx.scene.canvas.Canvas?> | ||
<?import javafx.scene.control.Button?> | ||
<?import javafx.scene.control.Label?> | ||
<?import javafx.scene.control.TextField?> | ||
<?import javafx.scene.layout.BorderPane?> | ||
<?import javafx.scene.layout.ColumnConstraints?> | ||
<?import javafx.scene.layout.GridPane?> | ||
<?import javafx.scene.layout.RowConstraints?> | ||
<?import javafx.scene.layout.StackPane?> | ||
|
||
<BorderPane fx:id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="pendulum.Controller"> | ||
<center> | ||
<StackPane fx:id="stackPane_canvas" BorderPane.alignment="CENTER"> | ||
<children> | ||
<Canvas fx:id="canvas" height="500.0" width="500.0" /> | ||
</children> | ||
</StackPane> | ||
</center> | ||
<left> | ||
<GridPane hgap="10.0" minHeight="0.0" prefHeight="0.0" BorderPane.alignment="CENTER"> | ||
<columnConstraints> | ||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="110.0" /> | ||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> | ||
</columnConstraints> | ||
<rowConstraints> | ||
<RowConstraints minHeight="0.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="0.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="0.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="0.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
</rowConstraints> | ||
<children> | ||
<TextField fx:id="textField_mass1" onAction="#onTextFieldsParams" GridPane.columnIndex="1" /> | ||
<TextField fx:id="textField_mass2" onAction="#onTextFieldsParams" GridPane.columnIndex="1" GridPane.rowIndex="1" /> | ||
<TextField fx:id="textField_angle1" GridPane.columnIndex="1" GridPane.rowIndex="2" /> | ||
<TextField fx:id="textField_angle2" GridPane.columnIndex="1" GridPane.rowIndex="3" /> | ||
<Label text="Масса 1 (кг)"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="Масса 2 (кг)" GridPane.rowIndex="1"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="Угол 1 (град.)" GridPane.rowIndex="2"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="Угол 2 (град.)" GridPane.rowIndex="3"> | ||
<GridPane.margin> | ||
<Insets /> | ||
</GridPane.margin> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="G (м/с^2)" GridPane.rowIndex="6"> | ||
<GridPane.margin> | ||
<Insets /> | ||
</GridPane.margin> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<TextField fx:id="textField_g" onAction="#onTextFieldsParams" GridPane.columnIndex="1" GridPane.rowIndex="6" /> | ||
<Button fx:id="button_restart" mnemonicParsing="false" onAction="#onButtonRestart" text="Restart" GridPane.halignment="CENTER" GridPane.rowIndex="8" /> | ||
<Label text="Длина 1 (м)" GridPane.rowIndex="4"> | ||
<GridPane.margin> | ||
<Insets /> | ||
</GridPane.margin> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="Длина 2 (м)" GridPane.rowIndex="5"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<TextField fx:id="textField_length1" onAction="#onTextFieldsParams" GridPane.columnIndex="1" GridPane.rowIndex="4" /> | ||
<TextField fx:id="textField_length2" onAction="#onTextFieldsParams" GridPane.columnIndex="1" GridPane.rowIndex="5" /> | ||
<TextField fx:id="textField_scale" GridPane.columnIndex="1" GridPane.rowIndex="7" /> | ||
<Label text="Масштаб (м/пикс)" GridPane.rowIndex="7"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Button mnemonicParsing="false" onAction="#onButtonResetTrace" text="Reset Trace" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="8" GridPane.valignment="CENTER" /> | ||
</children> | ||
</GridPane> | ||
</left> | ||
</BorderPane> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
|
||
<?import javafx.geometry.Insets?> | ||
<?import javafx.scene.canvas.Canvas?> | ||
<?import javafx.scene.control.Button?> | ||
<?import javafx.scene.control.Label?> | ||
<?import javafx.scene.control.TextField?> | ||
<?import javafx.scene.layout.BorderPane?> | ||
<?import javafx.scene.layout.ColumnConstraints?> | ||
<?import javafx.scene.layout.GridPane?> | ||
<?import javafx.scene.layout.RowConstraints?> | ||
<?import javafx.scene.layout.StackPane?> | ||
|
||
<BorderPane fx:id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="pendulum.Controller"> | ||
<center> | ||
<StackPane fx:id="stackPane_canvas" BorderPane.alignment="CENTER"> | ||
<children> | ||
<Canvas fx:id="canvas" height="500.0" width="500.0" /> | ||
</children> | ||
</StackPane> | ||
</center> | ||
<left> | ||
<GridPane hgap="10.0" minHeight="0.0" prefHeight="0.0" BorderPane.alignment="CENTER"> | ||
<columnConstraints> | ||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="110.0" /> | ||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> | ||
</columnConstraints> | ||
<rowConstraints> | ||
<RowConstraints minHeight="0.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="0.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="0.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="0.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
<RowConstraints minHeight="10.0" prefHeight="40.0" vgrow="NEVER" /> | ||
</rowConstraints> | ||
<children> | ||
<TextField fx:id="textField_mass1" onAction="#onTextFieldsParams" GridPane.columnIndex="1" /> | ||
<TextField fx:id="textField_mass2" onAction="#onTextFieldsParams" GridPane.columnIndex="1" GridPane.rowIndex="1" /> | ||
<TextField fx:id="textField_angle1" GridPane.columnIndex="1" GridPane.rowIndex="2" /> | ||
<TextField fx:id="textField_angle2" GridPane.columnIndex="1" GridPane.rowIndex="3" /> | ||
<Label text="Масса 1 (кг)"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="Масса 2 (кг)" GridPane.rowIndex="1"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="Угол 1 (град.)" GridPane.rowIndex="2"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="Угол 2 (град.)" GridPane.rowIndex="3"> | ||
<GridPane.margin> | ||
<Insets /> | ||
</GridPane.margin> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="G (м/с^2)" GridPane.rowIndex="6"> | ||
<GridPane.margin> | ||
<Insets /> | ||
</GridPane.margin> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<TextField fx:id="textField_g" onAction="#onTextFieldsParams" GridPane.columnIndex="1" GridPane.rowIndex="6" /> | ||
<Button fx:id="button_restart" mnemonicParsing="false" onAction="#onButtonRestart" text="Restart" GridPane.halignment="CENTER" GridPane.rowIndex="8" /> | ||
<Label text="Длина 1 (м)" GridPane.rowIndex="4"> | ||
<GridPane.margin> | ||
<Insets /> | ||
</GridPane.margin> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Label text="Длина 2 (м)" GridPane.rowIndex="5"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<TextField fx:id="textField_length1" onAction="#onTextFieldsParams" GridPane.columnIndex="1" GridPane.rowIndex="4" /> | ||
<TextField fx:id="textField_length2" onAction="#onTextFieldsParams" GridPane.columnIndex="1" GridPane.rowIndex="5" /> | ||
<TextField fx:id="textField_scale" GridPane.columnIndex="1" GridPane.rowIndex="7" /> | ||
<Label text="Масштаб (м/пикс)" GridPane.rowIndex="7"> | ||
<padding> | ||
<Insets left="10.0" /> | ||
</padding> | ||
</Label> | ||
<Button mnemonicParsing="false" onAction="#onButtonResetTrace" text="Reset Trace" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="8" GridPane.valignment="CENTER" /> | ||
</children> | ||
</GridPane> | ||
</left> | ||
</BorderPane> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
package pendulum; | ||
|
||
import javafx.event.ActionEvent; | ||
import javafx.fxml.FXML; | ||
import javafx.scene.canvas.Canvas; | ||
import javafx.scene.control.TextField; | ||
import javafx.scene.control.TextFormatter; | ||
import javafx.scene.layout.BorderPane; | ||
import javafx.scene.layout.Region; | ||
import javafx.scene.layout.StackPane; | ||
|
||
import java.text.NumberFormat; | ||
import java.util.Locale; | ||
|
||
|
||
public class Controller { | ||
|
||
private static Controller instance; | ||
|
||
public static Controller getInstance() { | ||
return instance; | ||
} | ||
|
||
public Controller() { | ||
instance = this; | ||
} | ||
|
||
@FXML | ||
public Canvas canvas; | ||
@FXML | ||
public TextField textField_mass1; | ||
@FXML | ||
public TextField textField_mass2; | ||
@FXML | ||
public TextField textField_angle1; | ||
@FXML | ||
public TextField textField_angle2; | ||
@FXML | ||
public TextField textField_length1; | ||
@FXML | ||
public TextField textField_length2; | ||
@FXML | ||
public TextField textField_scale; | ||
@FXML | ||
public TextField textField_g; | ||
@FXML | ||
public StackPane stackPane_canvas; | ||
|
||
public void postInit() { | ||
canvas.widthProperty().bind(stackPane_canvas.widthProperty()); | ||
canvas.heightProperty().bind(stackPane_canvas.heightProperty()); | ||
textField_mass1.setTextFormatter(Main.createDoubleFormatter(9)); | ||
textField_mass2.setTextFormatter(Main.createDoubleFormatter(9)); | ||
textField_angle1.setTextFormatter(Main.createDoubleFormatter(3)); | ||
textField_angle2.setTextFormatter(Main.createDoubleFormatter(3)); | ||
textField_length1.setTextFormatter(Main.createDoubleFormatter(9)); | ||
textField_length2.setTextFormatter(Main.createDoubleFormatter(9)); | ||
textField_g.setTextFormatter(Main.createDoubleFormatter(9)); | ||
textField_scale.setTextFormatter(Main.createDoubleFormatter(9)); | ||
textField_mass1.setText("10"); | ||
textField_mass2.setText("10"); | ||
textField_angle1.setText("50"); | ||
textField_angle2.setText("65"); | ||
textField_length1.setText("1"); | ||
textField_length2.setText("1"); | ||
textField_g.setText("9.8"); | ||
textField_scale.setText("0.01"); | ||
stackPane_canvas.setMinSize(0, 0); | ||
stackPane_canvas.setPrefSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); | ||
} | ||
|
||
@FXML | ||
public void onButtonRestart() { | ||
Main.restart(); | ||
} | ||
|
||
@FXML | ||
public void onButtonResetTrace() { | ||
Main.getDrawer().resetTrace(); | ||
} | ||
|
||
@FXML | ||
public void onTextFieldsParams() { | ||
Main.updateSimulator(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
package pendulum; | ||
|
||
import javafx.application.Platform; | ||
import javafx.scene.canvas.Canvas; | ||
import javafx.scene.canvas.GraphicsContext; | ||
import javafx.scene.paint.Color; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
public class Drawer implements Runnable { | ||
|
||
private Controller controller = Controller.getInstance(); | ||
private Canvas canvas = controller.canvas; | ||
private List<Point> points = new ArrayList<>(); | ||
GraphicsContext gc = canvas.getGraphicsContext2D(); | ||
|
||
double density = 1000; // kg in m^3 | ||
double scale = Double.parseDouble(controller.textField_scale.getText()); | ||
@Override | ||
public void run() { | ||
try { | ||
double l1 = Main.getSimulator().l1; | ||
double l2 = Main.getSimulator().l2; | ||
double angle1 = Main.getSimulator().angle1; | ||
double angle2 = Main.getSimulator().angle2; | ||
double mass1 = Main.getSimulator().mass1; | ||
double mass2 = Main.getSimulator().mass2; | ||
double width = canvas.getWidth(); | ||
double height = canvas.getHeight(); | ||
double y0 = height / 2; | ||
double x0 = width / 2; | ||
double x1 = x0 + l1 * Math.sin(angle1) / scale; | ||
double y1 = y0 + l1 * Math.cos(angle1) / scale; | ||
double x2 = x1 + l2 * Math.sin(angle2) / scale; | ||
double y2 = y1 + l2 * Math.cos(angle2) / scale; | ||
double radius1 = Math.pow(3 * mass1 / (density * 4 * Math.PI), 1.0 / 3.0) / scale; | ||
double radius2 = Math.pow(3 * mass2 / (density * 4 * Math.PI), 1.0 / 3.0) / scale; | ||
Main.getDrawer().getPoints().add(new Point(x2, y2)); | ||
|
||
|
||
Platform.runLater(() -> { | ||
gc.clearRect(0, 0, width, height); | ||
gc.setStroke(Color.BLACK); | ||
gc.setLineWidth(3); | ||
gc.strokeLine(x0, y0, x1, y1); | ||
gc.setFill(Color.GREEN); | ||
gc.fillOval(x1 - radius1 / 2, y1 - radius1 / 2, radius1, radius1); | ||
gc.setStroke(Color.BLACK); | ||
gc.setLineWidth(3); | ||
gc.strokeLine(x1, y1, x2, y2); | ||
gc.setFill(Color.BLUE); | ||
gc.fillOval(x2 - radius2 / 2, y2 - radius2 / 2, radius2, radius2); | ||
|
||
if (points.size()>0) { | ||
Point previous = points.get(0); | ||
for (int i = 1; i < points.size(); i++) { | ||
gc.setStroke(Color.BLUE); | ||
gc.setLineWidth(1); | ||
Point point = points.get(i); | ||
gc.strokeLine(previous.x, previous.y, point.x, point.y); | ||
previous = point; | ||
} | ||
} | ||
}); | ||
|
||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
} | ||
|
||
} | ||
|
||
public List<Point> getPoints() { | ||
return points; | ||
} | ||
|
||
public void resetTrace() { | ||
points.clear(); | ||
} | ||
} |
Oops, something went wrong.