蒙德里安艺术程序Python

2024-06-16 12:13:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个蒙德里安艺术程序……我有随机生成方块的代码……但是我在用原色随机填充方块时遇到了麻烦?有人知道怎么解决吗?这是我的代码:

import turtle
import random


turtle.screensize(1000,1000)
turtle.setworldcoordinates(-500,-500,500,500)

piet = turtle.Turtle()
piet.speed(300)

#primary colors, red, blue, yellow
#piet.color(red,blue,yellow)

rectangles = int(input('How many rectangles should be drawn? '))
rectangle_w = int(input('What should be the max width of the rectangles? '))
rectangle_h = int(input('What should be the max height of the rectangles? '))

def mondrian(t,random_w,random_h):
    piet.begin_fill()
    for number_r in range(1):
        for box in range(2):
            t.left(90)
            t.forward(random_w)
            t.left(90)
            t.forward(random_h)
    piet.end_fill()



mondrian(piet,random.randint(10,rectangle_w),random.randint(10,rectangle_h))

def repeat_mondrian():
    for i in range(rectangles - 1):
        mondrian(piet, random.randint(10, rectangle_w), random.randint(10, rectangle_h))

repeat_mondrian()

谢谢!:)


Tags: theinforinputrangerandombeint
3条回答

这里是你的程序稍微清理了一下,为了便于开发,临时修改了输入。请注意,所有矩形的右下角都是原点。你也应该随机化。在

import turtle
import random


turtle.screensize(1000,1000)
turtle.setworldcoordinates(-500,-500,500,500)

piet = turtle.Turtle()
piet.speed(300)

rectangles = 8 #int(input('How many rectangles '))
rectangle_w = 500 #int(input('Max width of the rectangles? '))
rectangle_h = 500 #int(input('Max height of the rectangles? '))

def mondrian(t,random_w, random_h):
    piet.fillcolor(random.choice(('red','blue','yellow')))
    piet.begin_fill()
    for box in range(2):
        t.left(90)
        t.forward(random_w)
        t.left(90)
        t.forward(random_h)
    piet.end_fill()

def repeat_mondrian():
    for i in range(rectangles):
        mondrian(piet,
                 random.randint(10, rectangle_w),
                 random.randint(10, rectangle_h))

repeat_mondrian()

作为一个粉丝,我认为蒙德里安更多的是用张力和递归的暗示来划分空间,而不是随机的正方形。白色空间多于颜色。在

如果这些人能teach a computer to paint a Rembrandt,那么我们就可以集体教他们画蒙德里安了。以下是我对这一努力的谦虚提议:

import turtle as turtle_graphics
import random
import collections

BORDER_COLOR = '#000000'  # so you can add 'black' to COLORS below

BORDER_WIDTH = 10

MINIMUM_DIVISIBLE_PORTION = .2  # limits recursion

COLORS = ('white', 'white', 'red', 'white', 'blue', 'yellow')  # multiple 'white' to increase probability

Bounds = collections.namedtuple('Bounds', ['x', 'y', 'width', 'height'])

PICTURE_BOUNDS = Bounds(x=-250, y=-300, width=500, height=600)


def fill_rectangle(turtle, bounds, color=BORDER_COLOR):
    """ Fill a rectangle with the border color (by default) and then fill the center with a bright color """
    turtle.penup()
    turtle.goto(bounds.x, bounds.y)
    turtle.color(color)
    turtle.pendown()
    turtle.begin_fill()
    for _ in range(2):
        turtle.forward(bounds.width)
        turtle.left(90)
        turtle.forward(bounds.height)
        turtle.left(90)
    turtle.end_fill()
    turtle.penup()

    if color == BORDER_COLOR:
        fill_rectangle(turtle, Bounds(bounds.x + BORDER_WIDTH, bounds.y + BORDER_WIDTH, bounds.width - BORDER_WIDTH*2, bounds.height - BORDER_WIDTH*2), random.choice(COLORS))


def mondrian(piet, bounds):
    """ Divide, fill and divide & fill some more.  Intuitively and recursively """

    if bounds.width < bounds.height:
        dimension = 'height'
        random_dimension = random.randint(getattr(bounds, dimension) // 5, 2 * getattr(bounds, dimension) // 3)
        bounds_yin = Bounds(bounds.x, y=bounds.y + random_dimension, width=bounds.width, height=bounds.height - random_dimension)
        bounds_yang = Bounds(bounds.x, bounds.y, bounds.width, random_dimension)
    else:
        dimension = 'width'
        random_dimension = random.randint(getattr(bounds, dimension) // 5, 2 * getattr(bounds, dimension) // 3)
        bounds_yin = Bounds(bounds.x, bounds.y, random_dimension, bounds.height)
        bounds_yang = Bounds(x=bounds.x + random_dimension, y=bounds.y, width=bounds.width - random_dimension, height=bounds.height)

    if getattr(bounds_yin, dimension) > getattr(bounds_yang, dimension):
        bounds_paint, bounds_divide = bounds_yang, bounds_yin
    else:
        bounds_paint, bounds_divide = bounds_yin, bounds_yang

    fill_rectangle(piet, bounds_paint)

    if getattr(bounds_divide, dimension) < MINIMUM_DIVISIBLE_PORTION * getattr(PICTURE_BOUNDS, dimension):
        fill_rectangle(piet, bounds_divide)
    else:
        mondrian(piet, bounds_divide)


def paint_canvas(dummy_x=0, dummy_y=0):
    """ Runs the program and can be used as an event handler """
    turtle_graphics.onscreenclick(None)
    fill_rectangle(turtle_graphics, PICTURE_BOUNDS, 'black')
    mondrian(turtle_graphics, PICTURE_BOUNDS)
    turtle_graphics.onscreenclick(paint_canvas)

turtle_graphics.screensize(PICTURE_BOUNDS.width, PICTURE_BOUNDS.height)
turtle_graphics.speed('fastest')
turtle_graphics.hideturtle()

paint_canvas()

turtle_graphics.listen()

turtle_graphics.mainloop()

如果你不喜欢你得到的画,点击画布,它会画另一幅,希望你更喜欢:

enter image description here

@KaileeCollins,我希望这能给你自己的项目一些想法。在

您只需更改turtle.color(您已经注释掉了,只是在错误的位置:

def mondrian(t, random_w, random_h):
    piet.begin_fill()
    piet.color(random.choice(['red', 'blue', 'yellow']))
    # rest of your code goes here

相关问题 更多 >