我设计了一个程序,基本上,它将一个几何形状切割成许多小三角形(在“左画布”中),对这一堆三角形应用一些简单的数学变换,然后以新的配置重新绘制它们。请参阅下面的屏幕截图。
为了绘制这些三角形,我使用了QPainter::drawPolygon
。右边的每个三角形对应左边的一个三角形,所以我知道我想用什么颜色来画它。
到目前为止,一切都很好。即使我画出比这个更多的三角形(当我使用更小的三角形来切割形状时),这已经足够快了。
我已经在我的程序中添加了一个功能:我可以绘制从图片中提取的三角形,而不是普通的三角形:参见下面的屏幕截图。
问题是我做这件事的方式太慢。我是这样做的:
QPainter::setPen(QColor)
D12>绘制像素。<代码>H213<代码>G214
我是Qt编程的新手,我对图形一无所知,所以这就是我能想到的。问题是它太慢了(每个画布的paintEvent
大约需要0.15s,而普通三角形只需要0.01s )。
我运行了一个分析器,试图了解发生了什么,我注意到在canvas小部件的paintEvent
中,
在QPainter::drawPoint
QPainter::setPen
中花费了
看起来QPainter::drawPoint
太复杂太慢了:我只想让它打印一个给定颜色的像素,仅此而已。
我可能已经找到了问题的解决方案:存储一个表示我希望画布显示的全部内容的QImage
(作为canvas小部件的成员变量),并在我的paintEvent
中逐个像素地定义它,然后在我的paintEvent
结束时使用QPainter::drawImage
立即绘制它。我有一个提示,这将是更快的。但是在我重新编写代码之前,我想知道这是否真的是我想要做的。
我希望我没有让你厌烦去做死亡!非常感谢您的真知灼见。
发布于 2012-09-28 21:46:28
非OpenGl解决方案:
对目标图像使用RGB缓冲区。像以前一样完成你的前3个步骤。找到位置和像素颜色后,您可以在此缓冲区上设置它。然后你可以使用
QImage::QImage ( uchar * data, int width, int height, Format format )
以基于先前的缓冲区构建图像。它与您提供的解决方案很接近,并且将比您当前拥有的解决方案快得多。
发布于 2012-09-28 21:15:10
OpenGL可以很好地进行图像(纹理)坐标映射。您可能想要使用某种形式的OpenGL。Qt提供了一些到OpenGL的绑定,可以帮助您解决问题。
发布于 2012-09-28 21:31:17
一种方法是使用从QGLWidget继承的类,而不是QGraphicsScene/QGraphicsView组合。不幸的是,OpenGL的学习曲线一开始有点陡峭。然而,它将是非常快的,因为它将直接发生在显卡上,显卡针对这种操作进行了优化。
您将加载图像QGLWidget::bindTexture()
。
您将把图像中的点与您的三角形网格相关联,并将它们全部发送到显卡。在遗留版本的OpenGL中(在我看来,它比新版本的应用程序接口更容易使用),它看起来像这样:
glEnable(GL_TEXTURE_2D);
glBegin(GL_TRIANGLES);
for (int ii=0;ii<triangle.size();++ii) {
for (int jj=0;jj<3;++jj) {
glTexCoord2d(triangle[ii].tex[jj][0],triangle[ii].tex[jj][1]);
glVertex2d(triangle[ii].point[jj[0],triangle[ii].point[jj][1]);
}
}
glEnd();
其中,triangle
是您创建的一些数据结构,用于保存三角形顶点和与图像相关的映射。显卡将为您处理像素插值。
https://stackoverflow.com/questions/12640698
复制相似问题