====== Correction TP3.5 ====== ===== Rotation, transformation et TextFlow ===== La classe main. La seule spécificité ici est que je fait une rotation par rapport au centre du texte (grâce aux bornes du texte). package com.mco; import javafx.application.Application; import javafx.geometry.Bounds; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.text.*; import javafx.scene.transform.Rotate; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { System.out.println("Poclices disponibles :"); for (String fontName: Font.getFamilies()) { System.out.println(fontName); } launch(args); } private static void textFlow(Group root) { String fontFamily = "Courier New"; TextFlow textFlow = new TextFlow(); //layout donne l'élément en haut à gauche. textFlow.setLayoutX(0); textFlow.setLayoutY(0); Text text1 = new Text("Salut "); text1.setFont(Font.font(fontFamily, 25)); text1.setFill(Color.RED); Text text2 = new Text("les"); text2.setFill(Color.ORANGE); text2.setFont(Font.font(fontFamily, FontWeight.BOLD, 50)); Text text3 = new Text(" gens"); text3.setFill(Color.GREEN); text3.setFont(Font.font(fontFamily, FontPosture.ITALIC, 12)); textFlow.getChildren().addAll(text1, text2, text3); Group group = new Group(); //on crée un groupe avec le TextFlow dedans group.getChildren().add(textFlow); root.getChildren().add(group); // on l'ajoute à root } public void start(Stage theStage) { theStage.setTitle("Hello, World!"); //mise en place du Stage : création du scene graph et du noeud racine. Group root = new Group(); //ce ne sera pas une feuille, donc de classe Group. Scene theScene = new Scene(root); //création du scene graph theStage.setScene(theScene); //on le place dans le stage //Création d'un text Text text = new Text(); Font comic = new Font("Comic sans MS", 50); text.setFont(comic); text.setFill(Color.color(.5,0,1.0,1.0)); text.setText("Hello World aussi !"); text.setX(0); text.setY(200); //on l'ajoute à notre scene graph via son père, ici le noeud root root.getChildren().add(text); // on effectue une rotation sur le texte. Bounds boundingBox = text.getLayoutBounds(); System.out.println(text.getLayoutBounds()); double middleX = (boundingBox.getMaxX() + boundingBox.getMinX()) / 2; double middleY = (boundingBox.getMaxY() + boundingBox.getMinY()) / 2; text.getTransforms().add(new Rotate(-45, middleX, middleY)); //un TextFlow textFlow(root); theStage.show(); } } ===== Double Pendule ===== Une classe ''Main'', Une classe ''Loop'' et une classe ''DoublePendulum'' permettant de gérer les mouvements du pendule. ==== Main.java ==== Pas de changement par rapport au TP3. package com.mco; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } public void start(Stage theStage) { theStage.setTitle("Watch Hour"); Group root = new Group(); Scene theScene = new Scene(root); theStage.setScene(theScene); Canvas canvas = new Canvas(512, 512); root.getChildren().add(canvas); Loop mainLoop = new Loop(canvas); mainLoop.start(); theStage.show(); } } ==== Loop.java ==== package com.mco; import javafx.animation.AnimationTimer; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; public class Loop extends AnimationTimer { private Canvas canvas; private DoublePendulum doublePendulum; private long currentTime; final Color BACKGROUND_COLOR = Color.ALICEBLUE; final Color PENDULUM_COLOR = Color.BISQUE; final int WATCH_HAND_LINE_WIDTH = 10; public Loop(Canvas canvas) { currentTime = System.nanoTime(); doublePendulum = new DoublePendulum(100, Math.PI / 2, 1, 200, Math.PI - .0001, 5); this.canvas = canvas; } @Override public void handle(long now) { handleTime(now); drawStuff(); } private void handleTime(long now) { doublePendulum.update(now - currentTime); currentTime = now; } private void drawStuff() { clearCanvas(); drawWatchHand(); } private void clearCanvas() { GraphicsContext gc = canvas.getGraphicsContext2D(); gc.setFill(BACKGROUND_COLOR); gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); } private void drawWatchHand() { GraphicsContext gc = canvas.getGraphicsContext2D(); double middleX = canvas.getWidth() / 2; double middleY = canvas.getHeight() / 2; gc.beginPath(); gc.setLineWidth(WATCH_HAND_LINE_WIDTH); gc.setStroke(PENDULUM_COLOR); gc.moveTo(middleX, middleY); gc.lineTo(middleX + doublePendulum.x1(), middleY + doublePendulum.y1()); gc.lineTo(middleX + doublePendulum.x2(), middleY + doublePendulum.y2()); gc.stroke(); } } ==== DoublePendulum.java ==== package com.mco; public class DoublePendulum { private final static double G = 9.2; private double d2Theta1 =0, d2Theta2 = 0; private double dTheta1 = 0, dTheta2 = 0; private double theta1, theta2; private double l1, l2; private double mu; public DoublePendulum(double l1, double theta1, double m1, double l2, double theta2, double m2) { this.theta1 = theta1; this.theta2 = theta2; this.l1 = l1; this.l2 = l2; this.mu = 1 + m1 / m2; } public void update(long deltaInNanoSeconds) { double time = deltaInNanoSeconds * 1E-9; d2Theta1 = (G * (Math.sin(theta2) * Math.cos(theta1 - theta2) - mu * Math.sin(theta1)) - (l2 * dTheta2 * dTheta2 + l1 * dTheta1 * dTheta1 * Math.cos(theta1 - theta2)) * Math.sin(theta1 - theta2)) / (l1 * (mu - Math.cos(theta1 - theta2) * Math.cos(theta1 - theta2))); d2Theta2 = (mu * G * (Math.sin(theta1) * Math.cos(theta1 - theta2) - Math.sin(theta2)) + (mu * l1 * dTheta1 * dTheta1 + l2 * dTheta2 * dTheta2 * Math.cos(theta1 - theta2)) * Math.sin(theta1 - theta2)) / (l2 * (mu - Math.cos(theta1 - theta2) * Math.cos(theta1 - theta2))); dTheta1 += d2Theta1 * time; dTheta2 += d2Theta2 * time; theta1 += dTheta1 * time; theta2 += dTheta2 * time; } public double x1() { return l1 * Math.sin(theta1); } public double y1() { return l1 * Math.cos(theta1); } public double x2() { return x1() + l2 * Math.sin(theta2); } public double y2() { return y1() + l2 * Math.cos(theta2); } }