gpt4 book ai didi

python - 使用 pyCairo 填充带有多个孔的多边形

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:58 24 4
gpt4 key购买 nike

我不想用pyCairo填充多边形,但我希望某些区域不填充。例如,我想制作这样的东西:

enter image description here

灰色背景是 SVG 查看器的背景,因此代表图像的透明部分。

我尝试使用此代码:

import cairo

cairo.FILL_RULE_EVEN_ODD
svg_file_pointer = open('CairoPoly.svg', 'wb')
shape_container = cairo.SVGSurface(svg_file_pointer, 500, 500)
shape_description = cairo.Context(shape_container)
shape_description.rectangle(0, 0, 500, 500)
shape_description.clip_preserve()
shape_description.stroke()

shape_description.set_line_width(1)
shape_description.set_source_rgb(20/51, 0, 0)
for r in ((100, 100, 400, 400), (200, 200, 350, 300), (150, 110, 190, 390)):
shape_description.move_to(r[0], r[1])
shape_description.line_to(r[0], r[3])
shape_description.line_to(r[2], r[3])
shape_description.line_to(r[2], r[1])
shape_description.line_to(r[0], r[1])
shape_description.close_path()
shape_description.fill()
shape_container.finish()
svg_file_pointer.close()
del shape_container

但是这不起作用。这可以用 pyCairo 完成吗?如果可以,怎么做?

最佳答案

我不熟悉 pyCairo,但从 SVG 的角度来看,您所做的基本思想是正确的。你很接近,但不太正确。

您想要做的是为每个矩形创建一个带有子路径的路径。

<svg width="500" height="500">
<path d="M 100,100 L 100,400 L 400,400 L 400,100 L 100,100
M 200,200 L 200,300 L 350,300 L 350,200 L 200,200
M 150,110 L 150,390 L 190,390 L 190,110 L 150,110 Z"
fill-rule="evenodd" />
</svg>

看起来这或多或少是您正在做的事情,但您还需要将填充规则更改为“evenodd”。默认的“非零”将导致您的“漏洞”被填充,而不是留下漏洞。

set_fill_rule(cairo.FILL_RULE_EVEN_ODD)

关于python - 使用 pyCairo 填充带有多个孔的多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32821156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com