使用 OpenGL 计算 QT 中两点之间线性插值的最快方法
Fastest Method to compute Linear interpolation between 2 points in QT using OpenGL
我正在尝试借助顶点坐标对三角形进行插值。
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 中调用这个函数应用程序也会崩溃,我发现这个方法不是一种有效的方法,因为它需要花费大量时间进行计算。
请建议一个乐观的方法来做这个过程,这样我才能在好的表现上取得更好的结果。
输出图像:
内插三角形(点视图)
网格视图
多边形视图
在检查应用程序使用的内存后,我发现程序中的列表和数组中存储了大量不需要的数据(即清除列表 x,y,z,r,g, b 和 clrs 在 pointsInterpolateStruct 中)。我立即清除了所有不需要的/未使用的数据,并尝试 运行 具有更大三角形的应用程序。现在我可以获得更好的性能。我在可视化过程中没有改变任何东西。
我正在尝试借助顶点坐标对三角形进行插值。
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 中调用这个函数应用程序也会崩溃,我发现这个方法不是一种有效的方法,因为它需要花费大量时间进行计算。
请建议一个乐观的方法来做这个过程,这样我才能在好的表现上取得更好的结果。
输出图像:
内插三角形(点视图)
网格视图
多边形视图
在检查应用程序使用的内存后,我发现程序中的列表和数组中存储了大量不需要的数据(即清除列表 x,y,z,r,g, b 和 clrs 在 pointsInterpolateStruct 中)。我立即清除了所有不需要的/未使用的数据,并尝试 运行 具有更大三角形的应用程序。现在我可以获得更好的性能。我在可视化过程中没有改变任何东西。