2016-04-05 14 views
1

私はMondrian Artプログラムを作成しようとしています....私はランダムに四角形を生成するコードを持っています。しかし、私はランダムに四角形を原色で塗りつぶすのに問題がありますか?誰もそれを修正する方法を知っていますか?これは私のコードです:Mondrian Art Program 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() 

ありがとう! :)

答えて

0

私は多くのカメを使用していませんが、調査の結果、begin_fillの前にペンを入れていない可能性があり、そのあとpiet.colorに設定しているようです。

**アップデート** fillcolorのように見えますが、あなたはペンダウンやペナンプをする必要はありません。 ここにはmondarian機能の更新コードがあります。あなたは単にあなただけの間違った場所に、コメントアウトしているturtle.color(変更する必要が

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

:ここ

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

'色(colorstring)'変更ペンとfillcolorの両方。 'fillcolor'はしません。 Anilは鉛筆を指定しなかったが、Mondrianは太い黒線を使用した。 –

+0

私が言ったように、私は多くのタートルを使用しないので、考え出していました。それ以降はコードを更新しました。今ではランダムに色を選択することができ、コードはTerryと同じであることが判明しました。ちょうど1行を変更しなければならなかった。 –

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

を、私はMORであるとしてモンドリアンを見ますランダムな四角ではなく、緊張と再帰のヒントを使って空間を分割すること。色よりも空白が多い。

これらの人々がteach a computer to paint a Rembrandtの場合、我々は集合的に1つをモンドリアンに塗ることができるはずです。あなたはあなたが得る絵を好きではない場合

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、私はあなた自身のプロジェクトのためのいくつかのアイデアを与えることを願っています。

0

さらに別の実装です。このプログラムはブラウザで実行し、「Mondrian」デモを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