JavaFX: преобразование поворота с фигурами не работает с фиксированной точкой
Я пытаюсь сделать прямоугольник изменчивым с помощью мыши. Верхний левый угол должен быть исправлен. Без какого-либо поворота прямоугольника это работает. Но если прямоугольник повернут, он больше не работает.
Все попытки с sceneToLocal и наоборот и с "rectangle.getTransforms(). Add(new Rotate(-ang, w, h));" не работает FixPoint не является фиксированным, если угол<>0!
У кого-нибудь есть идеи?
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class RotatedRectangle extends Application {
private final int TSIZE = 12;
Rectangle rec,fixPoint;
double angle =0;// 0 works fine, but for other angle the fixPoint is not fix!
@Override
public void start(Stage primaryStage) {
Group recGroup = new Group();
recGroup.setRotate(angle);
rec = new Rectangle(100,100,300, 200);
rec.setFill(Color.TRANSPARENT);
rec.setStroke(Color.BLUE);
fixPoint = new Rectangle(10,10);
fixPoint.xProperty().bind(rec.xProperty());
fixPoint.yProperty().bind(rec.yProperty());
Rectangle recSE = TouchRectangle(
rec.xProperty().add(rec.widthProperty()).subtract(TSIZE),
rec.yProperty().add(rec.heightProperty()).subtract(TSIZE));
recGroup.getChildren().addAll(rec, recSE,fixPoint);
Pane root = new Pane();
root.getChildren().add(recGroup);
Scene scene = new Scene(root, 600, 400);
primaryStage.setTitle("Rotated Rectangle");
primaryStage.setScene(scene);
primaryStage.show();
}
private Rectangle TouchRectangle(ObservableValue<? extends Number> x, ObservableValue<? extends Number> y) {
Rectangle r = new Rectangle();
r.setHeight(TSIZE);
r.setWidth(TSIZE);
r.setFill(Color.TRANSPARENT);
r.setStroke(Color.RED);
r.xProperty().bind(x);
r.yProperty().bind(y);
r.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Point2D zero = rec.localToScene(rec.getX() + rec.getWidth(),
rec.getY() + rec.getHeight());
double newX = (event.getSceneX() - zero.getX());
double newY = (event.getSceneY() - zero.getY());
rec.setWidth(rec.getWidth() +newX);
rec.setHeight(rec.getHeight() +newY);
Point2D fixP = fixPoint.localToScene(fixPoint.getX(), fixPoint.getY());
System.out.println("FIX??"+fixP);
}
});
return r;
}
public static void main(String[] args) {
launch(args);
}}
1 ответ
Если вы просто установите rotate
свойство узла, он будет вращать этот узел вокруг своей центральной точки. Если вы впоследствии измените размеры, центр переместится, так что вы увидите также противоположный конец прямоугольника.
Чтобы зафиксировать эту точку, выполните вращение вокруг этой точки. Так что вместо
recGroup.setRotate(angle);
делать
Rotate rotate = new Rotate(angle, 0, 0);
recGroup.getTransforms().add(rotate);
Скорее всего, вам понадобится добавить перевод или просто переместить исходный прямоугольник, но это сохранит фиксированную точку (0,0) прямоугольника.