Skip to content

Commit

Permalink
Initial Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Meegooo committed Feb 14, 2018
0 parents commit 6652d70
Show file tree
Hide file tree
Showing 14 changed files with 528 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea/
12 changes: 12 additions & 0 deletions double_pendulum_java.iml
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.
102 changes: 102 additions & 0 deletions out/production/double_pendulum_java/pendulum/gui.fxml
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>
102 changes: 102 additions & 0 deletions resources/pendulum/gui.fxml
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>
86 changes: 86 additions & 0 deletions src/pendulum/Controller.java
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();
}
}
80 changes: 80 additions & 0 deletions src/pendulum/Drawer.java
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();
}
}
Loading

0 comments on commit 6652d70

Please sign in to comment.