QRegion topRightCircleRegion;
for (int yOffset = 0; yOffset < borderRadius; ++yOffset)
{
for (int xOffset = 0; xOffset < borderRadius; ++xOffset)
{
if (std::sqrt((xOffset - borderRadius) * (xOffset - borderRadius) + (yOffset - borderRadius) * (yOffset - borderRadius)) <= borderRadius)
{
topRightCircleRegion += QRect(x + width - borderRadius + xOffset, y + yOffset, 1, 1);
}
}
}
可以把上面代码用xy坐标系来考虑,由于屏幕和数学的坐标系不一致y轴向下递增,基本原理还是一样的,xoffset,yoffset可以看成x,y坐标位置
为了直观显示,使用了Python绘制了一个界面其中圆形的部分代码如下:
def create_circle_region(self, x_center, y_center, radius, right=False, bottom=False):
"""创建四分之一圆区域"""
region = []
for yOffset in range(radius):
for xOffset in range(radius):
if math.sqrt((xOffset - radius) ** 2 + (yOffset - radius) ** 2) <= radius:
if right:
x = x_center + radius - xOffset
else:
x = x_center + xOffset
if bottom:
y = y_center + radius - yOffset
else:
y = y_center + yOffset
region.append((x, y, 1, 1))
return region
错误的拼接部分分析
- 在这个代码片段中,对于
topRightCircleRegion
(右上角部分),它的计算方式导致没有正确地选取右上角的四分之一圆部分来拼接。 - 按照目前的代码,它实际上选取的部分会偏向于右上角四分之一圆的右侧边界外,而且形状也不符合正确的四分之一圆,这是因为
x
坐标的计算x + width - borderRadius + xOffset
是错误的。
- 在这个代码片段中,对于
正确的拼接部分及计算方式
- 对于右上角的四分之一圆,正确的计算应该是选取以点为圆心,半径为
borderRadius
的圆的右上角部分。 - 循环中判断点是否在圆内的正确表达式
,这里xOffset,yOffset是相对于圆心x + width - borderRadius的偏移量。
- 而添加
QRect
的正确方式应该是,这样才能正确地从右上角开始,向左(通过- xOffset
)和向下(通过y + yOffset
)选取像素点来构建右上角的四分之一圆区域。
- 对于右上角的四分之一圆,正确的计算应该是选取以点为圆心,半径为
整体拼接思路回顾
- 整体思路是把一个圆分成四个象限(四个四分之一圆),分别构建每个象限对应的四分之一圆区域,用于拼接成圆角矩形的四个角。
- 对于左上角,以为起始坐标,按照正常的构建四分之一圆的方式,通过判断点是否在圆内,从左上角开始向右下方向构建四分之一圆区域。
- 对于右上角,以为圆心,按照上述正确的计算方式,从右上角开始向左下方向构建四分之一圆区域。
- 对于左下角,以为圆心,从左下角开始向右上方向构建四分之一圆区域。
- 对于右下角,以为圆心,从右下角开始左上方向构建四分之一圆区域。
- 最后将这些构建好的四个角的四分之一圆区域与中间矩形主体部分(经过适当裁剪,去除角部多余部分)以及四条边的小矩形条区域合并,就可以得到完整的圆角矩形遮罩区域。