【问题标题】:Python Turtle transparent fill?Python Turtle 透明填充?
【发布时间】:2021-02-25 22:03:04
【问题描述】:

我正在尝试使用 Turtle 库重新创建这张图片:

但我在尝试使内部圈子“透明”时遇到了困难。 我搜索了文档,但找不到更改圆圈填充颜色的不透明度的方法。

我尝试的是:

colors = ["black", "magenta", "pink", "blue", "green", "yellow", "orange", "red", "white"]

for i in range(8):
    my_turtle.fillcolor(colors[i])
    my_turtle.begin_fill()
    my_turtle.circle(150)
    my_turtle.end_fill()
    my_turtle.fillcolor("white")
    my_turtle.begin_fill()
    my_turtle.circle(130)
    my_turtle.end_fill()
    my_turtle.fillcolor(colors[i])
    my_turtle.begin_fill()
    my_turtle.circle(100)
    my_turtle.end_fill()
    my_turtle.fillcolor("white")
    my_turtle.begin_fill()
    my_turtle.circle(80)
    my_turtle.end_fill()
    my_turtle.rt(45)

但我得到的是:

有什么想法吗?

【问题讨论】:

  • .fillcolor("") 在内圈上会使它透明 - 但这只会显示外圈的颜色,它不会像你需要的那样在外圈上打孔。我能想到用turtle 做到这一点的唯一方法是将圆转换为多边形,并将内部和外部边界绘制为同一.begin_fill() 的一部分 - 其中一个边界在相反方向(顺时针与逆时针)到另一个。

标签: python turtle-graphics python-turtle


【解决方案1】:

您可以反转每个较小的圆圈颜色:

colors = ["black", "magenta", "pink", "blue", "green", "yellow", "orange", "red", "white"]

for i in range(8):
    my_turtle.fillcolor(colors[i])
    my_turtle.begin_fill()
    my_turtle.circle(150)
    my_turtle.circle(130, -360)
    my_turtle.end_fill()
    my_turtle.fillcolor(colors[i])
    my_turtle.begin_fill()
    my_turtle.circle(100)
    my_turtle.circle(80, -360)
    my_turtle.end_fill()
    my_turtle.rt(45)

输出:

【讨论】:

    【解决方案2】:

    您可能不需要像@AnnZen 建议的那样添加负号,而是注释字符。您的代码删除了以下几行,对我来说可以正常工作:

    for i in range(8):
        my_turtle.fillcolor(colors[i])
        my_turtle.begin_fill()
        my_turtle.circle(150)
        # my_turtle.end_fill()
        # my_turtle.fillcolor("white")
        # my_turtle.begin_fill()
        my_turtle.circle(130)
        my_turtle.end_fill()
        # my_turtle.fillcolor(colors[i])
        my_turtle.begin_fill()
        my_turtle.circle(100)
        # my_turtle.end_fill()
        # my_turtle.fillcolor("white")
        # my_turtle.begin_fill()
        my_turtle.circle(80)
        my_turtle.end_fill()
        my_turtle.rt(45)
    

    一个完整的解决方案:

    from turtle import Screen, Turtle
    
    COLORS = ['black', 'magenta', 'pink', 'blue', 'green', 'yellow', 'orange', 'red']
    
    screen = Screen()
    screen.tracer(False)
    
    turtle = Turtle()
    turtle.width(6)
    
    for color in COLORS:
        turtle.fillcolor(color)
    
        turtle.begin_fill()
        turtle.circle(145)
        turtle.circle(130)
        turtle.end_fill()
    
        turtle.begin_fill()
        turtle.circle(115)
        turtle.circle(100)
        turtle.end_fill()
    
        turtle.right(45)
    
    turtle.hideturtle()
    
    screen.tracer(True)
    screen.exitonclick()
    

    Ann Zen 解决方案中的负号使每个环成为一个多边形, 在某一点接触自己,但从不与自己重叠。您的解决方案 产生自重叠的多边形,其基于不同的结果 关于正在使用的多边形填充规则(“奇偶”与“非零绕组” 号”)。

    是的,我们以前见过这种情况,通常带有填充的五角星。让我们进一步推动@AnnZen 的负范围解决方案,在填充之前绘制一个完整的双弧:

    from turtle import Screen, Turtle
    
    COLORS = ['black', 'magenta', 'pink', 'blue', 'green', 'yellow', 'orange', 'red']
    
    screen = Screen()
    
    turtle = Turtle()
    turtle.width(6)
    
    for color in COLORS:
        turtle.fillcolor(color)
    
        turtle.begin_fill()
        turtle.circle(145)
        turtle.circle(130, -360)
        turtle.circle(115)
        turtle.circle(100, -360)
        turtle.end_fill()
    
        turtle.right(45)
    
    turtle.hideturtle()
    
    screen.exitonclick()
    

    这在绕组数方面表现良好吗?

    【讨论】:

    • 我不认为这在所有平台上都能正常工作。 Ann Zen 解决方案中的负号使每个环成为一个多边形,它在一点上与自身接触,但从不与自身重叠。您的解决方案会生成自重叠多边形,这些多边形会根据所使用的多边形填充规则(“奇偶”与“非零绕组数”)产生不同的结果。并且多边形填充规则是由底层平台的图形系统决定的,而不是 Tkinter 保证的任何东西。
    • 我在stackoverflow.com/questions/56032994/…讨论的填充规则差异示例
    • @jasonharper,我理解并同意。总有一天我会运行一个 Windows Python 乌龟来检查这些不一致。有人确认这个失败了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2022-08-04
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多