Javafx 简明教程
JavaFX - Rotation Transformation
依次旋转,我们从它的原点以一个特定的角度 θ (theta) 旋转对象。从下图中,我们可以看到 point P(X, Y) 位于距离原点 r 的水平 X 坐标 angle φ 处。
In rotation, we rotate the object at a particular angle θ (theta) from its origin. From the following figure, we can see that the point P(X, Y) is located at angle φ from the horizontal X coordinate with distance r from the origin.
Rotation Transformation in JavaFX
旋转变换是使用 javafx.scene.transform 包中的 Rotate 类应用于 JavaFX 节点的。在此变换中,将仿射对象绕着具有指定角度的特定坐标旋转,并设置该坐标作为锚点。
Rotation Transformation is applied on JavaFX nodes using the Rotate class of the javafx.scene.transform package. In this transformation, an affine object is rotated at a specified angle with certain coordinates set as anchor point.
Example 1
以下是演示 JavaFX 中旋转变换的程序。在其中,我们在同一位置创建 2 个矩形节点,具有相同的维度,但具有不同的颜色(米黄色和蓝色)。我们还对米黄色矩形应用旋转变换。
Following is the program which demonstrates the rotation transformation in JavaFX. In here, we are creating 2 rectangular nodes at the same location, with the same dimensions but with different colors (Burlywood and Blue). We are also applying rotation transformation on the rectangle with Burlywood color.
将此代码保存在名为 RotationExample.java 的文件中。
Save this code in a file with the name RotationExample.java.
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
public class RotationExample extends Application {
@Override
public void start(Stage stage) {
//Drawing Rectangle1
Rectangle rectangle1 = new Rectangle(150, 75, 200, 150);
rectangle1.setFill(Color.BLUE);
rectangle1.setStroke(Color.BLACK);
//Drawing Rectangle2
Rectangle rectangle2 = new Rectangle(150, 75, 200, 150);
//Setting the color of the rectangle
rectangle2.setFill(Color.BURLYWOOD);
//Setting the stroke color of the rectangle
rectangle2.setStroke(Color.BLACK);
//creating the rotation transformation
Rotate rotate = new Rotate();
//Setting the angle for the rotation
rotate.setAngle(20);
//Setting pivot points for the rotation
rotate.setPivotX(150);
rotate.setPivotY(225);
//Adding the transformation to rectangle2
rectangle2.getTransforms().addAll(rotate);
//Creating a Group object
Group root = new Group(rectangle1, rectangle2);
//Creating a scene object
Scene scene = new Scene(root, 600, 300);
//Setting title to the Stage
stage.setTitle("Rotation transformation example");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
使用以下命令,从命令提示符编译并执行已保存的 java 文件。
Compile and execute the saved java file from the command prompt using the following commands.
javac --module-path %PATH_TO_FX% --add-modules javafx.controls RotationExample.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls RotationExample
在执行时,上述程序会生成一个 JavaFX 窗口,如下所示。
On executing, the above program generates a javaFx window as shown below.
Example 2
在此示例中,我们尝试旋转一个 3D 对象,比如一个盒子。在这里,让我们创建两个盒子:一个表示它的原始位置,另一个显示变换后的位置。
In this example, we are trying to rotate a 3D object, say box. Here, let us create two boxes: one representing its original position, and the other displaying the transformed position.
将此代码保存在名为 RotationExample3D.java 的文件中。
Save this code in a file with the name RotationExample3D.java.
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Box;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.stage.Stage;
public class RotationExample3D extends Application {
@Override
public void start(Stage stage) {
//Drawing a Box
Box box1 = new Box();
Box box2 = new Box();
//Setting the properties of the Box
box1.setWidth(150.0);
box1.setHeight(150.0);
box1.setDepth(150.0);
//Setting the properties of the Box
box2.setWidth(150.0);
box2.setHeight(150.0);
box2.setDepth(150.0);
//Creating the translation transformation
Translate translate = new Translate();
translate.setX(200);
translate.setY(150);
translate.setZ(25);
Rotate rxBox = new Rotate(0, 0, 0, 0, Rotate.X_AXIS);
Rotate ryBox = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
Rotate rzBox = new Rotate(0, 0, 0, 0, Rotate.Z_AXIS);
rxBox.setAngle(30);
ryBox.setAngle(50);
rzBox.setAngle(30);
box2.getTransforms().addAll(translate,rxBox, ryBox, rzBox);
//Creating a Group object
Group root = new Group(box1, box2);
//Creating a scene object
Scene scene = new Scene(root, 400, 300);
//Setting title to the Stage
stage.setTitle("Transformation of a Box");
//Adding scene to the stage
stage.setScene(scene);
//Displaying the contents of the stage
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
使用以下命令,从命令提示符编译并执行已保存的 java 文件。
Compile and execute the saved java file from the command prompt using the following commands.
javac --module-path %PATH_TO_FX% --add-modules javafx.controls RotationExample3D.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls RotationExample3D
在执行时,上述程序会生成一个 JavaFX 窗口,如下所示。我们可以观察到盒子的原始位置不在应用程序内,因此,应用变换变得必要。
On executing, the above program generates a JavaFX window as shown below. We can observe that the original position of the box is not completely within the application; hence, applying the transformation becomes necessary.