【问题标题】:Drawing a smooth curve in SFML在 SFML 中绘制平滑曲线
【发布时间】:2017-06-10 19:55:10
【问题描述】:

我正在使用 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 中)使这个图更平滑(例如通过缩短线段)? 非常感谢任何反馈:)。

【问题讨论】:

  • 您是否尝试通过ContextSettings为窗口启用抗锯齿功能?
  • 您只是以1 为增量进行绘图。尝试增加一个较小的数字以获得曲线上的更多点。您可以将循环更改为 for (float x = -50.0f; x &lt; 50.0f; x+=.25f) 作为快速测试。
  • @SimonKraemer 我刚试过,似乎没有效果。

标签: c++ math graphics 2d sfml


【解决方案1】:

最简单的选择是提高线条的分辨率 - 即有更多更小线条。这很容易实现,并且可能适合您的用例。

Sean Cline 在 cmets 中的示例应该是一个很好的起点:

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

然后您可以轻松地概括 范围step 并使用这些值:

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

【讨论】:

  • 哈哈我之前尝试了第一个选项,但我的代码不起作用。但@SeanCline 似乎用他的 for 循环解决了这个问题。
  • 感谢您提供关于贝塞尔曲线的链接。我会研究他们。
  • 在这里使用贝塞尔曲线没有任何意义,因为与其在您之间插入点,不如只使用您的实际公式。无论如何,您都必须计算/绘制顶点,因此请立即执行..
  • @Mario:是的,原始公式中的更多点总是可以以更高的分辨率生成。出于某种原因,我在考虑已经给出分数的不相关情况。更新答案。
  • @defense2000x:它允许您将my_params 标记为const
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2012-06-09
  • 2023-03-08
  • 2017-01-14
  • 2015-11-18
  • 2023-03-09
  • 2012-05-16
相关资源
最近更新 更多