【问题标题】:Fastest Method to compute Linear interpolation between 2 points in QT using OpenGL使用OpenGL计算QT中2点之间线性插值的最快方法
【发布时间】:2018-12-10 10:20:03
【问题描述】:

我试图在顶点坐标的帮助下插入一个三角形。

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

我按 (b,a)、(a,c) 和 (c,b) 的顺序插入顶点。 这里的 a,b 和 c 是带有颜色值的 3 维坐标。

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 中调用此函数,应用程序也会崩溃,并且我发现此方法不是有效的方法,因为它需要大量的计算时间。

请提出一个乐观的方法来完成这个过程,这样我就可以在良好的表现下取得更好的结果。

输出图像:

插值三角形(点视图)

网格视图

多边形视图

【问题讨论】:

  • 如果您想快速完成此操作,请使用 OpenGL 几何着色器。使用 QOpenGLWidget 而不是 QGLWidget 并利用 QOpenGLShader 的便利性来包装/编译着色器。
  • @ypnos 您能否分享一个示例代码或链接以明确了解 QOpenGLShader ?
  • 对不起,除了 QOpenGLWidget 的 Qt 文档等之外,我没有任何其他内容。
  • 您应该对 x、y、z 和颜色使用 QVector(复杂度 O1)而不是 QList(复杂度 O(n)),并确保所有顶点索引都是有效的(没有超出范围)。

标签: c++ qt opengl linear-interpolation qglwidget


【解决方案1】:

在检查应用程序使用的内存后,我发现我的程序中的列表和数组中存储了大量不需要的数据(即清除列表x,y,z,r,g,b和点中的 clrsInterpolateStruct)。我立即清除了所有不需要/未使用的数据,并尝试使用更大的三角形运行应用程序。现在我可以取得更好的成绩。我在可视化过程中没有改变任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多