在SFML中绘制平滑曲线

时间:2017-01-25 15:07:03

标签: c++ math graphics 2d sfml

我正在使用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))));
}

此代码生成此图:

enter image description here

正如您所看到的,由于sf :: Linestrip,情节不平滑并且由短线组成。有没有办法(在SFML中)使这个图更平滑(例如缩短线段)? 非常感谢任何反馈:)。

1 个答案:

答案 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)); });