gpt4 book ai didi

java - 在 javavfx 中创建一个椭圆,其中缩放是从左上角(如矩形)而不是中心开始

转载 作者:行者123 更新时间:2023-12-02 05:16:47 26 4
gpt4 key购买 nike

我有一个 javafx 程序,它生成一个 Canvas ,用户可以在其中绘制椭圆。我正在使用鼠标的按下、拖动和释放技术。但是,我希望能够从形状的左上角(就像缩放矩形一样)而不是其中心来缩放形状的大小。有什么建议可以帮助我实现这一目标吗?

@Override
public void start(Stage ellipseStage) {

//Create ellipse
ellipsePane = new Pane();
ellipsePane.setMinSize(600,600);

ellipsePane.setOnMousePressed(e -> {
if (e.getButton() == MouseButton.PRIMARY) {
ellipse = new Ellipse();
ellipse.setCenterX(e.getX());
ellipse.setCenterY(e.getY());
ellipse.setStroke(Color.ORANGE);
ellipse.setFill(Color.BLACK);
ellipsePane.getChildren().add(ellipse);
}
//if we double click
if (e.getClickCount() == 2) {
ellipse = null;
}
});

//When the mouse is dragged the ellipse expands
ellipsePane.setOnMouseDragged(e -> {
if (ellipse != null) {
ellipse.setRadiusX(e.getX() - ellipse.getCenterX());
ellipse.setRadiusY(e.getY() - ellipse.getCenterY());
}
});

Scene scene = new Scene(ellipsePane);
ellipseStage.setScene(scene);
ellipseStage.show();
}

public static void main(String[] args) {
launch(args);
}}

最佳答案

一种选择是跟踪原始鼠标按下的位置,然后将椭圆的中心 X/Y 属性设置为始终为原点和鼠标当前位置之间的中点(即它被拖动的位置)。半径也将是原点和当前位置之间距离的一半。这是一个例子:

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Ellipse;
import javafx.stage.Stage;

public class Main extends Application {

private Pane pane;
private Point2D origin;
private Ellipse ellipse;

@Override
public void start(Stage primaryStage) {
pane = new Pane();
pane.setOnMousePressed(this::handleMousePressed);
pane.setOnMouseDragged(this::handleMouseDragged);
pane.setOnMouseReleased(this::handleMouseReleased);

primaryStage.setScene(new Scene(pane, 600.0, 400.0));
primaryStage.show();
}

private void handleMousePressed(MouseEvent event) {
event.consume();

origin = new Point2D(event.getX(), event.getY());
ellipse = new Ellipse(event.getX(), event.getY(), 0.0, 0.0);
pane.getChildren().add(ellipse);
}

private void handleMouseDragged(MouseEvent event) {
event.consume();

ellipse.setCenterX((origin.getX() + event.getX()) / 2.0);
ellipse.setCenterY((origin.getY() + event.getY()) / 2.0);
ellipse.setRadiusX(Math.abs(event.getX() - origin.getX()) / 2.0);
ellipse.setRadiusY(Math.abs(event.getY() - origin.getY()) / 2.0);
}

private void handleMouseReleased(MouseEvent event) {
event.consume();

ellipse = null;
origin = null;
}

}

关于java - 在 javavfx 中创建一个椭圆,其中缩放是从左上角(如矩形)而不是中心开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56288683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com