2015-10-04 2 views
1

Я пытаюсь провести сегменты линии в openGL. В какой-то момент в моей программе я возвращаю стандартные пары, содержащие координаты X и Y. Я оставил код, где я нажимаю координаты X и Y в вектор из этого сообщения. Я поставил точку останова и подтвердил, что точки внутри вектора являются точками, которые я ожидаю находиться внутри вектора.Проблема с итерацией по вектору пар для рисования линий

Моя проблема заключается в том, что цикл for, где я перебираю вектор пар, ведет себя странно. Если я помещаю точку останова в цикл for, она только срабатывает, когда итератор указывает на последнюю вещь в векторе. Если я попытаюсь распечатать значения с помощью кода с комментариями в цикле for, будут распечатываться только данные последней пары в векторе.

Стоит отметить, что оси X и Y рисуют без проблем. И если я загляну внутрь вектора, посмотрите значения, которые я хочу, а затем жестко задайте эти значения в glVertex2f, они рисуют правильно. Поэтому основная проблема заключается в том, что я не могу заставить код внутри цикла for работать. Я предполагаю, что по какой-то причине цикл for происходит только один раз, поэтому только одна вершина отправляется в openGL, и поэтому в результате этого цикла нет линий.

void Draw(void) 
{ 
    // clear the screen 
    glClearColor(1, 1, 1, 0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glColor3f(0, 0, 0); 

    glBegin(GL_LINES); 

    //Draws the Y Axis 
    glVertex2f(0, 1); 
    glVertex2f(0, -1); 
    //Draws the X axis 
    glVertex2f(1, 0); 
    glVertex2f(-1, 0); 

    std::vector<std::pair<float, float>>::iterator it; 
    for (it = vertices.begin(); it != vertices.end() - 1; ++it); 
    { 
    glVertex2f(it->first, it->second); 
    //std::cout << "vertices.size.." << vertices.size() << std::endl; 
    //std::cout << vertices.at(i).first << " " << vertices.at(i).second << "i: " << i << std::endl; 
    } 

    glEnd(); 
    glutSwapBuffers(); 
} 

void Loop(void) 
{ 
    glutPostRedisplay(); 
} 


int main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 
    glutInitWindowPosition(0, 0); 
    glutInitWindowSize(width, height); 
    glutCreateWindow(name); 
    glutDisplayFunc(Draw); 
    glutIdleFunc(Loop); 
    Init(); 
    glutMainLoop(); 
    return 0; 
} 
+0

это = vertices.end() - 1 ... что -1 здесь требуется ?? – basav

+0

для (std :: vector :: iterator it = v.begin(); it! = V.end(); ++ it) {} .. это не работает? – basav

+0

@basav, если у меня нет -1, я получаю сообщение об ошибке Debug Assertion, Expression: векторный итератор не может быть разыменован. –

ответ

1

Я опробовал ваш код. Странно, что размер напечатан правильно, но все элементы не печатаются в цикле.

Во всяком случае, другой способ (не самый лучший), но это работает бы это:

for(int i = 0;i<vertices.size();++i) 
    { 
    glVertex2f(vertices[i].first, vertices[i].second); 
    } 
+0

Не знаете, почему он исправляет проблему, но это так. –