Я не могу понять, почему я не получаю вывод для данной программы. Эта проблема возникала у меня в моих последних 2 программах openGL, предыдущая из которых была алгоритмом DDA, опять же, в которой я не получил никакого вывода. Есть ли проблема с алгоритмом, или в моем понимании, как внутренне работает openGL?
#include <iostream>
#include <GL/glut.h>
using namespace std;
float X1 = 0, X2 = 100, Y1 = 0, Y2 = 400, X11, Y11, X22, Y22, slope, dely, delx, c, intercept, pi;
float absl(float x) {
if (x >= 0) return x;
return -1*x;
}
void drawScene() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 500, 0, 500);
glClearColor(1.0, 1.0, 1.0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
//start bresenham algo
glBegin(GL_POINTS);
glVertex2f(X1, Y1);
while(X1 <= X2) {
X1++;
if(pi < 0) {
glVertex2f(X1, Y1);
}
else {
Y1++;
glVertex2f(X1, Y1);
}
float flag = (pi >= 0);
pi = pi + 2*dely - 2*delx*flag;
}
glEnd();
//end DDA algo
glFlush();
}
int main(int argc, char **argv) {
//cin >> X1 >> Y1 >> X2 >> Y2;
// dely = Y2 - Y1;
// delx = X2 - X1;
// pi = 2*dely - delx;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0,0);
glutCreateWindow("DDA");
glutDisplayFunc(drawScene);
glutMainLoop();
return 0;
}
gluOrtho2D
определяет 2D матрицу ортографической проекции. Но он также умножает текущую матрицу в стеке матриц на матрицу ортографической проекции и заменяет текущую матрицу произведением.
Обратите внимание, что в конвейере фиксированных функций OpenGL все матричные операции работают следующим образом (кроме glPushMatrix
, glPopMatrix
, glLoadMatrix
а также glLoadIdentity
).
Это означает, что вы должны заменить текущую матрицу на единичную матрицу (glLoadIdentity
), прежде чем применять матрицу ортографической проекции:
glLoadIdentity();
gluOrtho2D(0, 500, 0, 500);
Или вы делаете gluOrtho2D
только один раз перед запуском основного цикла в основной функции:
gluOrtho2D(0, 500, 0, 500);
glutMainLoop();
Так как функция отображения вызывается (drawScene
) постоянно следует использовать локальные переменные управления, а не изменять X1
а также Y1
:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 500, 0, 500);
glClearColor(0.0, 0.0, 0.0, 0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
//start bresenham algo
int x = X1, y = Y1;
glBegin(GL_LINES);
glVertex2f(100, 400);
glVertex2f(400, 100);
glEnd();
glBegin(GL_POINTS);
glVertex2f(x, Y1);
while(x <= X2) {
x ++;
if(pi < 0) {
glVertex2f(x, y);
}
else {
y ++
glVertex2f(x, y);
}
}
int flag = (pi >= 0);
pi = pi + 2*dely - 2*delx*flag;
glEnd();
Других решений пока нет …