三次曲线 JavaFX

2024-01-22

我在 JavaFX 中的 CubicCurve 上遇到了困难。例如,如何绘制: y=x^3 ?绘制曲线的机制看起来非常笨拙。

是否可以将曲线的端点之一连接到另一个节点,以便当该节点的位置发生变化时曲线会适应它?

Thanks.


我认为 JavaFX 中的 CubicCurves 并不像您想象的那样工作。 JavaFX CubicCurve 是贝塞尔曲线 http://math.fullerton.edu/mathews/n2003/BezierCurveMod.html这与你在高中数学中通常遇到的三次多项式(例如 y=x^3)有很大不同。关于贝塞尔曲线你想知道的一切都是here http://processingjs.nihongoresources.com/bezierinfo/.

贝塞尔曲线通常用于生成计算机图形学中的平滑曲线。它们由起点和终点以及一组用于操纵曲线的控制点定义。您可以通过玩交互式示例来最好地了解它的工作原理,在该示例中,您可以拖动起点、终点和控制点以形成不同的曲线。

例如,如何绘制: y=x^3 ?

虽然可以求解贝塞尔方程以简化为多项式,例如 y=x^3,但您可能想问这个问题math.stackexchange.com https://math.stackexchange.com/数学家的水平会比我高得多。

实现此目的的另一种方法是运行一个循环,通过将函数应用于 x 值来计算 x 值的小增量的 y 值,然后为 Path 中的每个计算点添加 LineTo。以下问答演示了这种方法:

  • 在JavaFX中使用canvas绘制笛卡尔平面图 https://stackoverflow.com/questions/24005247/draw-cartesian-plane-graphi-with-canvas-in-javafx

是否可以将曲线的端点之一连接到另一个节点,以便当该节点的位置发生变化时曲线会适应它?

是的,请尝试下面的示例应用程序,其中曲线端点和控制点绑定到可拖动节点。当锚节点被拖动时,曲线会适应锚节点位置的变化。

import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.event.EventHandler;
import javafx.scene.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.stage.Stage;

/** Example of how a cubic curve works, drag the anchors around to change the curve. */
public class CubicCurveManipulator extends Application {
  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    CubicCurve curve = createStartingCurve();

    Line controlLine1 = new BoundLine(curve.controlX1Property(), curve.controlY1Property(), curve.startXProperty(), curve.startYProperty());
    Line controlLine2 = new BoundLine(curve.controlX2Property(), curve.controlY2Property(), curve.endXProperty(),   curve.endYProperty());

    Anchor start    = new Anchor(Color.PALEGREEN, curve.startXProperty(),    curve.startYProperty());
    Anchor control1 = new Anchor(Color.GOLD,      curve.controlX1Property(), curve.controlY1Property());
    Anchor control2 = new Anchor(Color.GOLDENROD, curve.controlX2Property(), curve.controlY2Property());
    Anchor end      = new Anchor(Color.TOMATO,    curve.endXProperty(),      curve.endYProperty());

