蒙德里安艺术项目Python

时间:2016-04-05 19:23:03

标签: python python-3.x turtle-graphics

我试图创建一个蒙德里安艺术节目....我有随机生成正方形的代码。但是我无法用原色随机填充正方形?有谁知道如何解决这个问题?这是我的代码:

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()

谢谢! :)

5 个答案:

答案 0 :(得分:2)

这是您的程序稍作清理,并暂时修改输入以便于开发。请注意,所有矩形的右下角都是原点。你也应该随机化。

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()

答案 1 :(得分:1)

作为一个粉丝,我看到蒙德里安更多的是用张力和递归而不是随机方块划分空间。比白色空间更大。

如果这些人可以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,我希望这可以为您自己的项目提供一些想法。

答案 2 :(得分:0)

我不会使用太多的乌龟,但经过调查看起来你可能错过了在begin_fill之前放下笔并在之后设置piet.color

**更新** 看起来像fillcolor是可行的,因为你不需要做下垂或penup。 这是mondarian函数的更新代码。

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

答案 3 :(得分:0)

您只需更改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

答案 4 :(得分:0)

又一个实施。这个程序可以在浏览器中运行,选择&#39; Mondrian&#39;演示于:http://www.transcrypt.org/live/turtle_site/turtle_site.html并等待一段时间,疼痛每隔几秒就会改变一次。

您可以修改程序并查看效果。它也可以从控制台使用Python 3.5运行。

# Inspired by our cat Pietje

from turtle import *
from random import *

speed (0)

colors = ('gray', 'green', 'red', 'white', 'blue', 'yellow')
delta = 8
threshold = 100
color ('black', 'black')

def maybe (bias = None):
    return choice ([False, True, bias, bias] if bias != None else [False, True])    

def between (a, b):
    return a + (0.2 + 0.3 * random ()) * (b - a)

recentColors = ['black', 'black']
def originalColor ():
    global recentColors
    while True:
        result = choice (colors)
        if not result in recentColors:
            recentColors = [result, recentColors [0]]
            return result

def rect (xMin, yMin, xMax, yMax):
    for aColor in ('black', originalColor ()):
        color (aColor, aColor)

        up ()
        goto (xMin, yMin)
        down ()

        begin_fill ()
        goto (xMax, yMin)
        goto (xMax, yMax)
        goto (xMin, yMax)
        goto (xMin, yMin)
        end_fill ()

        xMin += delta
        yMin += delta
        xMax -= delta
        yMax -= delta

def draw (xMin = -250, yMin = -300, xMax = 250, yMax = 300):
    if xMax - xMin > threshold and yMax - yMin > threshold:
        if maybe (xMax - xMin > yMax - yMin):
            xMid = between (xMin, xMax)
            if maybe ():
                draw (xMin, yMin, xMid, yMax)
                rect (xMid, yMin, xMax, yMax)
            else:
                rect (xMin, yMin, xMid, yMax)
                draw (xMid, yMin, xMax, yMax)
        else:
            yMid = between (yMin, yMax)
            if maybe ():
                draw (xMin, yMin, xMax, yMid)
                rect (xMin, yMid, xMax, yMax)
            else:
                rect (xMin, yMin, xMax, yMid)
                draw (xMin, yMid, xMax, yMax)
    else:
        rect (xMin, yMin, xMax, yMax)
        ontimer (lambda: (clear (), draw ()), 2000)
draw ()
done ()     

enter image description here