贝塞尔曲线:强制 4 个点的曲线通过 3D 中的控制点 space

Bezier curve : forcing a curve of 4 points to pass through control points in 3D space

我已经阅读了线程以实现 4 点,但仅限于 2D space here .

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

我已阅读 post 但不理解 sudo 代码或数学

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

三次贝塞尔曲线分量(比如 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 是控制点。

我们有四个曲线点(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 值如何影响曲线:

计算点后绘制三次曲线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