我正在使用SFML库在C ++中构建一个程序,该库绘制了数学函数,例如f(x)= sin(x)。用于绘制点的代码是:
VertexArray curve(PrimitiveType::LineStrip, 100);
for (int x = -50; x < 50; x++)
{
curve.append(Vertex(Vector2f(x,- sin(x))));
}
此代码生成此图:
正如您所看到的,由于sf :: Linestrip,情节不平滑并且由短线组成。有没有办法(在SFML中)使这个图更平滑(例如缩短线段)? 非常感谢任何反馈:)。
答案 0 :(得分:3)
最简单的选择是增加线条的分辨率 - 即具有更多,更小线条。这很容易实现,并且可以为您的用例所接受。
Sean Cline评论中的例子应该是一个很好的起点:
for (float x = -50.0f; x < 50.0f; x += .25f)
{
curve.append(Vertex(Vector2f(x,- sin(x))));
}
然后,您可以轻松概括范围和步骤并使用这些值:
float min_range = -200.f;
float max_range = 200.f;
float step = 0.5f;
for (float x = min_range; x < max_range ; x += step)
{
curve.append(Vertex(Vector2f(x,- sin(x))));
}
最后,你可以在一个漂亮的界面背后抽象出来:
using precision = float;
struct plot_params
{
precision _min_range;
precision _max_range;
precision _step;
};
template <typename TFunction>
auto plot(const plot_params pp, TFunction&& f)
{
assert(pp._min_range <= pp._max_range);
assert(pp._step > 0.f);
VertexArray curve(PrimitiveType::LineStrip,
std::ceil((pp._max_range - pp._min_range) / pp._step);
for (auto x = pp._min_range; x < pp._max_range; x += pp._step)
{
curve.append(Vertex(f(x)));
}
}
您可以按如下方式使用plot
:
const auto my_params = []
{
plot_params pp;
pp._min_range = -200.f;
pp._max_range = 200.f;
pp._step = 0.5f;
return pp;
})();
auto curve = plot(my_params,
[](auto x){ return Vector2f(x,- sin(x)); });