Rotate a group of rectangles around their common center












0















I have a few rectangles that I assign rotation one by one ((javafx.scene.shape.Rectangle) shape).rotateProperty().bind(rotate);
For example, 45 degrees
enter image description here



enter image description here



My rectangle rotates around its center. Please tell me how to make the enemy a few right-angles around their common center.
enter image description here



To get something like this
enter image description here



this.rotate.addListener((obs, old, fresh) -> {
for (VObject vObject : children ) {
vObject.rotate.set(this.rotate.get());
}
});

This is how I add rotation. How can I specify the angle



Update: I used the advice below and now I set the rotation individually for each rectangle. (The selection is still a bit wrong)



            this.rotate.addListener((obs, old, fresh) -> {
Rotate groupRotate = new Rotate(rotate.get(),
this.x.getValue().doubleValue() + this.width.getValue().doubleValue() / 2 ,
this.y.getValue().doubleValue() + this.height.getValue().doubleValue() / 2);
for (VObject vObject : children ) {
vObject.getShape().getTransforms().clear();
vObject.getShape().getTransforms().add(groupRotate);
}
});


enter image description hereenter image description here
But now the axis also rotates depending on the rotation.



enter image description here



Can I set the rotation to the rectangles without turning the coordinate axis?










share|improve this question





























    0















    I have a few rectangles that I assign rotation one by one ((javafx.scene.shape.Rectangle) shape).rotateProperty().bind(rotate);
    For example, 45 degrees
    enter image description here



    enter image description here



    My rectangle rotates around its center. Please tell me how to make the enemy a few right-angles around their common center.
    enter image description here



    To get something like this
    enter image description here



    this.rotate.addListener((obs, old, fresh) -> {
    for (VObject vObject : children ) {
    vObject.rotate.set(this.rotate.get());
    }
    });

    This is how I add rotation. How can I specify the angle



    Update: I used the advice below and now I set the rotation individually for each rectangle. (The selection is still a bit wrong)



                this.rotate.addListener((obs, old, fresh) -> {
    Rotate groupRotate = new Rotate(rotate.get(),
    this.x.getValue().doubleValue() + this.width.getValue().doubleValue() / 2 ,
    this.y.getValue().doubleValue() + this.height.getValue().doubleValue() / 2);
    for (VObject vObject : children ) {
    vObject.getShape().getTransforms().clear();
    vObject.getShape().getTransforms().add(groupRotate);
    }
    });


    enter image description hereenter image description here
    But now the axis also rotates depending on the rotation.



    enter image description here



    Can I set the rotation to the rectangles without turning the coordinate axis?










    share|improve this question



























      0












      0








      0


      0






      I have a few rectangles that I assign rotation one by one ((javafx.scene.shape.Rectangle) shape).rotateProperty().bind(rotate);
      For example, 45 degrees
      enter image description here



      enter image description here



      My rectangle rotates around its center. Please tell me how to make the enemy a few right-angles around their common center.
      enter image description here



      To get something like this
      enter image description here



      this.rotate.addListener((obs, old, fresh) -> {
      for (VObject vObject : children ) {
      vObject.rotate.set(this.rotate.get());
      }
      });

      This is how I add rotation. How can I specify the angle



      Update: I used the advice below and now I set the rotation individually for each rectangle. (The selection is still a bit wrong)



                  this.rotate.addListener((obs, old, fresh) -> {
      Rotate groupRotate = new Rotate(rotate.get(),
      this.x.getValue().doubleValue() + this.width.getValue().doubleValue() / 2 ,
      this.y.getValue().doubleValue() + this.height.getValue().doubleValue() / 2);
      for (VObject vObject : children ) {
      vObject.getShape().getTransforms().clear();
      vObject.getShape().getTransforms().add(groupRotate);
      }
      });


      enter image description hereenter image description here
      But now the axis also rotates depending on the rotation.



      enter image description here



      Can I set the rotation to the rectangles without turning the coordinate axis?










      share|improve this question
















      I have a few rectangles that I assign rotation one by one ((javafx.scene.shape.Rectangle) shape).rotateProperty().bind(rotate);
      For example, 45 degrees
      enter image description here



      enter image description here



      My rectangle rotates around its center. Please tell me how to make the enemy a few right-angles around their common center.
      enter image description here



      To get something like this
      enter image description here



      this.rotate.addListener((obs, old, fresh) -> {
      for (VObject vObject : children ) {
      vObject.rotate.set(this.rotate.get());
      }
      });

      This is how I add rotation. How can I specify the angle



      Update: I used the advice below and now I set the rotation individually for each rectangle. (The selection is still a bit wrong)



                  this.rotate.addListener((obs, old, fresh) -> {
      Rotate groupRotate = new Rotate(rotate.get(),
      this.x.getValue().doubleValue() + this.width.getValue().doubleValue() / 2 ,
      this.y.getValue().doubleValue() + this.height.getValue().doubleValue() / 2);
      for (VObject vObject : children ) {
      vObject.getShape().getTransforms().clear();
      vObject.getShape().getTransforms().add(groupRotate);
      }
      });


      enter image description hereenter image description here
      But now the axis also rotates depending on the rotation.



      enter image description here



      Can I set the rotation to the rectangles without turning the coordinate axis?







      java javafx






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 22 '18 at 12:20







      A1ex NS

















      asked Nov 21 '18 at 11:06









      A1ex NSA1ex NS

      205




      205
























          2 Answers
          2






          active

          oldest

          votes


















          5














          If you put all rectangles into a common Group, you can rotate them at once:



          import javafx.application.Application;
          import javafx.scene.Group;
          import javafx.scene.Scene;
          import javafx.scene.layout.BorderPane;
          import javafx.scene.shape.Rectangle;
          import javafx.stage.Stage;

          public class RotateAllApplication extends Application {

          @Override
          public void start(Stage primaryStage) throws Exception {
          BorderPane root = new BorderPane();

          // the common group
          Group group = new Group();
          group.getChildren().addAll(new Rectangle(10, 10, 80, 40), //
          new Rectangle(110, 10, 80, 40), //
          new Rectangle(10, 110, 80, 40), //
          new Rectangle(110, 110, 80, 40));

          // rotate the group instead of each rectangle
          group.setRotate(45.0);

          root.setCenter(group);

          primaryStage.setScene(new Scene(root, 600, 400));
          primaryStage.show();
          }

          public static void main(String args) {
          Application.launch(args);
          }
          }


          Update: If you don't want to create a parent Group object, you can apply the same rotation transformation to each child instead. While Node#setRotate(double) always rotates around the center of the node, adding a transformation to Node#getTransforms() is more general and not restricted to simple rotations.



          The following statement will apply a rotation around the point (100.0/100.0) of the parent coordinate system to all children in the list:



          childrenList.forEach(child -> child.getTransforms().add(Transform.rotate(45.0, 100.0, 100.0)));





          share|improve this answer


























          • Thanks for the answer. But I can not add my rectangles to the group.

            – A1ex NS
            Nov 21 '18 at 11:51











          • this.rotate.addListener((obs, old, fresh) -> { for (VObject vObject : children ) { vObject.rotate.set(this.rotate.get()); } }); This is how I add rotation. How can I specify the angle

            – A1ex NS
            Nov 21 '18 at 12:22













          • Then you should probably use a Rotation transformation on each child. I'm going to update my answer.

            – isnot2bad
            Nov 21 '18 at 19:33











          • More thanks for the reply. I apply the usual transformation because after that I move the rectangles. When I set the rotation through rotateProperty(), then everything works correctly. But if I set the rotation through the getTransforms(), then I have an offset of the coordinate axis and the rectangle moves incorrectly. I already created a topic for this question stackoverflow.com/questions/53293315/javafx-rotation

            – A1ex NS
            Nov 22 '18 at 4:52





















          4














          Use a Rotate transform and specify the appropriate pivot point:



          @Override
          public void start(Stage primaryStage) throws IOException {
          Pane pane = new Pane();
          pane.setPrefSize(600, 600);
          Rectangle rects = new Rectangle[4];
          for (int i = 0; i < 2; i++) {
          for (int j = 0; j < 2; j++) {
          Rectangle rect = new Rectangle(100 + i * 200, 100 + j * 100, 150, 50);
          rects[i * 2 + j] = rect;
          pane.getChildren().add(rect);
          }
          }

          Slider slider = new Slider(0, 360, 0);

          double minX = Double.POSITIVE_INFINITY;
          double minY = Double.POSITIVE_INFINITY;
          double maxX = Double.NEGATIVE_INFINITY;
          double maxY = Double.NEGATIVE_INFINITY;

          Rotate rotate = new Rotate();

          // find pivot point
          for (Rectangle rect : rects) {
          double val = rect.getX();
          if (minX > val) {
          minX = val;
          }
          val += rect.getWidth();
          if (maxX < val) {
          maxX = val;
          }

          val = rect.getY();
          if (minY > val) {
          minY = val;
          }
          val += rect.getHeight();
          if (maxY < val) {
          maxY = val;
          }

          rect.getTransforms().add(rotate);
          }
          rotate.setPivotX(0.5 * (maxX + minX));
          rotate.setPivotY(0.5 * (maxY + minY));
          rotate.angleProperty().bind(slider.valueProperty());
          Scene scene = new Scene(new VBox(10, pane, slider));
          primaryStage.setScene(scene);
          primaryStage.sizeToScene();
          primaryStage.show();
          }


          If you're planing to apply multiple transformations, you may need to adjust the code for finding the pivot point to use transforms for calculating the bounds...






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53410764%2frotate-a-group-of-rectangles-around-their-common-center%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            5














            If you put all rectangles into a common Group, you can rotate them at once:



            import javafx.application.Application;
            import javafx.scene.Group;
            import javafx.scene.Scene;
            import javafx.scene.layout.BorderPane;
            import javafx.scene.shape.Rectangle;
            import javafx.stage.Stage;

            public class RotateAllApplication extends Application {

            @Override
            public void start(Stage primaryStage) throws Exception {
            BorderPane root = new BorderPane();

            // the common group
            Group group = new Group();
            group.getChildren().addAll(new Rectangle(10, 10, 80, 40), //
            new Rectangle(110, 10, 80, 40), //
            new Rectangle(10, 110, 80, 40), //
            new Rectangle(110, 110, 80, 40));

            // rotate the group instead of each rectangle
            group.setRotate(45.0);

            root.setCenter(group);

            primaryStage.setScene(new Scene(root, 600, 400));
            primaryStage.show();
            }

            public static void main(String args) {
            Application.launch(args);
            }
            }


            Update: If you don't want to create a parent Group object, you can apply the same rotation transformation to each child instead. While Node#setRotate(double) always rotates around the center of the node, adding a transformation to Node#getTransforms() is more general and not restricted to simple rotations.



            The following statement will apply a rotation around the point (100.0/100.0) of the parent coordinate system to all children in the list:



            childrenList.forEach(child -> child.getTransforms().add(Transform.rotate(45.0, 100.0, 100.0)));





            share|improve this answer


























            • Thanks for the answer. But I can not add my rectangles to the group.

              – A1ex NS
              Nov 21 '18 at 11:51











            • this.rotate.addListener((obs, old, fresh) -> { for (VObject vObject : children ) { vObject.rotate.set(this.rotate.get()); } }); This is how I add rotation. How can I specify the angle

              – A1ex NS
              Nov 21 '18 at 12:22













            • Then you should probably use a Rotation transformation on each child. I'm going to update my answer.

              – isnot2bad
              Nov 21 '18 at 19:33











            • More thanks for the reply. I apply the usual transformation because after that I move the rectangles. When I set the rotation through rotateProperty(), then everything works correctly. But if I set the rotation through the getTransforms(), then I have an offset of the coordinate axis and the rectangle moves incorrectly. I already created a topic for this question stackoverflow.com/questions/53293315/javafx-rotation

              – A1ex NS
              Nov 22 '18 at 4:52


















            5














            If you put all rectangles into a common Group, you can rotate them at once:



            import javafx.application.Application;
            import javafx.scene.Group;
            import javafx.scene.Scene;
            import javafx.scene.layout.BorderPane;
            import javafx.scene.shape.Rectangle;
            import javafx.stage.Stage;

            public class RotateAllApplication extends Application {

            @Override
            public void start(Stage primaryStage) throws Exception {
            BorderPane root = new BorderPane();

            // the common group
            Group group = new Group();
            group.getChildren().addAll(new Rectangle(10, 10, 80, 40), //
            new Rectangle(110, 10, 80, 40), //
            new Rectangle(10, 110, 80, 40), //
            new Rectangle(110, 110, 80, 40));

            // rotate the group instead of each rectangle
            group.setRotate(45.0);

            root.setCenter(group);

            primaryStage.setScene(new Scene(root, 600, 400));
            primaryStage.show();
            }

            public static void main(String args) {
            Application.launch(args);
            }
            }


            Update: If you don't want to create a parent Group object, you can apply the same rotation transformation to each child instead. While Node#setRotate(double) always rotates around the center of the node, adding a transformation to Node#getTransforms() is more general and not restricted to simple rotations.



            The following statement will apply a rotation around the point (100.0/100.0) of the parent coordinate system to all children in the list:



            childrenList.forEach(child -> child.getTransforms().add(Transform.rotate(45.0, 100.0, 100.0)));





            share|improve this answer


























            • Thanks for the answer. But I can not add my rectangles to the group.

              – A1ex NS
              Nov 21 '18 at 11:51











            • this.rotate.addListener((obs, old, fresh) -> { for (VObject vObject : children ) { vObject.rotate.set(this.rotate.get()); } }); This is how I add rotation. How can I specify the angle

              – A1ex NS
              Nov 21 '18 at 12:22













            • Then you should probably use a Rotation transformation on each child. I'm going to update my answer.

              – isnot2bad
              Nov 21 '18 at 19:33











            • More thanks for the reply. I apply the usual transformation because after that I move the rectangles. When I set the rotation through rotateProperty(), then everything works correctly. But if I set the rotation through the getTransforms(), then I have an offset of the coordinate axis and the rectangle moves incorrectly. I already created a topic for this question stackoverflow.com/questions/53293315/javafx-rotation

              – A1ex NS
              Nov 22 '18 at 4:52
















            5












            5








            5







            If you put all rectangles into a common Group, you can rotate them at once:



            import javafx.application.Application;
            import javafx.scene.Group;
            import javafx.scene.Scene;
            import javafx.scene.layout.BorderPane;
            import javafx.scene.shape.Rectangle;
            import javafx.stage.Stage;

            public class RotateAllApplication extends Application {

            @Override
            public void start(Stage primaryStage) throws Exception {
            BorderPane root = new BorderPane();

            // the common group
            Group group = new Group();
            group.getChildren().addAll(new Rectangle(10, 10, 80, 40), //
            new Rectangle(110, 10, 80, 40), //
            new Rectangle(10, 110, 80, 40), //
            new Rectangle(110, 110, 80, 40));

            // rotate the group instead of each rectangle
            group.setRotate(45.0);

            root.setCenter(group);

            primaryStage.setScene(new Scene(root, 600, 400));
            primaryStage.show();
            }

            public static void main(String args) {
            Application.launch(args);
            }
            }


            Update: If you don't want to create a parent Group object, you can apply the same rotation transformation to each child instead. While Node#setRotate(double) always rotates around the center of the node, adding a transformation to Node#getTransforms() is more general and not restricted to simple rotations.



            The following statement will apply a rotation around the point (100.0/100.0) of the parent coordinate system to all children in the list:



            childrenList.forEach(child -> child.getTransforms().add(Transform.rotate(45.0, 100.0, 100.0)));





            share|improve this answer















            If you put all rectangles into a common Group, you can rotate them at once:



            import javafx.application.Application;
            import javafx.scene.Group;
            import javafx.scene.Scene;
            import javafx.scene.layout.BorderPane;
            import javafx.scene.shape.Rectangle;
            import javafx.stage.Stage;

            public class RotateAllApplication extends Application {

            @Override
            public void start(Stage primaryStage) throws Exception {
            BorderPane root = new BorderPane();

            // the common group
            Group group = new Group();
            group.getChildren().addAll(new Rectangle(10, 10, 80, 40), //
            new Rectangle(110, 10, 80, 40), //
            new Rectangle(10, 110, 80, 40), //
            new Rectangle(110, 110, 80, 40));

            // rotate the group instead of each rectangle
            group.setRotate(45.0);

            root.setCenter(group);

            primaryStage.setScene(new Scene(root, 600, 400));
            primaryStage.show();
            }

            public static void main(String args) {
            Application.launch(args);
            }
            }


            Update: If you don't want to create a parent Group object, you can apply the same rotation transformation to each child instead. While Node#setRotate(double) always rotates around the center of the node, adding a transformation to Node#getTransforms() is more general and not restricted to simple rotations.



            The following statement will apply a rotation around the point (100.0/100.0) of the parent coordinate system to all children in the list:



            childrenList.forEach(child -> child.getTransforms().add(Transform.rotate(45.0, 100.0, 100.0)));






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Nov 21 '18 at 19:38

























            answered Nov 21 '18 at 11:31









            isnot2badisnot2bad

            20k22140




            20k22140













            • Thanks for the answer. But I can not add my rectangles to the group.

              – A1ex NS
              Nov 21 '18 at 11:51











            • this.rotate.addListener((obs, old, fresh) -> { for (VObject vObject : children ) { vObject.rotate.set(this.rotate.get()); } }); This is how I add rotation. How can I specify the angle

              – A1ex NS
              Nov 21 '18 at 12:22













            • Then you should probably use a Rotation transformation on each child. I'm going to update my answer.

              – isnot2bad
              Nov 21 '18 at 19:33











            • More thanks for the reply. I apply the usual transformation because after that I move the rectangles. When I set the rotation through rotateProperty(), then everything works correctly. But if I set the rotation through the getTransforms(), then I have an offset of the coordinate axis and the rectangle moves incorrectly. I already created a topic for this question stackoverflow.com/questions/53293315/javafx-rotation

              – A1ex NS
              Nov 22 '18 at 4:52





















            • Thanks for the answer. But I can not add my rectangles to the group.

              – A1ex NS
              Nov 21 '18 at 11:51











            • this.rotate.addListener((obs, old, fresh) -> { for (VObject vObject : children ) { vObject.rotate.set(this.rotate.get()); } }); This is how I add rotation. How can I specify the angle

              – A1ex NS
              Nov 21 '18 at 12:22













            • Then you should probably use a Rotation transformation on each child. I'm going to update my answer.

              – isnot2bad
              Nov 21 '18 at 19:33











            • More thanks for the reply. I apply the usual transformation because after that I move the rectangles. When I set the rotation through rotateProperty(), then everything works correctly. But if I set the rotation through the getTransforms(), then I have an offset of the coordinate axis and the rectangle moves incorrectly. I already created a topic for this question stackoverflow.com/questions/53293315/javafx-rotation

              – A1ex NS
              Nov 22 '18 at 4:52



















            Thanks for the answer. But I can not add my rectangles to the group.

            – A1ex NS
            Nov 21 '18 at 11:51





            Thanks for the answer. But I can not add my rectangles to the group.

            – A1ex NS
            Nov 21 '18 at 11:51













            this.rotate.addListener((obs, old, fresh) -> { for (VObject vObject : children ) { vObject.rotate.set(this.rotate.get()); } }); This is how I add rotation. How can I specify the angle

            – A1ex NS
            Nov 21 '18 at 12:22







            this.rotate.addListener((obs, old, fresh) -> { for (VObject vObject : children ) { vObject.rotate.set(this.rotate.get()); } }); This is how I add rotation. How can I specify the angle

            – A1ex NS
            Nov 21 '18 at 12:22















            Then you should probably use a Rotation transformation on each child. I'm going to update my answer.

            – isnot2bad
            Nov 21 '18 at 19:33





            Then you should probably use a Rotation transformation on each child. I'm going to update my answer.

            – isnot2bad
            Nov 21 '18 at 19:33













            More thanks for the reply. I apply the usual transformation because after that I move the rectangles. When I set the rotation through rotateProperty(), then everything works correctly. But if I set the rotation through the getTransforms(), then I have an offset of the coordinate axis and the rectangle moves incorrectly. I already created a topic for this question stackoverflow.com/questions/53293315/javafx-rotation

            – A1ex NS
            Nov 22 '18 at 4:52







            More thanks for the reply. I apply the usual transformation because after that I move the rectangles. When I set the rotation through rotateProperty(), then everything works correctly. But if I set the rotation through the getTransforms(), then I have an offset of the coordinate axis and the rectangle moves incorrectly. I already created a topic for this question stackoverflow.com/questions/53293315/javafx-rotation

            – A1ex NS
            Nov 22 '18 at 4:52















            4














            Use a Rotate transform and specify the appropriate pivot point:



            @Override
            public void start(Stage primaryStage) throws IOException {
            Pane pane = new Pane();
            pane.setPrefSize(600, 600);
            Rectangle rects = new Rectangle[4];
            for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
            Rectangle rect = new Rectangle(100 + i * 200, 100 + j * 100, 150, 50);
            rects[i * 2 + j] = rect;
            pane.getChildren().add(rect);
            }
            }

            Slider slider = new Slider(0, 360, 0);

            double minX = Double.POSITIVE_INFINITY;
            double minY = Double.POSITIVE_INFINITY;
            double maxX = Double.NEGATIVE_INFINITY;
            double maxY = Double.NEGATIVE_INFINITY;

            Rotate rotate = new Rotate();

            // find pivot point
            for (Rectangle rect : rects) {
            double val = rect.getX();
            if (minX > val) {
            minX = val;
            }
            val += rect.getWidth();
            if (maxX < val) {
            maxX = val;
            }

            val = rect.getY();
            if (minY > val) {
            minY = val;
            }
            val += rect.getHeight();
            if (maxY < val) {
            maxY = val;
            }

            rect.getTransforms().add(rotate);
            }
            rotate.setPivotX(0.5 * (maxX + minX));
            rotate.setPivotY(0.5 * (maxY + minY));
            rotate.angleProperty().bind(slider.valueProperty());
            Scene scene = new Scene(new VBox(10, pane, slider));
            primaryStage.setScene(scene);
            primaryStage.sizeToScene();
            primaryStage.show();
            }


            If you're planing to apply multiple transformations, you may need to adjust the code for finding the pivot point to use transforms for calculating the bounds...






            share|improve this answer




























              4














              Use a Rotate transform and specify the appropriate pivot point:



              @Override
              public void start(Stage primaryStage) throws IOException {
              Pane pane = new Pane();
              pane.setPrefSize(600, 600);
              Rectangle rects = new Rectangle[4];
              for (int i = 0; i < 2; i++) {
              for (int j = 0; j < 2; j++) {
              Rectangle rect = new Rectangle(100 + i * 200, 100 + j * 100, 150, 50);
              rects[i * 2 + j] = rect;
              pane.getChildren().add(rect);
              }
              }

              Slider slider = new Slider(0, 360, 0);

              double minX = Double.POSITIVE_INFINITY;
              double minY = Double.POSITIVE_INFINITY;
              double maxX = Double.NEGATIVE_INFINITY;
              double maxY = Double.NEGATIVE_INFINITY;

              Rotate rotate = new Rotate();

              // find pivot point
              for (Rectangle rect : rects) {
              double val = rect.getX();
              if (minX > val) {
              minX = val;
              }
              val += rect.getWidth();
              if (maxX < val) {
              maxX = val;
              }

              val = rect.getY();
              if (minY > val) {
              minY = val;
              }
              val += rect.getHeight();
              if (maxY < val) {
              maxY = val;
              }

              rect.getTransforms().add(rotate);
              }
              rotate.setPivotX(0.5 * (maxX + minX));
              rotate.setPivotY(0.5 * (maxY + minY));
              rotate.angleProperty().bind(slider.valueProperty());
              Scene scene = new Scene(new VBox(10, pane, slider));
              primaryStage.setScene(scene);
              primaryStage.sizeToScene();
              primaryStage.show();
              }


              If you're planing to apply multiple transformations, you may need to adjust the code for finding the pivot point to use transforms for calculating the bounds...






              share|improve this answer


























                4












                4








                4







                Use a Rotate transform and specify the appropriate pivot point:



                @Override
                public void start(Stage primaryStage) throws IOException {
                Pane pane = new Pane();
                pane.setPrefSize(600, 600);
                Rectangle rects = new Rectangle[4];
                for (int i = 0; i < 2; i++) {
                for (int j = 0; j < 2; j++) {
                Rectangle rect = new Rectangle(100 + i * 200, 100 + j * 100, 150, 50);
                rects[i * 2 + j] = rect;
                pane.getChildren().add(rect);
                }
                }

                Slider slider = new Slider(0, 360, 0);

                double minX = Double.POSITIVE_INFINITY;
                double minY = Double.POSITIVE_INFINITY;
                double maxX = Double.NEGATIVE_INFINITY;
                double maxY = Double.NEGATIVE_INFINITY;

                Rotate rotate = new Rotate();

                // find pivot point
                for (Rectangle rect : rects) {
                double val = rect.getX();
                if (minX > val) {
                minX = val;
                }
                val += rect.getWidth();
                if (maxX < val) {
                maxX = val;
                }

                val = rect.getY();
                if (minY > val) {
                minY = val;
                }
                val += rect.getHeight();
                if (maxY < val) {
                maxY = val;
                }

                rect.getTransforms().add(rotate);
                }
                rotate.setPivotX(0.5 * (maxX + minX));
                rotate.setPivotY(0.5 * (maxY + minY));
                rotate.angleProperty().bind(slider.valueProperty());
                Scene scene = new Scene(new VBox(10, pane, slider));
                primaryStage.setScene(scene);
                primaryStage.sizeToScene();
                primaryStage.show();
                }


                If you're planing to apply multiple transformations, you may need to adjust the code for finding the pivot point to use transforms for calculating the bounds...






                share|improve this answer













                Use a Rotate transform and specify the appropriate pivot point:



                @Override
                public void start(Stage primaryStage) throws IOException {
                Pane pane = new Pane();
                pane.setPrefSize(600, 600);
                Rectangle rects = new Rectangle[4];
                for (int i = 0; i < 2; i++) {
                for (int j = 0; j < 2; j++) {
                Rectangle rect = new Rectangle(100 + i * 200, 100 + j * 100, 150, 50);
                rects[i * 2 + j] = rect;
                pane.getChildren().add(rect);
                }
                }

                Slider slider = new Slider(0, 360, 0);

                double minX = Double.POSITIVE_INFINITY;
                double minY = Double.POSITIVE_INFINITY;
                double maxX = Double.NEGATIVE_INFINITY;
                double maxY = Double.NEGATIVE_INFINITY;

                Rotate rotate = new Rotate();

                // find pivot point
                for (Rectangle rect : rects) {
                double val = rect.getX();
                if (minX > val) {
                minX = val;
                }
                val += rect.getWidth();
                if (maxX < val) {
                maxX = val;
                }

                val = rect.getY();
                if (minY > val) {
                minY = val;
                }
                val += rect.getHeight();
                if (maxY < val) {
                maxY = val;
                }

                rect.getTransforms().add(rotate);
                }
                rotate.setPivotX(0.5 * (maxX + minX));
                rotate.setPivotY(0.5 * (maxY + minY));
                rotate.angleProperty().bind(slider.valueProperty());
                Scene scene = new Scene(new VBox(10, pane, slider));
                primaryStage.setScene(scene);
                primaryStage.sizeToScene();
                primaryStage.show();
                }


                If you're planing to apply multiple transformations, you may need to adjust the code for finding the pivot point to use transforms for calculating the bounds...







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 21 '18 at 13:05









                fabianfabian

                52.6k115373




                52.6k115373






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53410764%2frotate-a-group-of-rectangles-around-their-common-center%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Xamarin.form Move up view when keyboard appear

                    Post-Redirect-Get with Spring WebFlux and Thymeleaf

                    Anylogic : not able to use stopDelay()