2013-12-09 3 views
0

Итак, я работаю с 2d массивом, и я пытаюсь отобразить его на виджетах с использованием opengl. Кажется, он работает нормально, но не правильно заполняет виджет. Вместо того, чтобы равномерно заполнять его, он перемещается в верхнем правом углу, как показано на изображении ниже. Как я могу заставить это центрировать? enter image description hereзаполнить весь виджет opengl

int x = -0.1; 
int y = -0.1; 
float lengthX = 0.9/ROW; 
float lengthY = 0.9/COLM; 

for (int i = 0; i < ROW; i++) { 
    for (int j = 0; j < COLM; j++) { 
     if (arr[i][j] == 1) { 
      glColor3f(1.0f, 1.0f, 1.0f); 
     } else { 
      glColor3f(0.0f, 0.0f, 0.0f); 
     } 

     glBegin(GL_QUADS); 
      // Q3 Q4 Q1 Q2 
      glVertex2f((-x) + 2 * i * lengthX, (-y) + 2 * j * lengthY); 
      glVertex2f(x + (2 * i + 1) * lengthX, (-y) + (2 * j + 1) * lengthX); 
      glVertex2f(x + (2 * i + 1) * lengthX, y + (2 * j + 1) * lengthY); 
      glVertex2f((-x) + 2 * i * lengthX, y + 2 * j * lengthY); 
     glEnd(); 
    } 
} 
+0

В чем ваша матрица? Кроме того, какие переменные 'ROW' и' COLM' установлены? –

+0

@Alex Larsen оба установлены в 100, 'const int ROW = 100, COLM = 100;' –

+0

Также, что это 'arr'? –

ответ

1

Во-первых, ваш код не так с его переменными; Например, int x = -0.1.

Теперь, чтобы решить эту проблему просто добавьте в начало кода:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, 1, 1, 0, -1, 1); 
glMatrixMode(GL_MODELVIEW); 

Проблема заключалась в том, что вы используете настройки матрицы по умолчанию. В основном, он колеблется от -1, -1 до 1, 1, вместо 0, 0, до 1, 1. Я не могу прочитать ваш код, но если вы можете редактировать первые 4 параметра функции glOrtho (последние два не должны ничего влиять), чтобы изменить видимый диапазон того, что вы рисуете.

Чтобы объяснить немного больше, первый параметр устанавливает левую сторону, вторую правую, третью нижнюю и четвертую вершину. Таким образом, glOrtho(0, 600, 800, 0) означает, что установка вершины в 0, 0 означает, что она отображается в левом верхнем углу, а вершина, установленная на 800, 600, будет отображаться в правом нижнем углу.

Ваша установка показывала только часть того, что она должна была показывать, потому что ее центр был угол вашего экрана.

+0

, есть способ сохранить соотношение сторон, если я изменяю размер массива? когда я меняю его, выходит за рамки виджета, и я не вижу его, как здесь. http://i.imgur.com/B1sPmjt.png –

+0

Я не знаю, что вы говорите. Если вы имеете в виду настройку размера того, что видите, вы можете использовать 'glViewport (0, 0, width, height)'. Если вы имеете в виду, что он не растягивается, это требует либо корректировки области просмотра (как я уже упоминал) соответственно с небольшим количеством математики и рисунка, как у вас, или с использованием вершинных шейдеров, которые намного больше работают и требуют больше математике, но может делать лучше. –

+0

Могу я задать вам несколько вопросов о том, над чем я работаю? http://chat.stackoverflow.com/rooms/42765/openglhelps –

Смежные вопросы