JavaFX - 带箭头画线(画布)

2023-12-23

我将此代码重写为 JavaFX 时遇到问题:

private final int ARR_SIZE = 8;

void drawArrow(Graphics g1, int x1, int y1, int x2, int y2) {
    Graphics2D g = (Graphics2D) g1.create();
    g.setPaint(Color.BLACK);

    double dx = x2 - x1, dy = y2 - y1;
    double angle = Math.atan2(dy, dx);
    int len = (int) Math.sqrt(dx * dx + dy * dy);
    AffineTransform at = AffineTransform.getTranslateInstance(x1, y1);
    at.concatenate(AffineTransform.getRotateInstance(angle));
    g.transform(at);

    g.drawLine(0, 0, len, 0);
    g.fillPolygon(new int[] { len, len - ARR_SIZE, len - ARR_SIZE, len }, new int[] { 0, -ARR_SIZE, ARR_SIZE, 0 },
            4);
}

我的解决方案无法正常工作,因为代码的结果:

drawArrow(gc, 200, 50, 50, 50);

is

arrow.

预期结果是

arrow2.

private final int ARR_SIZE = 8;

void drawArrow(GraphicsContext gc, int x1, int y1, int x2, int y2) {

    gc.setFill(Color.BLACK);

    double dx = x2 - x1, dy = y2 - y1;
    double angle = Math.atan2(dy, dx);
    int len = (int) Math.sqrt(dx * dx + dy * dy);

    Affine affine = new Affine(Affine.translate(x1, y1));
    affine.createConcatenation(Affine.rotate(angle, 0, 0));
    gc.setTransform(affine);

    gc.strokeLine(0, 0, len, 0);
    gc.fillPolygon(new double[]{len, len - ARR_SIZE, len - ARR_SIZE, len}, new double[]{0, -ARR_SIZE, ARR_SIZE, 0},
            4);

}

你能帮我吗?


