【发布时间】:2014-12-12 12:55:50
【问题描述】:
我想用 C++ 渲染贝塞尔曲线,所以我开始自己实现它。目前,它不必非常有效。我的代码以某种方式产生了接近的结果,但这些曲线并不准确。 (dvec2 是两个双精度值的向量。)
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 个点。然后,我用相同的算法再次减少这组新的点,直到剩下一个可以绘制的点。我认为这种方法应该可行。
在渲染图像上,您可以在多条渲染曲线上看到算法结果。
例如,在图像的左下角,我认为两条相对的曲线应该是对称的。我的偏向于方向。此外,那些完全封闭的曲线应该至少在 t=0.5 的中心画一个点。这是什么原因造成的?
【问题讨论】:
-
在阅读您的代码时,您使用非常量引用的事实非常烦人并且让我很困惑。我确定你正在改变函数中的列表,但实际上你没有......你使用列表而不是向量是否有原因?几乎在每个用例场景中,列表都会变慢。
-
@leemes 感谢您的建议,我会添加它们。