如何在我的乌龟圈和矩形内生成随机点?

时间:2016-02-24 20:57:17

标签: python function random turtle-graphics

在乌龟图形内部,我画了一个矩形和一个圆圈。如何在每个形状中放置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) 

1 个答案:

答案 0 :(得分: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()