Нарисовать окружность на OpenGL по параметрическим формулам

Я хочу нарисовать окружность на OpenGL по точкам. Если рассмотреть окружность как алгебраическое аффинное многообразие, то оказывается, что его можно рационально параметризовать и получить явные выражения для координат точек, лежащих на этой окружности:

введите сюда описание изображения

Я написал код на OpenGL, который по этим формулам рисует точки. Но я не понимаю, в каких пределах должен изменяться параметр t, чтобы была нарисована непрерывная окружность.

#include <iostream>
#include <format>
#include <cstdlib>
#include <cmath>

#include <GLFW/glfw3.h>
#include <GL/gl.h>

static void error_callback(int error, const char* description)
{
    std::cout << std::format("Error: {}", description) << std::endl;
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
    {
        glfwSetWindowShouldClose(window, GLFW_TRUE);
    }
}

static void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f, 0.0f, 1.0f);

    glBegin(GL_POINTS);
    for (double t = 0; t < 1000.0; t += 0.01)
    {
        float x = (1 - std::pow(t, 2)) / (1 + std::pow(t, 2));
        float y = 2*t / (1 + std::pow(t, 2));
        glVertex2f(x, y);
    }
    glEnd();
}

int main()
{
    if (!glfwInit())
    {
        exit(EXIT_FAILURE);
    }

    glfwSetErrorCallback(error_callback);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

    GLFWwindow* window = glfwCreateWindow(640, 480, "Test", nullptr, nullptr);

    if (!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwSetKeyCallback(window, key_callback);

    glfwMakeContextCurrent(window);

    glClearColor(0.0, 1.0, 0.0, 0);

    while (!glfwWindowShouldClose(window))
    {
        display();

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
}

Помогите разобраться, как должен изменяться параметр t, чтобы получилась окружность.


Ответы (0 шт):