2015-09-11 3 views
0

Я пытаюсь сделать прямоугольник сменным с помощью мыши. Верхний левый угол должен быть исправлен. Без вращения прямоугольника он работает. Но если прямоугольник вращается, он больше не работает.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); 
}} 

ответ

1

Если вы просто установите rotate свойство узла, он будет вращаться, что узел вокруг его центральной точки. Если вы впоследствии измените размеры, центр переместится, так что вы также увидите противоположный конец прямоугольника.

Чтобы зафиксировать эту точку, выполните поворот вокруг этой точки. Таким образом, вместо

recGroup.setRotate(angle); 

сделать

Rotate rotate = new Rotate(angle, 0, 0); 
recGroup.getTransforms().add(rotate); 

Вы, вероятно, нужно добавить перевод, или просто переместить исходный прямоугольник, но это будет держать (0,0) прямоугольника фиксированы.

+0

До сих пор я всегда считал, что эти функции равны. – user1878143

+0

recGroup.setRotate (angle) <==> Повернуть rotate = new Повернуть (угол, rec.getX() + rec.getWidth()/2., rec.getY() + rec.getHeight()/2.); recGroup.getTransforms(). Add (повернуть); Этот пример показывает разницу. Большое спасибо – user1878143

+0

Ну, они не совсем идентичны, потому что 'Rotate', созданный' setRotate', обновляет свою опорную точку, если границы меняются. Так что вам действительно нужно «Rotate rotate = new Rotate (angle)», '' rotate.pivotXProperty(). Bind (rec.xProperty(). Add (rec.widthProperty(). Divide (2))); Но, да, это идея. –

Смежные вопросы