2024-09-27 09:22:56 发布
网友
有没有一种简单的方法可以将贝塞尔曲线的一段曲线拟合到三维中的4个点?在
下面是我要做的一个例子:
这里是Bezier的另一个图片段的控制柄:
在这个例子中,我试图用手把贝塞尔曲线排成一行,这样它就可以与4个给定的点相交,从而得到最短的曲线。理想情况下,我想以编程的方式来实现这一点——我在网上找到了一些算法,但大多数算法似乎都是用来创建具有任意数量分段的曲线的。。。而我只需要将一个线段(两个点,两个控制点)与三维中的四个点尽可能接近。在
最好的办法是什么?在
要使单个贝塞尔曲线通过所需的点,您应该知道这些点的参数t。在
t
似乎您没有关于曲线的其他信息,所以在第一次逼近时,您可以先将参数t=1/3分配给第一个点,将参数{}分配给第二个点,然后计算Bezier曲线的控制点以提供P(1/3) == InternalPoint1 and P(2/3) == InternalPoint2
t=1/3
P(1/3) == InternalPoint1 and P(2/3) == InternalPoint2
如果第一个内部点靠近起始点,这种假设可能会导致奇怪的曲线形式,因此在一般情况下,应该粗略地计算参数-例如,使用对之间的距离比P0-P3, P0-P1, P2-P3。在
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;
要使单个贝塞尔曲线通过所需的点,您应该知道这些点的参数
t
。在似乎您没有关于曲线的其他信息,所以在第一次逼近时,您可以先将参数}分配给第二个点,然后计算Bezier曲线的控制点以提供
t=1/3
分配给第一个点,将参数{P(1/3) == InternalPoint1 and P(2/3) == InternalPoint2
如果第一个内部点靠近起始点,这种假设可能会导致奇怪的曲线形式,因此在一般情况下,应该粗略地计算参数-例如,使用对之间的距离比
P0-P3, P0-P1, P2-P3
。在从我的Delphi函数中节选一些伪代码
相关问题 更多 >
编程相关推荐