在 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))));
}
然后您可以轻松概括 range 和 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)); });
我正在使用 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))));
}
然后您可以轻松概括 range 和 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)); });