Я рекомендую сделать следующее:
Создать функцию отображения, которая может рисовать линии и точки.Строки хранятся в массиве вершин, начиная с индекса 0 и заканчивая индексом m-1
.Точки также хранятся в массиве вершин.Начало в индексе m
и конец в индексе n-1
.
Линии нарисованы с использованием примитивного типа GL_LINE_STRIP
.Если линия замкнута, то используется тип примитива GL_LINE_LOOP
.
Точки нарисованы с использованием GL_POINTS
.
GLint vert[100][2];
int n = 0, m = 0;
bool closed = false;
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(closed ? GL_LINE_LOOP : GL_LINE_STRIP);
for(int i = 0; i < m; i++)
glVertex2iv(vert[i]);
glEnd();
glBegin(GL_POINTS);
for(int i = m; i < n; i++)
glVertex2iv(vert[i]);
glEnd();
glutSwapBuffers();
glutPostRedisplay();
}
В функции keybord
изменяются состояния:
void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case 'r': n = 0; m = 0; closed = false; break;
case 'c': closed = true; break;
}
}
Функция mouse
добавляет координату вершины к контейнеру и увеличивает n
и / илиm
по отношению к государству closed
.
void mouse(int button, int state, int x, int y)
{
switch(button)
{
case GLUT_LEFT_BUTTON:
if( state == GLUT_DOWN )
{
if ( n < 100 )
{
vert[n][0] = x;
vert[n][1] = height - 1 - y;
n ++;
if ( !closed )
m = n;
}
}
break;
}
}
Когда вызывается glVertex , то цвет, который был установлен glColor
.OpenGL - это государственный двигатель.Если состояние изменяется, оно сохраняется до тех пор, пока оно не будет изменено снова, даже за рамками.
Если вы хотите нарисовать линии одним цветом, а точка - другим цветом, чем вы должны установить цвета допетли, которые рисуют линии и точки:
glColor3f(1,1,1);
glBegin(closed ? GL_LINE_LOOP : GL_LINE_STRIP);
for(int i = 0; i < m; i++)
glVertex2iv(vert[i]);
glEnd();
glColor3f(1,0,0);
glBegin(GL_POINTS);
for(int i = m; i < n; i++)
glVertex2iv(vert[i]);
glEnd();
Даже резиновые полосы могут быть легко реализованы.Реализуйте обратный вызов glutPassiveMotionFunc
и сохраните текущую позицию мыши:
int mx = 0, my = 0;
void mousemove(int x, int y)
{
mx = x;
my = height - 1 - y;
}
glutPassiveMotionFunc(mousemove);
Добавьте окончательную координату вершины к текущей позиции мыши при рисованиилиния, зависящая от состояния рисования:
glBegin(closed ? GL_LINE_LOOP : GL_LINE_STRIP);
for(int i = 0; i < m; i++)
glVertex2iv(vert[i]);
if (n>0 && !closed)
glVertex2i(mx, my);
glEnd();