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

问题描述 投票:0回答:1

我正在开展一个涉及贝塞尔曲线的个人项目。我见过许多单独处理二次曲线和三次曲线的实现,但我正在寻求创建一种更通用的算法,在其中我可以通过增加和减少曲线的阶数(阶数)来添加和删除控制点。

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

首先,我知道任何从低阶曲线到高阶曲线的转换都是近似值,而不是等价的。我对计算上“足够接近”感到满意。

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

我对这些限制很满意,因为有必要能够在曲线内添加和减去控制点以获得所需的功能。

我的第一个问题与大约 5 年前提出的问题有关: 将二次曲线转换为三次曲线

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

Vector3 Start;
Vector3 Control1;
Vector3 End;

转换为三次方我们引入了第四个控制点...

Vector3 Control2;

...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 逼近原始曲线的低阶曲线的好方法是什么?同样,将两条曲线组合成一条高阶曲线的好方法是什么?

我意识到在一篇文章中要问的问题很多,但我觉得最好将其放在一个主题中而不是将其分开。

感谢您的帮助!

c# unity-game-engine unityscript bezier curves
1个回答
2
投票

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

这可能看起来很可怕,但如果你真正看看这三个术语分别是什么,你会发现这三个术语都是小学数学中极其简单的部分。您通常只需要新的权重,因此将它们生成为新的坐标列表绝对是微不足道的,并且只需大约一分钟即可完成。在 JavaScript 中:

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

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

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

  return {nx, ny};
}

我们就完成了。调用

getOneHigher(x, y)
将产生同一条曲线的两个新坐标数组,表示为比我们输入的阶次高一级的贝塞尔曲线。请注意,这意味着我们保持曲线坐标集相同(从字面上看:函数是相同的),同时减少每个坐标处的切线(因为导数相同),有效地“减慢”沿着该曲线追踪的路径行进的任何东西。

然后,您还需要点击该部分中 Sirver's Castle 的链接,该链接解释了如何以最大限度地减少信息丢失的方式进行有损转换

© www.soinside.com 2019 - 2024. All rights reserved.