JavaFX 缩放形状而不移动原点

2024-02-23

我的形状的缩放能力有问题。我想使用我自己绘制的坐标系,其中包含一些形状。这些形状需要缩放函数。缩放形状后,它们会移动,因为缩放发生在每个形状的中心。为了对这个运动做出反应,我重新计算原点。但如果我缩放多次,形状仍然会偏离原点。我不知道为什么。谁能解释这种行为? 此外,我尝试重新计算笔画宽度以保持 1px。

谢谢你!

My code:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Bounds;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Polyline;
import javafx.stage.Stage;

public class ScaleTest extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {
        Pane root = new Pane();
        Scene scene = new Scene(root, 800, 600, Color.WHITE);
        stage.setScene(scene);

        Polyline line1 = new Polyline(new double[] { 50, 50, 50, 150, 150, 150,
                150, 50, 50, 50 });
        line1.setStrokeWidth(1);

        Group polylines = new Group();
        polylines.getChildren().add(line1);

        Line xAxis = new Line(0, 50, 800, 50);
        Line yAxis = new Line(50, 0, 50, 800);

        root.setScaleY(-1);
        root.getChildren().addAll(xAxis, yAxis);
        root.getChildren().add(polylines);

        scene.setOnScroll(new EventHandler<ScrollEvent>() {

            @Override
            public void handle(ScrollEvent event) {
                double scale = 0;
                if (event.getDeltaY() < 0) {
                    scale = -0.1;
                } else {
                    scale = 0.1;
                }

                Bounds beforeScaling = polylines.getBoundsInParent();
                polylines.setScaleX(polylines.getScaleX() + scale);
                polylines.setScaleY(polylines.getScaleY() + scale);
                Bounds afterScaling = polylines.getBoundsInParent();
                polylines.setTranslateX(polylines.getTranslateX()
                        + beforeScaling.getMinX() - afterScaling.getMinX());
                polylines.setTranslateY(polylines.getTranslateY()
                        + beforeScaling.getMinY() - afterScaling.getMinY());

                //optional
                line1.setStrokeWidth(1/polylines.getScaleX());
            }

        });

        stage.show();
    }
}

我不确定它为什么会“漂移” - 可能它只是累积舍入误差。无论如何,更简单的方法是使用Scale http://docs.oracle.com/javase/8/javafx/api/javafx/scene/transform/Scale.html转型。通过此功能,您可以指定发生缩放的“枢轴”点。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Polyline;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;

public class ScaleTest extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {
        Pane root = new Pane();
        Scene scene = new Scene(root, 800, 600, Color.WHITE);
        stage.setScene(scene);

        Polyline line1 = new Polyline(new double[] { 50, 50, 50, 150, 150, 150,
                150, 50, 50, 50 });
        line1.setStrokeWidth(1);

        Group polylines = new Group();
        polylines.getChildren().add(line1);

        Line xAxis = new Line(0, 50, 800, 50);
        Line yAxis = new Line(50, 0, 50, 800);

        root.setScaleY(-1);
        root.getChildren().addAll(xAxis, yAxis);
        root.getChildren().add(polylines);

        Scale scale = new Scale();
        scale.setPivotX(50);
        scale.setPivotY(50);
        polylines.getTransforms().add(scale);

        scene.setOnScroll(new EventHandler<ScrollEvent>() {

            @Override
            public void handle(ScrollEvent event) {
                double scaleDelta = 0;
                if (event.getDeltaY() < 0) {
                    scaleDelta = -0.1;
                } else {
                    scaleDelta = 0.1;
                }
                scale.setX(scale.getX() + scaleDelta);
                scale.setY(scale.getY() + scaleDelta);
                //optional
                line1.setStrokeWidth(1/scale.getX());
            }

        });

        stage.show();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 缩放形状而不移动原点 的相关文章

随机推荐

  • 素数惰性列表

    如何在 Haskell 中实现素数列表以便可以延迟检索它们 我是 Haskell 的新手 想了解惰性求值功能的实际用途 这是一个简短的 Haskell 函数 用于枚举素数识字计划 https web archive org web 2010
  • (SSL Pinning) 设备上的公钥 CA 如何检查服务器的证书

    我的设备上的 CA 如何检查数字签名是真是假 如果黑客获得了我的数字签名 他们是否可以将我的数字签名和他们自己的公钥结合起来并将证书发送给客户端 如果是这样 客户端如何知道证书不是来自正确的服务器 结论 我想知道如何检查服务器的数字签名 他
  • 从sql server获取windows用户登录名

