2016-09-27 10 views
3

- 初心者です。雪片が重ならないようにする方法がわかりません。ありがとう!Pythonで雪片を作成する際にifとthen文を入れる方法

import turtle 

turtle.right(90) 

turtle.penup() 

turtle.goto(-700,300) 

turtle.pendown() 

def snowflakebranch(n): 

    turtle.forward(n*4) 
    for i in range(3): 
     turtle.backward(n) 
     turtle.right(45) 
     turtle.forward(n) 
     turtle.backward(n) 
     turtle.left(90) 
     turtle.forward(n) 
     turtle.backward(n) 
     turtle.right(45) 

def snowflake(n): 

    for i in range(8): 
     snowflakebranch(n) 
     turtle.backward(n) 
     turtle.right(45) 

import random 

turtle.colormode(255) 

turtle.tracer(0) 

for i in range(35): 

    r = random.randint(0, 255) 
    g = random.randint(0, 255) 
    b = random.randint(0, 255) 
    turtle.color(r, g, b) 
    x = random.randint(-500, 500) 
    y = random.randint(-500, 500) 
    d = random.randint(6, 16) 
    snowflake(d) 
    turtle.penup() 
    turtle.goto(x, y) 
    #turtle.forward(250) 
    turtle.pendown() 


    turtle.update() 
+0

残念ながら、SOはQ&Aサイトであり、私のサイトでは「宿題をやる」ことはありません。何を達成しようとしているのか、何を試しているのかなど、詳細を追加してください。必要な場合は、質問を編集してください。 – Corgs

+0

N個の雪片が重なって表示されるかどうかテストする方法について考えてみましょう。目視検査以外でオーバーラップをどのようにテストしますか?それは、新しい雪片の中心点が受け入れ可能かどうか、またはあなたがrandintに戻って行く必要があるかどうかのテストにつながるはずです。 –

答えて

1

1つのアプローチは、各雪片の境界矩形(または円)を計算することです。これらをリストまたはセットとして保存します。新しい雪片を作成する予定がある場合は、まず、その境界の矩形(または円)が以前の雪片の境界と重なるかどうかを確認します。もしそうなら、それを描かないでください。そうでない場合は、それを描いてその境界を保存してください。このアプローチの不完全概要:

import turtle 
import random 

def snowflakebranch(n): 

    turtle.forward(n * 4) 

    for _ in range(3): 
     turtle.backward(n) 
     turtle.right(45) 
     turtle.forward(n) 
     turtle.backward(n) 
     turtle.left(90) 
     turtle.forward(n) 
     turtle.backward(n) 
     turtle.right(45) 

def snowflake(n): 

    for _ in range(8): 
     snowflakebranch(n) 
     turtle.backward(n) 
     turtle.right(45) 

def overlapping(bounds_list, bounds): 
    for previous in bounds_list: 
     if overlap(previous, bounds): 
      return True 

    return False 

def overlap(b1, b2): 
    # return True or False if these two rectanges or circles overlap 
    pass 

turtle.penup() 

turtle.colormode(255) 

turtle.tracer(0) 

previous_bounds = [] 

i = 0 

while i < 35: 

    x = random.randint(-500, 500) 
    y = random.randint(-500, 500) 
    turtle.goto(x, y) 

    r = random.randint(0, 255) 
    g = random.randint(0, 255) 
    b = random.randint(0, 255) 
    turtle.color(r, g, b) 

    turtle.pendown() 

    d = random.randint(6, 16) 

    # work out the bounding rectangle or circle based on 'd', 'x' & 'y' 
    # e.g. (x, y, width & height) or (x, y, radius) 
    bounds = (...) 

    if not overlapping(previous_bounds, bounds): 

     snowflake(d) 

     turtle.update() 

     previous_bounds.append(bounds) 

     i += 1 

    turtle.penup() 

turtle.done() 

も表示バウンディング円で上記のロジックを使用して、非重複の雪片の画像:

enter image description here

I実際にあなたの重複雪の外観のような。オーバーラップしたい場合でも、上記のロジックを使用すると、オーバーラップの量を制御できます。

+0

あなたの詳細な説明をありがとうございます。 –

関連する問題