    stage.setTitle("Cubic Curve Manipulation Sample");
    stage.setScene(new Scene(new Group(controlLine1, controlLine2, curve, start, control1, control2, end), 400, 400, Color.ALICEBLUE));
    stage.show();
  }

  private CubicCurve createStartingCurve() {
    CubicCurve curve = new CubicCurve();
    curve.setStartX(100);
    curve.setStartY(100);
    curve.setControlX1(150);
    curve.setControlY1(50);
    curve.setControlX2(250);
    curve.setControlY2(150);
    curve.setEndX(300);
    curve.setEndY(100);
    curve.setStroke(Color.FORESTGREEN);
    curve.setStrokeWidth(4);
    curve.setStrokeLineCap(StrokeLineCap.ROUND);
    curve.setFill(Color.CORNSILK.deriveColor(0, 1.2, 1, 0.6));
    return curve;
  }

  class BoundLine extends Line {
    BoundLine(DoubleProperty startX, DoubleProperty startY, DoubleProperty endX, DoubleProperty endY) {
      startXProperty().bind(startX);
      startYProperty().bind(startY);
      endXProperty().bind(endX);
      endYProperty().bind(endY);
      setStrokeWidth(2);
      setStroke(Color.GRAY.deriveColor(0, 1, 1, 0.5));
      setStrokeLineCap(StrokeLineCap.BUTT);
      getStrokeDashArray().setAll(10.0, 5.0);
    }
  }

  // a draggable anchor displayed around a point.
  class Anchor extends Circle { 
    Anchor(Color color, DoubleProperty x, DoubleProperty y) {
      super(x.get(), y.get(), 10);
      setFill(color.deriveColor(1, 1, 1, 0.5));
      setStroke(color);
      setStrokeWidth(2);
      setStrokeType(StrokeType.OUTSIDE);

      x.bind(centerXProperty());
      y.bind(centerYProperty());
      enableDrag();
    }

    // make a node movable by dragging it around with the mouse.
    private void enableDrag() {
      final Delta dragDelta = new Delta();
      setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
          // record a delta distance for the drag and drop operation.
          dragDelta.x = getCenterX() - mouseEvent.getX();
          dragDelta.y = getCenterY() - mouseEvent.getY();
          getScene().setCursor(Cursor.MOVE);
        }
      });
      setOnMouseReleased(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
          getScene().setCursor(Cursor.HAND);
        }
      });
      setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
          double newX = mouseEvent.getX() + dragDelta.x;
          if (newX > 0 && newX < getScene().getWidth()) {
            setCenterX(newX);
          }  
          double newY = mouseEvent.getY() + dragDelta.y;
          if (newY > 0 && newY < getScene().getHeight()) {
            setCenterY(newY);
          }  
        }
      });
      setOnMouseEntered(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
          if (!mouseEvent.isPrimaryButtonDown()) {
            getScene().setCursor(Cursor.HAND);
          }
        }
      });
      setOnMouseExited(new EventHandler<MouseEvent>() {
        @Override public void handle(MouseEvent mouseEvent) {
          if (!mouseEvent.isPrimaryButtonDown()) {
            getScene().setCursor(Cursor.DEFAULT);
          }
        }
      });
    }

    // records relative x and y co-ordinates.
    private class Delta { double x, y; }
  }  
}

示例程序输出:

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

