如何在Pygame中随机生成的两个点之间每20像素绘制一个圆?

时间:2019-05-21 19:39:58

标签: python pygame

我正在处理的作业问题如下:

  

“在屏幕上绘制两个随机放置的半径为10的圆,然后从一个中心到另一个中心每二十个像素绘制一个半径为2的圆。”

我毫不费力地随机生成两个半径为10的圆,但是我不知道如何绘制两个半径为10的圆。

我已经尝试过在它们之间画一条线,如果有办法沿着那条线画点,我绝对可以做到。我查找了类似的问题,其中许多问题都提到了Bresenham's line algorithm,但我怀疑这是答案,因为它似乎非常先进。

这是我到目前为止解决该问题的代码:

import pygame
from random import randint

linecolour = 0,0,0
bgcolour = 255, 255, 255
width = 600
height = 600

screen = pygame.display.set_mode((width, height))
running = 1

x = []
y = []

for i in range (2):
    x.append(randint(0,600))
    y.append(randint(0,600))


done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: # or other types of events
            done = True

    screen.fill(bgcolour)

    for i,j in zip(x,y):
        pygame.draw.circle(screen,linecolour,(i,j),10)

        pygame.draw.circle(screen,linecolour,(i,j),2)

    pygame.display.flip()

2 个答案:

答案 0 :(得分:2)

计算从1个点到另一个点的方向向量:

dir = x[1]-x[0], y[1]-y[0]

计算点之间的Euclidean distance。请注意,您必须import math

dist = math.sqrt(dir[0]*dir[0] + dir[1]*dir[1])

@MadPhysicist

的答案中指出的
dist = math.hypot(*dir)

要绘制的点数为int(dist) // 20。计算循环中直线上的点:

for i in range(int(dist) // 20):
    px = int(x[0] + dir[0] * i*20/dist)
    py = int(y[0] + dir[1] * i*20/dist)

绘制小点的代码如下:

done = False
while not done:

    # [...]

    dir = x[1]-x[0], y[1]-y[0]
    dist = math.hypot(*dir)
    for i in range(1, int(dist) // 20 + 1):
        pt = int(x[0] + dir[0] * i*20/dist), int(y[0] + dir[1] *i*20/dist)
        pygame.draw.circle(screen, linecolour, pt, 2)

答案 1 :(得分:2)

如果以正确的方式看待,这是一个非常简单的问题。我建议从极坐标的角度来看它。如果您有两个以(x[0], y[0])(x[1], y[1])为中心的圆,则它们之间的直线的斜率是(y[1] - y[0]) / (x[1] - x[0]),但您也可以查看圆的 angle 行:

phi = math.atan2(y[0] - y[1], x[0] - x[1])

从一个中心到另一个中心的距离由

给出
r = math.hypot(y[0] - y[1], x[0] - x[1])

现在,您可以轻松地以(x[0], y[0])的角度从phi沿直线以20的步长步进,直到距离超过r。第i步的x-坐标是

i * 20 * math.cos(phi)

类似地,y坐标为

i * 20 * math.sin(phi)

您可以将步骤总数计算为r // 20。同样,math.sin(math.atan2(y, x))简化为y / math.hypot(y, x),类似的余弦简化为x / math.hypot(y, x)。总而言之,您得到

sep = 20
dx = x[1] - x[0]
dy = y[1] - y[0]
r = math.hypot(dy, dx)
n = int(r // sep)
x_step = sep * dx / r
y_step = sep * dy / r
coords = [(x[0] + i * x_step, y[0] + i * y_step) for i in range(n)]

如果您需要整数坐标:

coords = [(x[0] + int(i * x_step), y[0] + int(i * y_step)) for i in range(n)]

要绘制:

for coord in [(x[0] + int(i * x_step), y[0] + int(i * y_step)) for i in range(n)]:
    pygame.draw.circle(screen, linecolour, coord, 2)