原因有两个:

  1. 按弧度而不是度数旋转:Transform.rotate期望角度以度为单位(参见javadoc 为Rotate构造函数 https://docs.oracle.com/javase/8/javafx/api/javafx/scene/transform/Rotate.html#Rotate-double-double-double-; javadoc 为Transform.rotate在那里“重定向”),但是Math.atan2 https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#atan2-double-double-返回弧度。
  2. Transform.createConcatenation https://docs.oracle.com/javase/8/javafx/api/javafx/scene/transform/Transform.html#createConcatenation-javafx.scene.transform.Transform-创建一个新的Transform而不是修改现有的Transform.

这段代码应该可以工作:

void drawArrow(GraphicsContext gc, int x1, int y1, int x2, int y2) {
    gc.setFill(Color.BLACK);

    double dx = x2 - x1, dy = y2 - y1;
    double angle = Math.atan2(dy, dx);
    int len = (int) Math.sqrt(dx * dx + dy * dy);

    Transform transform = Transform.translate(x1, y1);
    transform = transform.createConcatenation(Transform.rotate(Math.toDegrees(angle), 0, 0));
    gc.setTransform(new Affine(transform));

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

JavaFX - 带箭头画线(画布) 的相关文章

随机推荐

  • ImageMagick Convert 在命令行中工作,但不能通过 PHP exec()

    我正在使用 PHPexec 使用 ImagicMagick 转换图像convert 这是在 CentOS 服务器上运行的 exec convert http www google com images srpr logo3w png jpg
  • 如何设置定时器

    有什么办法可以将计时器设置为 60 秒xor ah ah Enter Again xor ah ah I should put 60 seconds here int 16h The user should press S before 6
  • 具有 JavaScript 依赖项的聚合物元素

    我已经创建了用于渲染 markdown 的 Polymer 元素 https github com robdodson mark down它使用 Marked js 库 我想知道 加载其依赖项的推荐方式是什么 我应该只使用脚本标签吗 或者将
  • Rails 日期与 json

    我正在实施一个Facebook应用及使用AJAX JSON 但是 那JSON返回的结构具有以下格式2010 05 30T06 14 00Z 我正在打电话Game all to json在控制器动作中 如何将它们转换为正常的日期格式 从服务器
  • 在隐藏字段中传递帖子 ID 的值

    这与我的另一个问题是一致的 当我提交属于特定帖子的新评论时 试图获取正确的 post id form html erb 如果没有看到更多代码 很难确切地知道你在做什么 但我的猜测是 post 实例变量已使用设置 post Post find
  • 从 SQLite Blob 创建 Drawable 时出现问题

    我将图像文件作为 blob 缓存在 SQLite 数据库中 我在另一个平台上有一个类似的应用程序 它对相同的图像文件执行相同的操作 两个平台上的数据库报告相同图像的完全相同的大小 所以我认为 但不能保证图像数据完好无损地进入数据库 但是当我
  • Python ASCII 到二进制

    是否有一个内置函数可以将 ASCII 转换为二进制 例如 将 P 转换为 01010000 我正在使用Python 2 6 6 两个人在一起怎么样 bin ord P 0b1010000
  • 使用 HighCharts 和 DotNet.HighCharts 来“玩”多个系列

    我有一组使用 VB NET 和 DotNet HighCharts 创建的系列 Dim SeriesList4As New List Of Series stfipsList4 Count 我想要发生的是类似的事情http jsfiddle
  • 删除navigationItem.titleView后恢复navigationItem.title

    我的应用程序有 2 个选项卡 tabA and tabB 根据我设置的位置navigationItem titleView of tabB to a UIImageView when viewWillAppear 叫做 默认行为tabB就是
  • Android:DOM vs SAX vs XMLPullParser 解析?

    我正在使用 SAX 解析器解析 XML 文档 我想知道与哪个合作更好更快DOM SAX解析器 or XMLPull解析器 这取决于你在做什么 如果你有非常大的文件 那么你应该使用 SAX 解析器 因为它会触发事件并释放它们 内存中不会存储任
  • 响应内容必须是实现 __toString() 的字符串或对象,给定“boolean”。在拉拉维尔

    响应内容必须是实现 toString 的字符串或对象 给定 boolean 这是我的代码 Route get user ip function Request request ip request gt ip return ip retur
  • 在 mac osx lion 中安装(构建)matplotlib

    我安装了 pynum 和 scipy 在带有 python 2 7 的 osx Lion 上 但是当我尝试构建 matplotlib 时 git clone https github com matplotlib matplotlib gi
  • 使用 class_eval 和 instance_eval 访问 Ruby 类变量

    我有以下内容 class Test a 10 def show a puts a a end class lt lt self b 40 def show b puts b b end end end 为什么以下工作有效 Test inst
  • 在 C# 中创建 iCal 文件

    我正在寻找一种在 c asp net 中生成 iCalendar 文件 ics 的好方法 我找到了一些资源 但缺少的一件事是他们对引用可打印fields 具有回车符和换行符的字段 例如 如果描述字段未正确编码 仅显示第一行 并且可能会损坏
  • (403) 您的项目无权访问此功能

    一直遵循有关如何插入网络属性的文档 以便我可以动态创建跟踪代码 目标是将我们的分析转移到 Google Analytics 中 并在分析下在他们自己的 Google 帐户上自动创建客户网站 经过我在网上找到的信息 似乎这个功能可能被列入白名
  • Redis启动后是空的,虽然有.rdb文件

    在我的 redis cli 中运行 shutdown save 后 等待 save 命令完成 跟随 redis 日志 并备份我的 redis rdb 文件 我尝试从头开始启动 redis 服务器 它已启动具有空数据库 dbsize 0 我能
  • POI 4 XPage - 文档生成只能运行一次

    好吧 说实话 标题并没有说出全部真相 我正在使用带有多个按钮 保存 关闭 编辑等 和一个执行 POI 操作的按钮的自定义控件 它生成一个 Word 文件 我在这里遇到一个问题 点击 POI 按钮后 我的其他按钮 以及 POI 按钮 将不再工
  • JavaScript 中的这个

    我在 javascript 中使用 this 时遇到了一个令人困惑的问题 我有一个方法 get data 它返回对象的一些成员变量 有时它会将对象本身返回给我 我不知道为什么 有人能解释一下这里发生了什么吗 function Feed It
  • JIRA:生成每个用户的时间报告?

    抱歉 如果 SO 不是最好的地方 但我在 JIRA 中启用了时间跟踪 并且希望能够为给定日期范围内的每个用户生成时间报告 我唯一拥有的时间跟踪报告选项非常有限 并且不能满足我的要求 是否可以通过标准功能或免费插件来实现 您可能想查看用于 J
  • JavaFX - 带箭头画线(画布)

    我将此代码重写为 JavaFX 时遇到问题 private final int ARR SIZE 8 void drawArrow Graphics g1 int x1 int y1 int x2 int y2 Graphics2D g G