首页 > 解决方案 > 如何在pycairo中正确填充弯曲形状的外部?

问题描述

我正在尝试在 Pycairo 中填充自定义弯曲形状之外的图像区域,但是我正在努力实现这一点。我已经设法通过抚摸具有大厚度的形状并在彼此之上绘制多个尺寸增加的形状来获得所需的结果,但是这种解决方案效率低下(我关心效率,因为我需要快速绘制 1200 个形状,目前需要 1 分钟)。我认为可能有一种方法可以使用面具或剪辑或类似的东西,但在网上找不到任何有帮助的东西。如果有一种方法可以指定仅在路径外部而不是两侧绘制笔划,那也可能是一种解决方案。

有没有更好的方法来实现这一目标?这是我用来绘制曲线形状的代码,calculate_curve_handles 函数仅根据curve_point_1 和2 偏移量返回形状两侧之间的两个曲线句柄。多边形函数返回 N 边多边形的顶点位置

        vertices = polygon(num_sides, shape_radius + (scale * (line_thickness-20)), rotation, [x + offset[0], y + offset[1]])
            for i in range(len(vertices)):
                start_point = [vertices[i][0], vertices[i][1]]
                cr.move_to(start_point[0], start_point[1])

                if i == len(vertices)-1:
                    end_point = [vertices[0][0], vertices[0][1]]
                else:
                    end_point = [vertices[i+1][0], vertices[i+1][1]]
                point_1, point_2 = calculate_curve_handles(start_point, end_point, curve_point_1_offset, curve_point_2_offset)
                cr.curve_to(point_1[0], point_1[1], point_2[0], point_2[1], end_point[0], end_point[1])
        cr.set_line_cap(cairo.LINE_CAP_ROUND)
        cr.fill()

这是期望的结果,通过许多相互叠加的描边对象来实现:

图片

这是我尝试在弯曲路径上使用 cr.fill() 时得到的结果:

图片

标签: pythonmaskfillcairopycairo

解决方案


好的,我刚刚发现如果我将move_to()函数移到顶点的 for 循环之外,它会正确绘制形状。

然后通过将填充规则设置为cr.set_fill_rule(cairo.FILL_RULE_EVEN_ODD)并在形状后面绘制一个大矩形,我可以在更短的时间内获得所需的效果。

cr.move_to(vertices[0][0], vertices[0][1])
            for i in range(0, len(vertices)):
                start_point = [vertices[i][0], vertices[i][1]]

                if i == len(vertices)-1:
                    end_point = [vertices[0][0], vertices[0][1]]
                else:
                    end_point = [vertices[i+1][0], vertices[i+1][1]]
                point_1, point_2 = calculate_curve_handles(start_point, end_point, curve_point_1_offset, curve_point_2_offset)
                cr.curve_to(point_1[0], point_1[1], point_2[0], point_2[1], end_point[0], end_point[1])

推荐阅读