【问题标题】:Bezier curve : forcing a curve of 4 points to pass through control points in 3D space贝塞尔曲线:强制 4 点曲线通过 3D 空间中的控制点
【发布时间】:2020-12-22 14:56:01
【问题描述】:

我已经阅读了该线程以实现 4 点但仅在 2D 空间 here 中发生。

我已经实现了 3D 的答案,但只针对 3 个控制点 here

我已阅读 this 的帖子,但不了解 sudo 代码或数学

任何人都可以在java中简化吗?我不想将曲线绘制为 3 点的 2 段

【问题讨论】:

  • 最后一个链接答案有什么不清楚的地方?
  • 大部分是数学。 python中的sudo代码几乎没有解释它
  • 抱歉,sudo 是什么意思?
  • 抱歉伪代码拼写错误。

标签: java math cubic-bezier


【解决方案1】:

三次贝塞尔曲线分量的公式(比如 X):

X(t) = P0.X*(1-t)^3 + 3*P1.X*(1-t)^2*t + 3*P2.X*(1-t)*t^2 + P3.X*t^3

其中P0P3 是端点,P1P2 是控制点。

我们有四个曲线点(that answer 中的SrcPt 数组),端点与贝塞尔端点重合,曲线上的两个内部点应定义贝塞尔曲线的两个控制点P1P2。为了计算,我们必须知道 - t 参数对应于 SrcPt[1]SrcPt[2]。让这些参数为 1/3 和 2/3(可能的问题在链接的答案中)。

所以将t=1/3t=2/3 代入上述公式:

SrcPt[1].X = SrcPt[0].X*(1-1/3)^3 + 3*P1.X*(1-1/3)^2*1/3 + 
             3*P2.X*(1-1/3)*1/3^2 + SrcPt[3].X*1/3^3
SrcPt[2].X = SrcPt[0].X*(1-2/3)^3 + 3*P1.X*(1-2/3)^2*2/3 + 
             3*P2.X*(1-2/3)*(2/3)^2 + SrcPt[3].X*2/3)^3

并为未知的P1.XP2.X 解决这个系统。所以我们将拥有描述贝塞尔曲线所需的所有点。链接答案实现了解决方案。

示例 - 更改相同内部点的 t 值如何影响曲线:

【讨论】:

  • 这就是决定因素的意义所在。选择 t 为 1/3 和 2/3 的任何原因。选择任何其他值会影响曲线的形状吗?
  • 行列式是方程组解的一部分。 1/3 和 2/3 是任意选择的等间距点,选择任何其他值肯定会影响曲线形式。如果您有一些关于内部点位置的信息,您可以选择其他值(该答案中的函数允许使用其他值)
  • 这就是我所需要的。谢谢
  • 不错。 绘制这个的确切代码是什么?我只知道 Java 7/8 只有一个 path.quadTo() 方法。 whicah 接受 2 分(4 个参数)。没有接受 3 个点(6 个参数)的 path.cubeTo(),例如在Android Java中,这样我们就可以移动到第一个点并用path.cubeTo()绘制剩余的点。
  • @Apostolos 此代码适用于现成的三次贝塞尔基元。也许 Java 的某些库/框架包含三次(语言本身没有图形基元)。当然,您可以通过 Bezier 细分使用直线段来实现三次 Bezier 绘图,但我会选择更简单的方法与库。
【解决方案2】:

计算点后绘制三次曲线p[x][y]

public void paint(Graphics g) {
  Graphics2D g2d = (Graphics2D) g;
  CubicCurve2D cubcurve = new CubicCurve2D.Float(p[0][0], p[0][1], p[1][0], p[1][1], p[2][0], p[2][1], p[3][0], p[3][0]);
  g2d.draw(cubcurve);
}

(回复:http://www.java2s.com/Tutorial/Java/0261__2D-Graphics/CubicCurve2DFloat.htm

【讨论】:

    猜你喜欢
    • 2018-03-10
    • 2011-08-21
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多