Seu*_*eub 18 c++ graphics qt pixel qpainter
我设计了一个程序,基本上,它将几何形状切割成许多小三角形(在"左侧画布"中),对这组三角形应用一些简单的数学变换,并在新的配置中重绘它们.请参阅下面的屏幕截图
为了绘制这些三角形,我使用QPainter::drawPolygon
.右边的每个三角形对应左边的三角形,所以我知道我想用什么颜色来绘制它.
到目前为止,很好.即使我画了比这更多的三角形(当我使用更小的三角形来切割形状时),这足够快.
我在程序中添加了一个功能:我可以绘制从图片中提取的三角形而不是普通的三角形:请参阅下面的截屏.
问题是我这样做的方式太慢了.我是这样做的:
QPainter::setPen(QColor)
和QPainter::drawPoint(QPoint)
绘制像素.我是Qt编程的新手,我对图形一无所知,所以这就是我能想到的.问题是它"不可接受"太慢(paintEvent
每个画布大约需要0.15s,而普通三角形则为0.01s).
我跑了一个探查器试图了解发生了什么,我注意到在画布小部件中paintEvent
,
QPainter::drawPoint
QPainter::setPen
它似乎QPainter::drawPoint
太复杂和缓慢:我只是想让它打印一个给定颜色的像素,就是这样.
我可能已经找到了解决我的问题的方法:存储一个QImage
(作为我的画布小部件的成员变量),它代表我希望我的画布显示的整个事物,并在我的paintEvent
像素中完全定义它,然后立即绘制它在我结束paintEvent
用QPainter::drawImage
.我有一个提示,这会更快.但在我重新编写代码之前,我想知道这是否真的是我想要做的.
我希望我没有让你做死!非常感谢您的见解.
非 OpenGL 解决方案:
对目标图像使用 RGB 缓冲区。像以前一样完成前 3 个步骤。一旦找到位置和像素颜色,就可以将其设置在此缓冲区上。然后你使用
QImage::QImage ( uchar * data, int width, int height, Format format )
Run Code Online (Sandbox Code Playgroud)
根据先前的缓冲区构造图像。它与您提供的解决方案很接近,并且比您当前拥有的解决方案要快得多。