нарисуйте произвольную линию с помощью OpenGL (т. Е. без ограничения диапазона осей)

#c #opengl #glut

#c #opengl #перенасыщение

Вопрос:

Я хочу нарисовать 2D-линию с параметрами, определенными пользователем. Но диапазон осей x и y равен [-1,1].

Как я могу нарисовать линию, которая может быть полностью отображена в окне? Я использовал gluOrtho2D(-10.0, 10.0, -10.0, 10.0) , но это не кажется хорошим выбором, потому что диапазон является динамическим в соответствии с параметрами.

Например, линия является y=ax^3 bx^2 cx d . диапазон x равен [1, 100].

Мой код:

 #include "pch.h"
#include<windows.h>

#include <gl/glut.h>

#include <iostream>
using namespace std;

double a, b, c, d;
void init(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(-10.0, 10.0, -10.0, 10.0);
}

double power(double x, int p) {
    double y = 1.0;
    for (int i = 0; i < p;   i) {
        y *= x;
    }
    return y;
}

void linesegment(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1, 0, 0);
    glPointSize(1);

    glBegin(GL_POINTS);
    for (int i = 1; i <= 10;   i) {
        double y = a * power(i, 3)   b * power(i, 2)   c * i   d;
        glVertex2f(i, y);
    }
    glEnd();

    glFlush();
}

int main(int argc, char**argv)

{
    if (argc < 4) {
        cout << "should input 4 numbers" << endl;
        return 0;
    }

    a = atof(argv[1]);
    b = atof(argv[2]);
    c = atof(argv[3]);
    d = atof(argv[4]);

    glutInit(amp;argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(50, 100);
    glutInitWindowSize(400, 300);
    glutCreateWindow("AnExample");

    init();

    glutDisplayFunc(linesegment);
    glutMainLoop();

    return 0;
}
  

Комментарии:

1. просто предложение. возможно, вы захотите изучить современный opengl вместо opengl, устаревшего более 10 лет назад

2. «диапазон является динамическим в соответствии с параметрами». — Что?

3. Если вы хотите нарисовать линию, то используйте GL_LINES , GL_LINE_STRIP . Е сли вы хотите рисовать в оконных (пиксельных) координатах, где верхний левый угол равен (0, 0), ортографическая проекция должна быть gluOrtho2D(0.0, 400.0, 300.0, 0.0);

4. @Rabbid76 привет, я имею в виду, что при изменении a, b, c, d изменяется максимальное значение y. Таким образом, параметры gluOrtho2D не могут быть статическими.

5.@IHaveAProblem Затем вы должны установить новую ортографическую проекцию glLoadIdentity(); gluOrtho2D(...);

Ответ №1:

Настройка матрицы проекции — это не одноразовая операция. Вы можете изменить это в любое удобное для вас время. На самом деле, то, как вы это делаете init , настоятельно не рекомендуется. Просто установите параметры проекции в вашей функции рисования. Также используйте стандартные библиотечные функции и не создавайте свои собственные. Нет необходимости внедрять power самостоятельно. Просто используйте pow стандартную библиотечную функцию. И последнее, но не менее важное, используйте двойную буферизацию; поскольку это обеспечивает лучшую производительность и лучшую совместимость.

 #include "pch.h"
#include <windows.h>

#include <gl/glut.h>

#include <iostream>
#include <cmath>
using namespace std;

double a, b, c, d;
double x_min, x_max, y_min, y_max; // <<<<---- fill these per your needs

void linesegment(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(x_min, x_max, y_min, y_max, -1, 1);

    glColor3f(1, 0, 0);
    glPointSize(1);

    glBegin(GL_POINTS);
    for (int i = 1; i <= 10;   i) {
        double y = a * pow(i, 3)   b * pow(i, 2)   c * i   d;
        glVertex2f(i, y);
    }
    glEnd();

    glFlush();
}