三次曲线 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 的相关文章

  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • Jackson - 反序列化嵌套 JSON

    我有一个 JSON 字符串 其格式如下 response execution status ready report cache hit true created on 2013 07 29 08 42 42 fact cache erro
  • Junit maven构建错误(maven-surefire-plugin:2.19.1:测试失败:分叉进程中出现错误)[重复]

    这个问题在这里已经有答案了 我通过引用创建了一个示例 struts 2 项目和 J unit 测试用例link http self learning java tutorial blogspot com au 2015 04 struts2
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在
  • java.lang.LinkageError:尝试重复的类定义

    为什么会发生错误以及如何修复它 02 13 02 pool 4 thread 2 WARN Exception in thread pool 4 thread 2 02 13 02 pool 4 thread 2 WARN java lan
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 在 Java 中将弯音发送到 MIDI 音序器

    我了解启动和运行 MIDI 音序器的基础知识 并且希望能够在播放过程中增加 减小序列的音高 但弯音是发送到合成器而不是音序器的消息 我尝试将音序器的接收器设置为合成器的发射器 当我发送弯音短消息时 音序器保持相同的音调 但随后合成器以新的弯
  • 带有 OpenId 提供程序的 Java Spring 安全性

    我有一个 spring MVC 应用程序 另一个客户端应用程序想要使用 open id connect 访问我的 spring 应用程序 如何在服务器端实现开放ID提供商 请帮忙 MITREid 连接 OpenID Connect Java
  • 如何找到被点击的JLabel并从中显示ImageIcon?

    这是我的代码 我想知道哪个l单击 然后在新框架中显示该 ImageIcon e getSource 不起作用 final JFrame shirts new JFrame T shirts JPanel panel new JPanel n
  • JavaFX - 为什么多次将节点添加到窗格或不同的窗格会导致错误?

    我现在正在学习基本的 JavaFX 我不明白我正在阅读的书中的这一说法 不 诸如文本字段之类的节点只能添加到一个窗格中一次 将节点添加到多次窗格或不同的窗格将导致运行时错误 我可以从书中提供的UML图看出它是一个组合 但我不明白为什么 库类
  • 为什么我的代码会产生错误:该语句没有返回结果集[重复]

    这个问题在这里已经有答案了 我正在从 Microsoft SQL Server Studio 执行以下查询 该查询工作正常并显示结果 SELECT INTO temp table FROM md criteria join WHERE us
  • Java中的回调接口是什么?

    SetObserver 接口的代码片段取自有效的Java 避免过度同步第67条 public interface SetObserver
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 春季 CORS。在允许的来源中添加模式

    查看CORS的弹簧指南 以下代码启用所有允许的来源 public class MyWebMVCConfigurer extends WebMvcConfigurerAdapter Override public void addCorsMa
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个

随机推荐

  • 拥有多态对象集合的首选 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