我正在处理的作业问题如下:
“在屏幕上绘制两个随机放置的半径为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()
答案 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)