将单个贝塞尔曲线拟合到三维中的4个点

2024-09-27 09:22:56 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种简单的方法可以将贝塞尔曲线的一段曲线拟合到三维中的4个点?在

下面是我要做的一个例子:

bezier_1

这里是Bezier的另一个图片段的控制柄:

bezier_2

在这个例子中,我试图用手把贝塞尔曲线排成一行,这样它就可以与4个给定的点相交,从而得到最短的曲线。理想情况下,我想以编程的方式来实现这一点——我在网上找到了一些算法,但大多数算法似乎都是用来创建具有任意数量分段的曲线的。。。而我只需要将一个线段(两个点,两个控制点)与三维中的四个点尽可能接近。在

最好的办法是什么?在


Tags: 方法算法数量编程方式情况图片曲线
1条回答
网友
1楼 · 发布于 2024-09-27 09:22:56

要使单个贝塞尔曲线通过所需的点,您应该知道这些点的参数t。在

似乎您没有关于曲线的其他信息,所以在第一次逼近时,您可以先将参数t=1/3分配给第一个点,将参数{}分配给第二个点,然后计算Bezier曲线的控制点以提供P(1/3) == InternalPoint1 and P(2/3) == InternalPoint2

如果第一个内部点靠近起始点,这种假设可能会导致奇怪的曲线形式,因此在一般情况下,应该粗略地计算参数-例如,使用对之间的距离比P0-P3, P0-P1, P2-P3。在

从我的Delphi函数中节选一些伪代码

  procedure CalcBezierFromPoints(SrcPt: 4 source points
                                 BezPt: 4 resulting control points
                                 t1: Double = 1 / 3; t2: Double = 2 / 3);
 var
    tt1, tt2: Double;
    Det, a11, a12, a21, a22, b1, b2: Double;
begin
   //start and end points remains the same
   BezPt[0] := SrcPt[0];
   BezPt[3] := SrcPt[3];

   //auxiliary values
   tt1 := 1 - t1;
   tt2 := 1 - t2;

   //Solution of linear equation system
   a11 := 3 * tt1 * tt1 * t1;
   a12 := 3 * tt1 * t1 * t1;
   a21 := 3 * tt2 * tt2 * t2;
   a22 := 3 * tt2 * t2 * t2;
   Det := a11 * a22 - a12 * a21;

   b1 := SrcPt[1].X - SrcPt[0].X * tt1 * tt1 * tt1 - SrcPt[3].X * t1 * t1 * t1;
   b2 := SrcPt[2].X - SrcPt[0].X * tt2 * tt2 * tt2 - SrcPt[3].X * t2 * t2 * t2;
   BezPt[1].X := Round((b1 * a22 - b2 * a12) / Det);
   BezPt[2].X := Round((-b1 * a21 + b2 * a11) / Det);

  //the same for Y and Z components
end;

相关问题 更多 >

    热门问题