我试图创建一个蒙德里安艺术节目....我有随机生成正方形的代码。但是我无法用原色随机填充正方形?有谁知道如何解决这个问题?这是我的代码:
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()
谢谢! :)
答案 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()
如果你不喜欢你得到的那幅画,请点击画布,它会画另一幅画,希望更符合你的喜好:
@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 ()