    我的数据库配置为使用带有登录名的 SQL Server 身份验证sa 现在我想知道用户的Windows登录用户名 SA 将为每个人提供帮助 我能够获取计算机的 IP 地址和计算机名称 但我迫切需要用户的 Windows 登录用户名 顺便说一
  • cell.contentView systemLayoutSizeFittingSize:不适用于动态高度表格视图

    我尝试在自定义 uitableviewcell 中使用自动布局 并尝试根据这个SO主题实现动态高度 在 UITableView 中使用自动布局来实现动态单元格布局和可变行高 https stackoverflow com questions
  • 如何在 Flask 视图中获取 url 参数

    我正在尝试从烧瓶视图中获取 url 参数 www domain com f x 2 如何得到x 2来自url在烧瓶视图中 您可以使用检索查询字符串变量 request args get myParam or request args myP
  • 如何在 OpenGL ES 2.0 中绘制抗锯齿线?

    我正在尝试绘制一些已存储为顶点数组的轮廓 typedef struct float vertices int nrPoints VertexCurve list
  • 将一个数组的顺序与另一个数组的顺序相匹配

    我有一个正确排序的 ID 的 int 数组 然后我有一个具有 ID 属性的无序对象数组 我想按与 int 数组的顺序匹配的 ID 对对象进行排序 类似的东西 newObjectArray oldObjectArray MatchOrderB
  • 页面上相同资源类型的简单形式多种形式

    我正在使用 simple form 为相同的资源类型创建表单 它工作正常 但由于所有输入都具有相同的 id 所以我在 javascript 上遇到了一个问题 例如 如果我的型号是汽车 字段是品牌 则所有 lteh 表单上该字段的所有输入都具
  • 链接身份哈希集

    我都知道IdentityHashSet http docs oracle com javase 7 docs api java util IdentityHashMap html via Collections newSetFromMap
  • GitPython 标签排序

    我正在尝试使用 GitPython lib 获取存储库中的最新标签 通常我是这样做的 repo Repo project root last tag str repo tags 1 但是一旦版本 1 10 发布 我总是得到 1 9 我知道它
  • 我们如何在 Perl 中创建唯一 ID

    我想创建一个UniqueId 是否有一个我可以调用的函数 这样每次我使用它时 它都会给我一个新的 Id 并且总是具有不同的值 Use 数据 UUID http search cpan org rjbs Data UUID 1 219 UUI
  • 单个单词的 Spacy 词形还原

    我正在尝试获取单个单词的词形还原版本 有没有办法使用 spacy 神奇的 python NLP 库 来做到这一点 下面是我尝试过的代码 但这不起作用 from spacy lemmatizer import Lemmatizer from
  • Nginx 别名指令不适用于 php

    我有一个在 Nginx 上运行的应用程序 其工作服务器块如下所示 server listen 80 server name example com root home deployer apps my app current index i
  • Bower 安装错误

    现在我已经安装了 Node 和 Npm 并在终端中运行此命令 是的 我在 Mac 上 npm install g bower 接下来是终端的输出 npm http GET https registry npmjs org bower npm
  • data.frame(mm[ -1], surv.t = surv.t, cens = cens) 中的错误:参数暗示不同的行数:146, 0

    我在 R 中运行 BMA 包来进行 CoxPH 测试 我想知道我应该编辑什么数据 以便解决这个问题 参数暗示不同的行数 146 0 library BMA data lt read csv Test1 csv header TRUE x l
  • golang中如何解析表单数组 Beego

    如何使用 Beego 解析 html 表单数组
  • 滑出动画在后按按钮上不起作用?

    我在进入或退出活动时使用动画 进入活动动画效果很好 但退出动画效果不佳 当我按下后退按钮时 我开始退出动画 发生的情况是它首先开始输入当前活动的动画 然后显示最后一个活动 我想要一个简单的后退按钮按下时的退出动画 Slide out xml
  • 我可以将移动的变量标记为不再可用,并在使用它时收到编译器警告吗?

    有时在我使用的函数中std move传递我不再使用的变量 如下所示 void f std vector
  • 如何在 PhpStorm 中更改面包屑突出显示背景颜色

    如何更改面包屑悬停时的面包屑背景颜色 看起来它使用了与 插入符行 风格 并自动使其变亮 颜色越深 差异越大
  • JavaFX 缩放形状而不移动原点

    我的形状的缩放能力有问题 我想使用我自己绘制的坐标系 其中包含一些形状 这些形状需要缩放函数 缩放形状后 它们会移动 因为缩放发生在每个形状的中心 为了对这个运动做出反应 我重新计算原点 但如果我缩放多次 形状仍然会偏离原点 我不知道为什么