不同阶(阶)贝塞尔曲线之间的转换
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=]
我正在从事一个涉及贝塞尔曲线的个人项目。我见过许多单独处理二次和三次曲线的实现,但我希望创建一个更通用的算法,我可以通过增加和减少曲线的度数(顺序)来添加和删除控制点。
这不是我的主要问题的一部分,但如果有人知道我可以查看的通用算法示例,如果他们能指出我的方向,我将不胜感激。
首先,我明白任何从低阶到高阶曲线的转换都是近似,而不是等价。我在计算上很满意 "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=]