python - 如何在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() 时得到的结果:
解决方案
好的,我刚刚发现如果我将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])
推荐阅读
- python - Pygame函数在两点之间画一条线不起作用
- android - 更改firebase规则后登录不起作用
- python - 沿 z 轴连接 PyTorch Dataloader
- apache - https 在我的服务器上导致 cloudflare 错误 524
- java - Windows Server 2016 上的文件关闭速度慢
- logstash - 如果我没有定义 start_position,Logstash 不会解析日志
- c# - 字体“?” 找不到 System.Windows.Forms.TextBox()
- oracle-apex - 使用项目中的新值到我的 sql 语句而不将此值保存到数据库
- javascript - 窗口关闭不适用于反应 js 应用程序,如何关闭浏览器 onclick 后退按钮上的当前选项卡?
- terminal - 如何让键绑定在 gnuplot 哑终端中工作?