首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Qt/C++:高效绘图

Qt/C++:高效绘图
EN

Stack Overflow用户
提问于 2012-09-28 21:10:57
回答 5查看 7.3K关注 0票数 18

我设计了一个程序,基本上,它将一个几何形状切割成许多小三角形(在“左画布”中),对这一堆三角形应用一些简单的数学变换,然后以新的配置重新绘制它们。请参阅下面的屏幕截图。

为了绘制这些三角形,我使用了QPainter::drawPolygon。右边的每个三角形对应左边的一个三角形,所以我知道我想用什么颜色来画它。

到目前为止,一切都很好。即使我画出比这个更多的三角形(当我使用更小的三角形来切割形状时),这已经足够快了。

我已经在我的程序中添加了一个功能:我可以绘制从图片中提取的三角形,而不是普通的三角形:参见下面的屏幕截图。

问题是我做这件事的方式太慢。我是这样做的:

  1. I遍历所有三角形对于每个三角形,我计算将显示的每个像素的坐标。对于每个像素,我计算图片上相应像素的坐标(这是一个简单的数学运算),并检索该像素的颜色。
  2. I使用QPainter::setPen(QColor)

D12>绘制像素。<代码>H213<代码>G214

我是Qt编程的新手,我对图形一无所知,所以这就是我能想到的。问题是它太慢了(每个画布的paintEvent大约需要0.15s,而普通三角形只需要0.01s )。

我运行了一个分析器,试图了解发生了什么,我注意到在canvas小部件的paintEvent中,

QPainter::drawPoint

  • 27%中花费了58%的时间在QPainter::setPen

中花费了

看起来QPainter::drawPoint太复杂太慢了:我只想让它打印一个给定颜色的像素,仅此而已。

我可能已经找到了问题的解决方案:存储一个表示我希望画布显示的全部内容的QImage (作为canvas小部件的成员变量),并在我的paintEvent中逐个像素地定义它,然后在我的paintEvent结束时使用QPainter::drawImage立即绘制它。我有一个提示,这将是更快的。但是在我重新编写代码之前,我想知道这是否真的是我想要做的。

我希望我没有让你厌烦去做死亡!非常感谢您的真知灼见。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-28 21:46:28

非OpenGl解决方案:

对目标图像使用RGB缓冲区。像以前一样完成你的前3个步骤。找到位置和像素颜色后,您可以在此缓冲区上设置它。然后你可以使用

QImage::QImage ( uchar * data, int width, int height, Format format )

以基于先前的缓冲区构建图像。它与您提供的解决方案很接近,并且将比您当前拥有的解决方案快得多。

票数 4
EN

Stack Overflow用户

发布于 2012-09-28 21:15:10

OpenGL可以很好地进行图像(纹理)坐标映射。您可能想要使用某种形式的OpenGL。Qt提供了一些到OpenGL的绑定,可以帮助您解决问题。

票数 7
EN

Stack Overflow用户

发布于 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是您创建的一些数据结构,用于保存三角形顶点和与图像相关的映射。显卡将为您处理像素插值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12640698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档