Как остановить GL_Points от удаления строк, созданных GL_line_loop - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю над программой, которая должна позволить пользователю создать многоугольник, а затем указать случайные точки, чтобы программа могла проверить, находятся ли они внутри многоугольника или нет.

GLint vert[100][2];
int width = 400, height = 600, n = 0, type = GL_LINE_STRIP, v;
bool rubberbanding = false;

void display(){
     glClear(GL_COLOR_BUFFER_BIT);
     if(n == 1 && (type == GL_LINE_STRIP)){
          glBegin(GL_POINTS);
          glVertex2iv(vert[0]);
          glEnd();
     }
     glBegin(type);
     for(int i = 0; i < n; i++){
             glVertex2iv(vert[i]);
     }
     glEnd();
     glutSwapBuffers();
}

IУ меня проблемы с этой следующей частью здесь.Пользователь создает линии с помощью GL_LINE_STRIP, а затем он должен щелкнуть «c», чтобы закрыть многоугольник.Однако после того, как они закрыли многоугольник, я хочу, чтобы они могли указывать случайные точки.Но когда я переключаю тип на GL_POINTS, он удаляет все линии, и у меня остаются точки в вершинах.

void keyboard(unsigned char key, int x, int y){
     switch(key){
                 case 'r': n = 0; type = GL_LINE_STRIP;  break;

                 case 'c': type = GL_LINE_LOOP; break;
                 //case 'v': type = GL_POINTS; break;
     }
     // type = GL_POINTS;
     glutPostRedisplay();
}

Как это исправить, чтобы после того, как пользователь закрыл многоугольник, они могли создатьточки без исчезновения многоугольника?

Редактировать: Это код для нажатия кнопки:

void mouse(int button, int state, int x, int y){
     switch(button){
     case GLUT_LEFT_BUTTON:
                         if(state == GLUT_DOWN){
                                  v = n++;
                                  vert[v][0] = x;
                                  vert[v][1] = height - 1 - y;
                                  rubberbanding = true;
                                  glutPostRedisplay();
                         }
                         else{
                                  rubberbanding = false;
                         }
                         break;
     }
}

1 Ответ

0 голосов
/ 16 ноября 2018

Я рекомендую сделать следующее:

Создать функцию отображения, которая может рисовать линии и точки.Строки хранятся в массиве вершин, начиная с индекса 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();
...