Нарисовать окружность на 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
, чтобы получилась окружность.