【问题标题】:Issue with iterating over vector of pairs to draw lines迭代对向量以绘制线条的问题
【发布时间】:2016-01-01 01:00:45
【问题描述】:

我正在尝试在 openGL 中绘制线段。在我的程序中的某个时刻,我推回包含 X 和 Y 坐标的标准对。我留下了将 X 和 Y 坐标推入本文中的向量的代码。我已经放置了一个断点并确认向量内的点是我希望在向量内的点。

我的问题是,我在对向量上进行迭代的 for 循环表现得很奇怪。如果我在 for 循环中放置一个断点,它只会在迭代器指向向量中的最后一个东西时触发。如果我尝试在 for 循环中使用注释掉的代码打印出值,则只会打印向量中最后一对的数据。

值得注意的是,它们的 X 轴和 Y 轴绘制没有问题。如果我查看向量内部,查看我想要的值,然后将这些值硬编码到 glVertex2f 中,它们会正确绘制。所以核心问题是我无法让 for 循环内的代码工作。我的猜测是,出于某种原因,for 循环只发生一次,因此只有一个顶点被发送到 openGL,因此该 for 循环不会绘制任何线条。

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;
}

【问题讨论】:

  • it != vertices.end() - 1...这里需要什么-1??
  • for(std::vector::iterator it = v.begin(); it != v.end(); ++it) {}..这行不通??
  • @basav,如果我没有 -1,我会得到 Debug Assertion Failed, Expression: vector iterator not dereferencable。

标签: c++ opengl iterator glut stdvector


【解决方案1】:

我试用了您的代码。奇怪的是,大小打印正确,但循环内没有打印任何元素。

无论如何,另一种方式(不是最好的)但可行的是:

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

【讨论】:

  • 不知道为什么它可以解决问题,但确实可以。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2021-09-20
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多