Table des matières

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);
    }
 
}