Почему GL_LINE_LOOP включает в себя точки вне линии в OpenGL? - PullRequest
0 голосов
/ 01 ноября 2019

Я пишу алгоритм заполнения строки динамического сканирования в OpenGL C ++, и я сталкиваюсь с некоторыми проблемами при определении цвета пикселей, в результате чего мой код падает. Я использую GL_LINE_LOOP, чтобы сначала нарисовать контур фигуры, и glReadPixels (), чтобы прочитать значения пикселей.

Например, для приведенного ниже кода некоторые вершины выглядят неокрашенными, а некоторые точки, являющиеся соседями вершин, которые не должны быть частью контура, окрашены.

Это из-за линии OpenGLприближение или есть проблема в том, как я читаю пиксели с помощью glReadPixels ()?

vector<vector<int> > v;

void draw_outline() {
    glBegin(GL_LINE_LOOP);
    for (int i=0; i<v.size(); i++)
        glVertex2i(v[i][0], v[i][1]);
    glEnd();
    glFlush();
}


void fill_color() {
    unsigned char pixel[4];
    vector<vector<int> > int_points;
    vector<int> v1(2,0);

    int x = 0, y = 0, isVertex = 0;

    for (y=0; y<500; y++) {
        int_points.clear();
        for (x=0; x<500; x++) {
            glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
            if ((int)pixel[0] == 255) {
                v1[0] = x - 250; v1[1] = y - 250;
                cout << "X is  " << v1[0] << "   " << v1[1] << endl;
                isVertex = 0;

                for (int i=0; i<v.size(); i++) {
                    if (v[i][0] == v1[0] && v[i][1] == v1[1]) {
                        int next_point = (i + 1) % v.size();
                        int prev_point = (i - 1 + v.size()) % v.size();

                        if ((v[next_point][1] >= v[i][1] && v[prev_point][1] >= v[i][1]) || (v[next_point][1] <= v[i][1] && v[prev_point][1] <= v[i][1])){
                            int_points.push_back(v1);
                            int_points.push_back(v1);
                        }
                        else
                            int_points.push_back(v1);
                        isVertex = 1;
                        break;
                    }
                }
                if (!isVertex)
                    int_points.push_back(v1);
            }
        }

        for (int i=0; i<int_points.size(); i = i + 2) {
            int x1 = int_points[i][0], x2 = int_points[i+1][0];
            for (int j=x1; j<=x2; j++) {
                plot_point(j, int_points[i][1]);
            }
        }
    }
}


void myDrawing() {
    vector<int> p(2,0);
    p[0] = 0; p[1] = 100;
    v.push_back(p);
    p[0] = 100; p[1] = 0;
    v.push_back(p);
    p[0] = 60; p[1] = -120;
    v.push_back(p);
    p[0] = -50; p[1] = -140;
    v.push_back(p);
    p[0] = -100; p[1] = 0;
    v.push_back(p);
    draw_outline();
    fill_color();
    unsigned char pixel[4];
}
...