九宫格绘制圆角矩形

发布于:2025-02-10 ⋅ 阅读:(29) ⋅ 点赞:(0)
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
  1. 错误的拼接部分分析

    • 在这个代码片段中,对于topRightCircleRegion(右上角部分),它的计算方式导致没有正确地选取右上角的四分之一圆部分来拼接。
    • 按照目前的代码,它实际上选取的部分会偏向于右上角四分之一圆的右侧边界外,而且形状也不符合正确的四分之一圆,这是因为x坐标的计算x + width - borderRadius + xOffset是错误的。
  2. 正确的拼接部分及计算方式

    • 对于右上角的四分之一圆,正确的计算应该是选取以点为圆心,半径为borderRadius的圆的右上角部分。
    • 循环中判断点是否在圆内的正确表达式,这里xOffset,yOffset是相对于圆心x + width - borderRadius的偏移量。
    • 而添加QRect的正确方式应该是,这样才能正确地从右上角开始,向左(通过- xOffset)和向下(通过y + yOffset)选取像素点来构建右上角的四分之一圆区域。
  3. 整体拼接思路回顾

    • 整体思路是把一个圆分成四个象限(四个四分之一圆),分别构建每个象限对应的四分之一圆区域,用于拼接成圆角矩形的四个角。
    • 对于左上角,以为起始坐标,按照正常的构建四分之一圆的方式,通过判断点是否在圆内,从左上角开始向右下方向构建四分之一圆区域。
    • 对于右上角,以为圆心,按照上述正确的计算方式,从右上角开始向左下方向构建四分之一圆区域。
    • 对于左下角,以为圆心,从左下角开始向右上方向构建四分之一圆区域。
    • 对于右下角,以为圆心,从右下角开始左上方向构建四分之一圆区域。
    • 最后将这些构建好的四个角的四分之一圆区域与中间矩形主体部分(经过适当裁剪,去除角部多余部分)以及四条边的小矩形条区域合并,就可以得到完整的圆角矩形遮罩区域。