Угол на pygame.draw.arc()
должен быть установлен в радианах. Далее ширина и высота прямоугольной области должны быть больше 0.
Части Recaman Sequence - полукруги. Рассчитайте диаметр детали и вычислите нижнюю левую точку начала квадрата, который окружает круг с соответствующим диаметром детали. Нарисуйте верхний полукруг (от 0
до math.pi
) или нижний полукруг (от math.pi
до 2*math.pi
).
import math
line_width = 5
diameter = abs(dx) + line_width
px = xi if dx > 0 else xi + dx
py = display_height/2 - diameter/2.0
if diameter > line_width*2:
start_ang = 0 if dy < 0 else math.pi
end_ang = start_ang + math.pi + 0.01
pg.draw.arc(screen, black, [px, py, diameter, diameter], start_ang, end_ang, line_width)
например. кривая с limit = 40
:
Полный код:
import pygame as pg
import math
pg.init()
white = (255,255,255)
black = ( 0, 0, 0)
display_width, display_height = (800,600)
def recaman():
sequence = [0]
limit = 40
def genNums(n):
index = 0
for i in range(1,n):
if index-i>0 and index-i not in sequence:
index-=i
sequence.append(index)
else:
index+=i
sequence.append(index)
#screen = pg.display.set_mode((display_width,display_height),pg.FULLSCREEN)
screen = pg.display.set_mode((display_width,display_height))
tick = 0
genNums(limit)
done = False
while tick < 1000000 and not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
zx = display_width/limit
zy = (display_height/2)/limit
xi = 0
yi = 0
xf = 0
yf = 0
curX = 0
curY = 500
screen.fill(white)
direction = 'down'
for n in range(0,len(sequence)-1):
yi = 500
if n % 2 == 0:
direction = 'down'
else:
direction = 'up'
if sequence[n+1] > sequence[n]:
curX += n * zx
xf = curX
xi = curX - (n * zx)
else:
curX -= n * zx
xf = curX
xi = curX + (n*zx)
if direction == 'up':
yf = curY - (n*zy)
if direction == 'down':
yf = curY + (n*zy)
p1 = (xi,yi)
p2 = (xf,yf)
dx = xf - xi
dy = yf - yi
line_width = 5
diameter = abs(dx) + line_width
px = xi if dx > 0 else xi + dx
py = display_height/2 - diameter/2.0
if diameter > line_width*2:
start_ang = 0 if dy < 0 else math.pi
end_ang = start_ang + math.pi + 0.01
pg.draw.arc(screen, black, [px, py, diameter, diameter], start_ang, end_ang, line_width)
pg.display.update()
tick += 1
recaman()