首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将一条bezier曲线拟合为4点的三维曲线

将一条bezier曲线拟合为4点的三维曲线
EN

Stack Overflow用户
提问于 2019-01-15 12:03:12
回答 1查看 870关注 0票数 0

有没有一种简单的方法来拟合一段bezier曲线到3D中的4点?

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

下面是另一张为该段生成的Bezier句柄的图片:

在这种情况下,我尝试用手排列bezier,使它与给定的4个点相交,并得到尽可能最短的曲线。理想情况下,我想以某种方式来实现这个目标--我已经在网上找到了一些算法,但是它们中的大多数似乎都是用来创建任意数量的曲线的.而我只需要把一个单一的片段(两个点,两个控制点)与四个点的3D尽可能接近。

做这件事最好的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-16 05:26:32

要使单个 Bezier曲线通过所需的点,您应该知道这些点的参数t

似乎您没有关于曲线的附加信息,因此作为第一步,您可以将参数t=1/3分配给第一个点,参数t=2/3指定给第二个点,然后计算Bezier曲线的控制点以提供P(1/3) == InternalPoint1 and P(2/3) == InternalPoint2

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

linked answer中的更多信息和图片

用伪码摘录我的Delphi函数

代码语言:javascript
运行
复制
  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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54198446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档