#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();
}