java 您所在的位置:网站首页 绘制三次贝塞尔曲线 java

java

2024-02-11 09:51| 来源: 网络整理| 查看: 265

我认为 JavaFX 中的 CubicCurves 并不像你想象的那样工作。JavaFX CubicCurve 是一条贝塞尔曲线,它与您在高中数学中通常遇到的 y=x^3 等三次多项式完全不同。关于贝塞尔曲线你想知道的一切都在这里。

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

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

虽然有可能解决贝塞尔方程以减少到多项式,例如 y=x^3,但您可能想在math.stackexchange.com上提出这个问题,其中数学家的能力将远高于,因为例如,我。

完成此操作的另一种方法是运行一个循环,通过将函数应用于 x 值来计算 x 值的小增量的 y 值,然后为路径中的每个计算点添加 LineTo。以下问题和答案演示了这种方法:

在 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() { @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() { @Override public void handle(MouseEvent mouseEvent) { getScene().setCursor(Cursor.HAND); } }); setOnMouseDragged(new EventHandler() { @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() { @Override public void handle(MouseEvent mouseEvent) { if (!mouseEvent.isPrimaryButtonDown()) { getScene().setCursor(Cursor.HAND); } } }); setOnMouseExited(new EventHandler() { @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; } } }

示例程序输出:

三次曲线示例程序输出



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有