2016-02-24 32 views
1

里面的乌龟图形,我画了一个矩形和一个圆圈。我如何在每个形状中放置10个随机点?这是我的代码:如何在我的乌龟圈和矩形内生成随机点?

import turtle 
import math 
import random 

# draw a rectangle at a specific location 
def drawRectangle(x = -75, y = 0, width = 100, height = 100): 
    turtle.penup() # Pull the pen up 
    turtle.goto(x + width/2, y + height/2) 
    turtle.pendown() # Pull the pen down 
    turtle.right(90) 
    turtle.forward(height) 
    turtle.right(90) 
    turtle.forward(width) 
    turtle.right(90) 
    turtle.forward(height) 
    turtle.right(90) 
    turtle.forward(width)  


# Draw a circle at a specific location 
def drawCircle(x = 50, y = 0, radius = 50): 
    turtle.penup() # Pull the pen up 
    turtle.goto(x, -50) 
    turtle.pendown() # Pull the pen down 
    turtle.begin_fill() # Begin to fill color in a shape 
    turtle.circle(radius) 
+0

相关:[生成的圆内的随机点(均匀地)](http://stackoverflow.com/q/5837572/953482)。 – Kevin

回答

2

在矩形内部生成随机点,很简单。你只需要生成一个随机的x坐标,范围从原点位置(在你的情况下为-75),直到它的结尾,这将是原点+宽度(-75 + 100)。 然后,你会为y坐标做同样的事情。之后,你移动到生成的位置并绘制一个点。

我的代码:

# draw random dots inside of rectangle 
# @param origin: is a touple, containing `x` and `y` coordinates 
# @param number_of_dots: int, number of dots 
# @param size: is a touple, containing `width` and `height` of rectangle 
def draw_random_dots_in_rectangle(origin, number_of_dots, size=RECTANGLE_SIZE): 
    # loops number_of_dots times 
    for _ in range(number_of_dots): 
     # generate a random position inside of given rectangle 
     # using min/max, because of possible negative coordinates 
     # weakness - does also place dots on the edges of the rectangle 
     rand_x = randint(min(origin[0], origin[0] + size[0]), max(origin[0], origin[0] + size[0])) 
     rand_y = randint(min(origin[1], origin[1] + size[1]), max(origin[1], origin[1] + size[1])) 
     # moves to the random position 
     move_turtle_to((rand_x, rand_y)) 
     # creates a dot 
     t.dot(DOT_DIAMETER) 

然而,做同样的用圆圈是不可能的。它要复杂得多,需要知识analytic geometry。在你的情况下,你需要equation of circles。有了这个,你可以计算,如果生成的位置是或不在给定的圆内。

我的代码:

# draw random dot inside of circle 
# @param origin: is a touple, containing `x` and `y` coordinates 
# @param number_of_dots: int, number of dots 
# @param radious: int, radious of circle 
def draw_random_dots_in_circle(origin, number_of_dots, radius=CIRCLE_RADIOUS): 
    # loops number_of_dots times 
    for _ in range(number_of_dots): 
     # loops until finds position inside of the circle 
     while True: 
      # generates random x position 
      # subtracting radious and adding double of radious to simulate bounds of square 
      # which would be large enought to fit the circle 
      rand_x = randint(min(origin[0] - radius, origin[0] + radius * 2), 
          max(origin[0] - radius, origin[0] + radius * 2)) 
      # generated random y position 
      # adding double of radious to sumulate bounds of square 
      # which would be large enought to fit the circle 
      rand_y = randint(min(origin[1], origin[1] + radius * 2), 
          max(origin[1], origin[1] + radius * 2)) 

      # test if the generated position is in the radious 
      if (origin[0] - rand_x) ** 2 + (origin[1] + radius - rand_y) ** 2 < radius ** 2: 
       # if it is, move to the position 
       move_turtle_to((rand_x, rand_y)) 
       # draw dot 
       t.dot(DOT_DIAMETER) 
       # break out from the infinite loops 
       break 

本质上是相同的过程和以前一样,但与方程式检查。
我希望这至少有一点帮助。我自己曾经多次努力研究如何在计算机科学领域做某些事情,很多时候我发现,解析几何就是答案。所以我强烈建议至少检查一下。
我孔代码:

#!/usr/bin/env python3 

import turtle 
from random import randint 

RECTANGLE_SIZE = 60, 80 
CIRCLE_RADIOUS = 10 
DOT_DIAMETER = 3 

t = turtle.Turtle() # turtle object 
t.speed(0)   # set the fastest drawing speed 

# move turtle to position without drawing 
# @param: position is a touple containing `x` and `y` coordinates 
def move_turtle_to(position): 
    t.up() # equivalent to .penuo() 
    t.goto(position[0], position[1]) 
    t.down() # equivalent to .pendown() 


# draws a rectangle from given origin with given size 
# @param origin: is a touple, containing `x` and `y` coordinates 
# @param size: is a touple, containing `width` and `height` of rectangle 
def draw_rectangle(origin, size=RECTANGLE_SIZE): 
    # movese to the origin 
    move_turtle_to(origin) 

    # simple way of drawing a rectangle 
    for i in range(4): 
     t.fd(size[i % 2]) 
     t.left(90) 

# draws a circle from given origin with given radious 
# @param origin: is a touple, containing `x` and `y` coordinates 
# @param radious: int, radious of circle 
def draw_circle(origin, radius=CIRCLE_RADIOUS): 
    # moves to the origin 
    move_turtle_to(origin) 
    # draws the circle 
    t.circle(radius) 


# Now to what you asked 
# draw random dots inside of rectangle 
# @param origin: is a touple, containing `x` and `y` coordinates 
# @param number_of_dots: int, number of dots 
# @param size: is a touple, containing `width` and `height` of rectangle 
def draw_random_dots_in_rectangle(origin, number_of_dots, size=RECTANGLE_SIZE): 
    # loops number_of_dots times 
    for _ in range(number_of_dots): 
     # generate a random position inside of given rectangle 
     # using min/max, because of possible negative coordinates 
     # weakness - does also place dots on the edges of the rectangle 
     rand_x = randint(min(origin[0], origin[0] + size[0]),  max(origin[0], origin[0] + size[0])) 
     rand_y = randint(min(origin[1], origin[1] + size[1]),  max(origin[1], origin[1] + size[1])) 
     # moves to the random position 
     move_turtle_to((rand_x, rand_y)) 
     # creates a dot 
     t.dot(DOT_DIAMETER) 

# draw random dot inside of circle 
# @param origin: is a touple, containing `x` and `y` coordinates 
# @param number_of_dots: int, number of dots 
# @param radious: int, radious of circle 
def draw_random_dots_in_circle(origin, number_of_dots, radius=CIRCLE_RADIOUS): 
    # loops number_of_dots times 
    for _ in range(number_of_dots): 
     # loops until finds position inside of the circle 
     while True: 
      # generates random x position 
      # subtracting radious and adding double of radious to simulate bounds of square 
      # which would be large enought to fit the circle 
      rand_x = randint(min(origin[0] - radius, origin[0] + radius * 2), 
          max(origin[0] - radius, origin[0] + radius * 2)) 
      # generated random y position 
      # adding double of radious to sumulate bounds of square 
      # which would be large enought to fit the circle 
      rand_y = randint(min(origin[1], origin[1] + radius * 2), 
          max(origin[1], origin[1] + radius * 2)) 

      # test if the generated position is in the radious 
      if (origin[0] - rand_x) ** 2 + (origin[1] + radius - rand_y) ** 2 < radius ** 2: 
       # if it is, move to the position 
       move_turtle_to((rand_x, rand_y)) 
       # draw dot 
       t.dot(DOT_DIAMETER) 
       # break out from the infinite loops 
       break 


# example code 
draw_rectangle((0, 0)) 

draw_random_dots_in_rectangle((0, 0), 50) 

draw_circle((-20, -20)) 

draw_random_dots_in_circle((-20, -20), 20) 

input() 
+0

谢谢,这有帮助! – BenjaminT

+0

是否有简化你写的代码?该代码看起来比我知道的更先进。我也试图让这个圆与矩形的大小相同,并且将它们并排放置。另外,当我播放节目时,它看起来无限。每个形状只需要10个点。 – BenjaminT

+0

@ tin_man12,真的不会想到,如何简化而不改变**赋值**。对于例如如果你想在0,0到inf,inf的空间中完成这些对象,你可以摆脱那些'min' /'max'-es。所以不要做负面一次。 – Pet3rMatta