在 SFML 中绘制平滑曲线

Drawing a smooth curve in 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))));
}

此代码生成此图:

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

最简单的选择是增加线条的分辨率 - 即 更多更小 线条。这实现起来很简单,对于您的用例来说可能是可以接受的。

Sean Cline在评论中的例子应该是一个很好的起点:

for (float x = -50.0f; x < 50.0f; x += .25f)
{
    curve.append(Vertex(Vector2f(x,- sin(x))));
}

然后您可以轻松概括 rangestep 并使用这些值:

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