【发布时间】:2019-02-20 00:00:52
【问题描述】:
我正在尝试使用QPainter::drawEllipse 来绘制圆圈。我希望能够:
- 设置圆的笔画宽度(
QPen::width) - 选择圆心像素的形状(
1x1、1x2、2x1或2x2) - 可选择填充圆而不是描边
- 确保圆的半径正确(即使笔划宽度大于 1)
这些目标难以实现。这是我要渲染的示例(手工绘制):
图片为 32x32(放大至 512x512)。红色中心点位于 (15, 15)。中心是1x2,所以在中心像素下方有一个额外的红色像素。笔划的宽度为 2 个像素。如果笔画变宽,像素将被添加到圆圈的内部。无论笔画宽度如何,圆的边界框都是相同的。半径为 8 像素。每条蓝线长 8 个像素。 为了清楚起见,红色和蓝色像素只是用于描述圆圈。它们不是我想要的输出的一部分。
我的问题真正归结为渲染一个完全适合矩形内的椭圆。我可以使用中心点、半径和中心形状来计算矩形。那部分很容易。简单地用这个矩形调用drawEllipse 是行不通的。我想我必须在调用drawEllipse 之前以某种方式调整这个矩形,但我不太确定如何调整它。我试过摆弄它,我找到了一些适用于某些笔宽但不适用于其他笔宽的解决方案。
笔帽重要吗?我一直在使用RoundCap。我应该使用不同的上限吗?
我几乎要考虑自己进行像素操作了。我正在渲染到QImage 并使用Source 复合操作,因此我的代码可能比drawEllipse 稍快。 memset 比 QImage::fill 快大约 10 倍,因此编写更快的代码可能不会太难!不过,我宁愿不必这样做。
【问题讨论】:
-
您能否向我们展示一些您尝试过但不完全符合要求的代码?这可能会给你一些更好的答案。
标签: c++ qt geometry qt5 qpainter