нарисовать произвольную линию с помощью OpenGL (т. е. нет ограничений на диапазон оси) - PullRequest
1 голос
/ 11 марта 2019

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

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

Например, строка y=ax^3+bx^2+cx+d. диапазон х равен [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(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(50, 100);
    glutInitWindowSize(400, 300);
    glutCreateWindow("AnExample");

    init();

    glutDisplayFunc(linesegment);
    glutMainLoop();

    return 0;
}

1 Ответ

1 голос
/ 11 марта 2019

Настройка матрицы проекции не является единовременной операцией.Вы можете изменить его в любое время.На самом деле, способ, которым вы делаете 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();
}
...