不同阶(阶)贝塞尔曲线之间的转换

Converting between Bezier Curves of different degree(order)

我正在从事一个涉及贝塞尔曲线的个人项目。我见过许多单独处理二次和三次曲线的实现,但我希望创建一个更通用的算法,我可以通过增加和减少曲线的度数(顺序)来添加和删除控制点。

这不是我的主要问题的一部分,但如果有人知道我可以查看的通用算法示例,如果他们能指出我的方向,我将不胜感激。

首先,我明白任何从低阶到高阶曲线的转换都是近似,而不是等价。我在计算上很满意 "close enough".

其次,我也理解从高阶曲线下降到低阶曲线时会丢失信息。这是不可避免的,因为高阶曲线在曲线中有更多 "bends" 而低阶曲线根本无法逼近。

我接受这些限制,因为需要能够在曲线内添加和减去控制点以获得所需的功能。

我的第一个问题与大约 5 年前提出的这个问题有关: Convert quadratic curve to cubic curve

二次曲线具有三 (3) 个控制点:

Vector3 Start;
Vector3 Control1;
Vector3 End;

转换为立方我们引入第四个控制点...

Vector3 Control2;

..."Between" Control1 和 End。然后我们相应地设置 Control1 和 Control2:

Control2 = new Vector3(
    End.x + ((2.0f / 3.0f) * (Control1.x - End.x)), 
    End.y + ((2.0f / 3.0f) * (Control1.y - End.y)), 
    End.z + ((2.0f / 3.0f) * (Control1.z - End.z))
); 
Control1 = new Vector3(
    Start.x + ((2.0f / 3.0f) * (Control1.x - Start.x)), 
    Start.y + ((2.0f / 3.0f) * (Control1.y - Start.y)), 
    Start.z + ((2.0f / 3.0f) * (Control1.z - Start.z))
); 

我不确定这是否正确。在示例中,仅设置了 'x' 组件。我只是从中推断出 'y' 和 'z'。如果这不正确,那么我很高兴知道什么是正确的。

此示例仅涵盖从二次曲线到三次曲线的转换。控制值似乎是设置坐标中的(2.0f/3.0f)。那么,这是否意味着从三次方转换为四次方将是 (2.0f/4.0f) 或 (3.0f/4.0f) 或完全不同的东西?对于任意顺序的曲线,此转换的适当泛化函数是什么?

我的项目也将使用样条曲线。我正在使用边到边的方法来构造我的样条,其中边被定义为从 1(一条线)到 n 的任意顺序曲线,其中控制点列表中的第一个和最后一个 Vector3 是边和连接边共享前一条边的终点和下一条边的起点。

与贝塞尔曲线不同,我没有添加和减去控制点。相反,我正在划分和合并边缘。将曲线细分为两条阶数不低于 2 的低阶曲线逼近原始曲线的好方法是什么?同样,将两条曲线组合成一条高阶曲线的好方法是什么?

我意识到一个问题要问很多 post,但我觉得最好将它们集中在一个主题中而不是分开。

感谢您的帮助!

您需要通读 http://pomax.github.io/bezierinfo/#reordering 以了解如何将曲线提升到更高阶,这几乎是微不足道的:

这可能看起来很吓人,但如果你真的看看这三个术语中的每一个是什么,这三个术语都是非常简单的小学数学。您通常只需要新的权重,因此将它们生成为新的坐标列表绝对是微不足道的,大约一分钟即可完成。在 Javascript:

function getOneHigher(x, y):
  n = x.length;
  k = n + 1;
  s = n - 1;

  let nx = [], ny =[];
  nx[0] = x[0]; nx[n] = x[s];
  ny[0] = y[0]; ny[n] = y[s];

  for (let i=1; i<n; i++) {
    nx[i] = (n*x[i] + i*x[i-1]) / k;
    ny[i] = (n*y[i] + i*y[i-1]) / k;
  }

  return {nx, ny};
}

我们完成了。调用 getOneHigher(x, y) 将为同一条曲线生成两个新坐标数组,表示为比我们输入的阶数高一级的贝塞尔曲线。请注意,这意味着我们将曲线坐标集保留在相同(字面意思:函数相同)同时减少每个坐标处的切线(因为导数 相同),有效地 "slowing down" 任何经过该曲线追踪路径的东西.

然后,您还想沿着 link 前往解释 how to do the lossy conversion down in a way that minimizes loss of information 的部分中的 Sirver's Castle。这应该是多个问题:这是一个问答网站,如果您不提出具体问题而是将几个技术上无关的问题组合在一个 post.[= 中,未来的访问者将无法找到具体问题的答案。 15=]