gpt4 book ai didi

c++ - 为什么我的贝塞尔曲线实现有偏差?

转载 作者:太空狗 更新时间:2023-10-29 20:58:31 25 4
gpt4 key购买 nike

我想在 C++ 中渲染贝塞尔曲线,所以我开始自己实现它。目前,它不必非常高效。我的代码以某种方式产生了接近的结果,但这些曲线并不准确。 (dvec2 是两个 double 值的 vector 。)

list<dvec2> bezier(list<dvec2> const &points, int resolution)
{
list<dvec2> samples;
double step = 1.0 / resolution;
for (double time = 0.0; time <= 1.0; time += step) {
list<dvec2> sliders = points;
while (sliders.size() > 1)
sliders = slide(sliders, time);
samples.push_back(sliders.front());
}
return samples;
}

list<dvec2> slide(list<dvec2> const &points, double time)
{
list<dvec2> result;
auto current = points.begin();
dvec2 last = *current;
for (++current; current != points.end(); ++current)
result.push_back(last * time + *current * (1.0 - time));
return result;
}

目前,我根据时间 t 将第一个插值到第二个,第二个插值到第三个,依此类推,从曲线创建 n-1 个点。然后,我通过相同的算法再次减少这组新的点,直到我剩下一个可以绘制的点。我认为这种方法应该有效。

在渲染图像上,您可以看到算法在几条渲染曲线上的结果。

rendering looks similar to bezier curves

例如,在图像的左下角,我认为两条相对的曲线应该是对称的。我的方向有偏差。此外,那些完全封闭的曲线至少应该在t=0.5的中心画一个点。是什么原因造成的?

最佳答案

您的方法应该有效。您犯了一个小疏忽:在 slide() 中,您没有更新循环中的 last

尝试:

for (++current; current != points.end(); ++current) {
result.push_back(last * time + *current * (1.0 - time));
last = *current; // <--
}

请注意,可以通过对这些乘积求和来给出对贝塞尔曲线的不同解释:

(Source: wikipedia)

Some terminology is associated with these parametric curves. We have

\mathbf{B}(t) = \sum_{i=0}^n b_{i, n}(t)\mathbf{P}_i,\quad t \in [0, 1]

where the polynomials

b_{i,n}(t) = {n\choose i} t^i (1 - t)^{n - i},\quad i = 0, \ldots, n

are known as Bernstein basis polynomials of degree n.

在这里,您需要(预先计算的)二项式系数,并且通过使用 std::pow 函数,您最终得到一个循环而不是两个嵌套循环(考虑 n 在实践中受到一个常数的限制,使预计算成为可能)。

关于c++ - 为什么我的贝塞尔曲线实现有偏差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27444140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com