三次曲线 JavaFX 的相关文章

  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 拥有多态对象集合的首选 C++ 习惯用法是什么?

    考虑以下类 class Base public virtual void do stuff 0 class Derived public Base public virtual void do stuff std cout lt lt I
  • 绑定函数而不是闭包来注入额外的参数

    看来不是 onClick function event someHandler clicked event 你可以写 onClick someHandler bind null clicked 看起来更简洁 感觉更 实用 这有什么缺点吗 不
  • 将机器学习模型部署到 Google 云的 AI 平台时,出现 HttpError 403,原因为 CONSUMER_INVALID

    我正在遵循这里的教程 https cloud google com ai platform training docs training jobs python 1 https cloud google com ai platform tr
  • 如何添加 XML 文件并将键值对读取到字典中? [复制]

    这个问题在这里已经有答案了 我对编程相当陌生 我正在尝试添加一个 XML 文件来存储一些映射 我想在字典中准备好这些键值对 以下是我正在考虑的 XML 格式
  • QUOTENAME 函数的相反函数是什么?

    在 SQL Server 中 有一个内置函数可以为您引用一个标识符 称为 是否有一个函数可以执行相反的操作并再次删除引号 换句话说 在下面的代码示例中 我该如何替换 SOMEFUNCTION 才能使其对于我可以将 name 初始化为的任何值
  • Python:列表理解背后的机制

    当使用列表理解或infor 循环上下文中的关键字 即 for o in X do something with o or l o for o in X 背后的机制如何in works 其中包含哪些函数 方法X它打电话吗 If X可以遵循多种
  • 使用具有相同参数的不同模板模板参数重载函数时出错

    我有一个类 它获取两个模板模板参数 并使用一个参数重载一个函数 该参数是一个或另一个模板模板参数 但两次都使用相同的模板参数 template
  • 使用boost::iostreamsmapped_file_source和filtering_streambuf解压缩文件

    我计划处理大型压缩文件 并且希望对文件进行内存映射以加快读取速度 我采用了带有常规文件输入的现有示例 但无法编译或工作 我正在使用 C Boost 1 49 欢迎任何建议 include
  • 在 C# 中创建/打开从路径到新 Outlook.MailItem 的现有消息

    您好 我想从磁盘上的现有 Outlook MailItem 创建一个 Outlook MailItem 我相信 我将路径存储在字符串中 并且希望访问以保存其中的正文和附件 我似乎不知道如何在 C 中打开它并访问它 目前我有类似的东西 其中
  • 从字符串中删除数字

    我想知道如何从字符串中删除数字 我尝试使用 StringReplace 但不知道如何告诉函数我要替换数字 这是我尝试过的 StringReplace mString 0 9 rfReplaceAll rfIgnoreCase 简单但有效 可
  • fatal:您当前的分支似乎已损坏

    我使用时出现此错误 git log fatal 您当前的分支似乎已损坏 我的分支文件被破坏了 我在记事本中打开 git refs heads mybranch 但我只看到一些 在文件中 我知道我必须找到分支哈希并将其复制到 git refs
  • 在滚动上重新定位 CdkConnectedOverlay

    我正在尝试使用CdkConnectedOverlay单击按钮时显示叠加层 它大部分工作正常 但覆盖层没有在滚动时重新定位 我确信我遗漏了一些小东西 但我一生都无法弄清楚 我在用着Angular 7 2 8 and Angular CDK 7
  • 无法从 iOS OAuth1.0、OAConsumer 客户端在 tumblr 上发帖

    我正在尝试将 tumblr 集成到我的应用程序中 我能够成功获取访问令牌 但是 当我尝试发帖时 出现以下错误 meta status 401 msg Not Authorized response 我正在使用OAuthConsumeriOS
  • 关联的遍历方向

    我正在读这本书领域驱动设计 of 埃里克 埃文斯 第5章 关于协会 他降低模型复杂性的建议之一是为关联施加遍历方向 I quote 尽可能地限制关系很重要 A 双向关联意味着两个对象都可以被理解 只有在一起 当应用需求不需要遍历时 在两个方
  • 静音按钮不会使 AVAudioPlayer 静音

    我需要在我的 iPhone 应用程序中循环播放 caf 文件 AVAudioPlayer 看起来很有前途 但有一个问题 即使我按下 iPhone 上的静音按钮 它也不会停止或静音 据我了解 在 iOS 5 中 无法以编程方式查明静音按钮是否
  • WooCommerce 付款完整挂钩

    经过长时间的搜索 我找到了这篇文章 WooCommerce 挂钩用于 付款完成后 操作 https stackoverflow com questions 28218580 woocommerce hook for after paymen
  • Mongo,通过id列表查找

    我有一个返回字符串 MongoDB id 列表的进程 512d5793abb900bf3e20d012 512d5793abb900bf3e20d011 我想向 Mongo 发起一个查询 并按照与列表相同的顺序获取匹配的文档 执行此操作的
  • React Native AsyncStorage getItem 返回承诺而不是值

    我有一个登录表单 我可以发布表单值 成功的 POST 请求后 我会收到从 API 返回的身份验证令牌 我需要将此令牌保存在本地存储中以供将来参考 为了保存此身份验证令牌 我使用 AsyncStorage 我用了AsyncStorage se
  • Python 发送的 MIME 电子邮件附件未显示在 mail.live 中

    我有一个 Python 3 脚本 它使用 MIMEMultipart 发送带有生成的附件的 xlsx 文件的电子邮件 我曾经在 Py2 上使用相同的脚本来发送相同的生成文件 唯一的区别是 Py2 脚本从 MySQL 收集信息来创建 xlsx
  • 三次曲线 JavaFX

    我在 JavaFX 中的 CubicCurve 上遇到了困难 例如 如何绘制 y x 3 绘制曲线的机制看起来非常笨拙 是否可以将曲线的端点之一连接到另一个节点 以便当该节点的位置发生变化时曲线会适应它 Thanks 我认为 JavaFX