Самый быстрый метод для вычисления линейной интерполяции между 2 точками в QT с использованием OpenGL - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь интерполировать треугольник с помощью координат вершин.

a
 |\
 | \ 
 |  \
 |    \
b|_ _ _ \c

Я интерполирую вершины в этом порядке (b, a), (a, c) и (c, б).Здесь a, b и c - трехмерные координаты со значением цвета.

a = (x1,y1,z1,c1);
b = (x2,y2,z2,c2);
c = (x3,y3,z3,c3);

Структура, используемая для вычисления:

struct pointsInterpolateStruct{
    QList<double> x,y,z;
    QList<double> r, g, b, clr;
    void clear() {
        x.clear();
        y.clear();
        z.clear();
        r.clear();
        g.clear();
        b.clear();
        clr.clear();
    }
};

Код интерполяции:

QList<double> x,y,z,clrs;

Этот вышеупомянутый список использовался для чтения значений из файла, который содержит координаты a, b и c.

/**
     void interpolate();
     @param1 ipts is an object for the point interpolation struct which holds the x,y,z and color
     @param2  idx1 is the point A
     @param 3idx2 is the point B
     @return returns the interpolated values after filling the struct pointsInterpolateStruct
   */

void GLThread::interpolate(pointsInterpolateStruct *ipts,int idx1, int idx2) {
    int ipStep = 0;
    double delX, imX,iX,delY,imY,iY,delZ,imZ,iZ,delClr,imC,iC;
    ipStep = 5; // number of points needed between the 2 points
    delX = imX = iX = delY = imY = iY = delZ = imZ = iZ = delClr = imC = iC = 0;
    delX = (x.at(idx2) - x.at(idx1));
    imX = x.at(idx1);
    iX = (delX / (ipStep + 1));

    delY = (y.at(idx2) - y.at(idx1));
    imY = aParam->y.at(idx1);
    iY = (delY / (ipStep + 1));

    delZ = (z.at(idx2) - z.at(idx1));
    imZ = z.at(idx1);
    iZ = (delZ / (ipStep + 1));

    delClr = (clrs.at(idx2) - clrs.at(idx1));
    imC = clrs.at(idx1);
    iC = (delClr / (ipStep + 1));
    ipts->clear();
    int i = 0;
    while(i<= ipStep) {
        ipts->x.append((imX+ iX * i));
        ipts->y.append((imY+ iY * i));
        ipts->z.append((imZ+ iZ * i));
        ipts->clr.append((imC + iC * i));
        i++;
    }
}*

Визуализация этих интерполированных точек с использованием OpenGL:

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

void GLWidget::drawInterpolatedTriangle(void) {
            glEnableClientState(GL_COLOR_ARRAY);
            glEnableClientState(GL_VERTEX_ARRAY);
            glColorPointer(3, GL_FLOAT, 0, clr);
            glVertexPointer(3, GL_FLOAT, 0, vrt);
            glPushMatrix();
            glDrawArrays(GL_POLYGON, 0, vrtCnt);
            glPopMatrix();
            glDisableClientState(GL_VERTEX_ARRAY);
            glDisableClientState(GL_COLOR_ARRAY);
        }
    }
}

Теперь все работает нормально.Я получаю желаемый результат.Но проблема в том, что когда я пытаюсь сделать то же самое для числа «n» треугольников (скажем, n = 40 000), приложение падает, даже если я вызвал эту функцию в QThread и обнаружил, что этот метод неэффективенметод, поскольку он требует много времени для вычислений.

Пожалуйста, предложите оптимистичный способ сделать этот процесс, чтобы я мог добиться лучших результатов при хорошей производительности.

Выходное изображение:

Интерполированный треугольник (вид точки)

Вид сетки

Вид полигона

1 Ответ

0 голосов
/ 18 декабря 2018

После изучения памяти, используемой приложением, я обнаружил, что в моей программе хранится большое количество нежелательных данных и массивов (т. Е. Очищается список x, y, z, r, g, b иclrs in pointsInterpolateStruct).Я мгновенно очистил все ненужные / неиспользуемые данные и попытался запустить приложение с большими треугольниками.Теперь я могу добиться лучшей производительности.Я ничего не изменил в процессе визуализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...