#c #sfml
#c #sfml
Вопрос:
Я новичок в SFML и пытаюсь распечатать график с использованием x ^ n sf::VertexArray
.
render()
Функция принимает 2 параметра: окно и std::vector
вызываемые «функции», которые вводят параболы, такие как {«x ^ 2», «x ^ 4» …}:
void render(RenderWindowamp; window, const std::vector<std::string>amp; functions)
{
for (const autoamp; func : functions)
{
//Rendering x^n;
auto s = func;
s[0] = s[1] = '0'; //Deleting "x^" from s
size_t n;
std::stringstream ss(s);
ss >> n;
VertexArray curve(PrimitiveType::LineStrip, 100);
for (float x = 0.f; x < window.getSize().x; x = 0.5f)
{
curve.append(Vertex(Vector2f(20 * x window.getSize().x / 2, -pow(x, n) * 10 window.getSize().y / 2)));
}
window.draw(curve);
}
}
И вот моя main()
функция:
int main()
{
std::vector<std::string> functions;
std::cout << "Type a count of the functions:n";
size_t count;
std::cin >> count;
std::cin.ignore();
std::cout << "Type functions through ENTER(x^n):n";
std::string str;
for (size_t i = 0; i != count; i )
{
std::cout << "y" << i << " = ";
std::getline(std::cin, str);
functions.emplace_back(str);
}
RenderWindow window(sf::VideoMode(1200, 800), "Graph!");
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear(Color::Black);
render(window, functions); //We render graphs as fast as we can
window.display();
}
return 0;
}
Но когда я попытался отобразить «x ^ 2», я увидел это:
Но почему? Как я могу это исправить?
Комментарии:
1. Поскольку
x=0
ваша вершина по-прежнему имеетwindow.getSize().x / 2
координату X. Если выx
уже находитесь в координатах окна, вам не следует снова добавлять центр. Левая половина, которую вы видите, вероятно, потому, что linestrip неявно начинается с (0,0), я недостаточно хорошо знаю SFML, чтобы сказать.2. @Botje, мне нужно напечатать параболу в центре окна, поэтому я должен добавить window.getSize().x / 2 в координату X. Или, может быть, я просто неправильно вас понял?
3. Вы должны убедиться, что (0,0) находится в центре вашего окна, да. Но вы уже перебираете координаты окна, поэтому вам следует вычесть половину размера окна, а не добавлять его. В качестве альтернативы, вам не нужно перебирать координаты окна, а затем x должно быть отрицательным, это тоже работает.