Создание кривой параболы с помощью SFML VertexArray: левая сторона отображается неправильно

#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 должно быть отрицательным, это тоже работает.