Я пытаюсь сделать прямоугольник сменным с помощью мыши. Верхний левый угол должен быть исправлен. Без вращения прямоугольника он работает. Но если прямоугольник вращается, он больше не работает.JavaFX: поворот трансформации с фигурами не работает с фиксированной точкой
Все attemps с sceneToLocal и наоборот и с «rectangle.getTransforms(). Add (new Rotate (-ang, w, h)); не работает. Исправлена ошибка, если угол <> 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);
}}
До сих пор я всегда считал, что эти функции равны. – user1878143
recGroup.setRotate (angle) <==> Повернуть rotate = new Повернуть (угол, rec.getX() + rec.getWidth()/2., rec.getY() + rec.getHeight()/2.); recGroup.getTransforms(). Add (повернуть); Этот пример показывает разницу. Большое спасибо – user1878143
Ну, они не совсем идентичны, потому что 'Rotate', созданный' setRotate', обновляет свою опорную точку, если границы меняются. Так что вам действительно нужно «Rotate rotate = new Rotate (angle)», '' rotate.pivotXProperty(). Bind (rec.xProperty(). Add (rec.widthProperty(). Divide (2))); Но, да, это идея. –