2017-03-03 3 views
1

J'essaie de faire pivoter un rectangle autour de son centre. La rotation est en train d'être dessiné sur un canevas en utilisant GraphicsContext ie gc. Voici mon code de tirage. Cela déplace le rectangle vers le centre, mais il fait ensuite pivoter le rectangle autour de son point supérieur gauche. J'ai essayé de soustraire la moitié de la longueur et de la largeur des côtés, mais ça l'a juste fait voler partout. Je suis nul en maths peut-être que quelqu'un ici qui est meilleur peut me montrer ce que je fais de mal.JavaFX tourne le rectangle autour du centre?

J'ai également stocké tous les quatre points (coins) du rectangle si cette information est nécessaire.

Merci, Joe

Répondre

1

Une rotation autour d'un point spécifié doit être composé de traduire les transformations et les rotations autour de l'origine comme suit:

  1. traduction Permet de déplacer le centre de la rotation à la origine.
  2. tourner autour de l'origine
  3. utiliser la traduction inverse de la première traduction

La troisième partie est absente de votre code.

Exemple

@Override 
public void start(Stage primaryStage) throws Exception { 
    Canvas canvas = new Canvas(400, 400); 
    double x = 50; 
    double y = 100; 
    double width = 100; 
    double height = 200; 

    GraphicsContext gc = canvas.getGraphicsContext2D(); 
    double rotationCenterX = (x + width)/2; 
    double rotationCenterY = (y + height)/2; 

    gc.save(); 
    gc.translate(rotationCenterX, rotationCenterY); 
    gc.rotate(45); 
    gc.translate(-rotationCenterX, -rotationCenterY); 

    gc.fillRect(0, 0, width, height); 
    gc.restore(); 

    Scene scene = new Scene(new Group(canvas)); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

Vous pouvez également utiliser simplement un Rotate avec un pivot spécifié pour obtenir l'effet désiré:

@Override 
public void start(Stage primaryStage) throws Exception { 
    Canvas canvas = new Canvas(400, 400); 
    double x = 50; 
    double y = 100; 
    double width = 100; 
    double height = 200; 

    GraphicsContext gc = canvas.getGraphicsContext2D(); 
    double rotationCenterX = (x + width)/2; 
    double rotationCenterY = (y + height)/2; 

    gc.save(); 
    gc.transform(new Affine(new Rotate(45, rotationCenterX, rotationCenterY))); 
    gc.fillRect(0, 0, width, height); 
    gc.restore(); 

    Scene scene = new Scene(new Group(canvas)); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

gc.transform (nouveau Affine (nouveau Rotation (45, rotationCenterX, rotationCenterY))); Cela a tout résolu. –