How can a display a circle made of dots in pygame?

Viewed 297

I have an Pixel object like this:

class Pixel:
    def __init__(self, screen, color, pos, size=8):
        self.screen = screen
        self.color = color
        self.pos = pos
        self.size = size

    def update(self):
        pygame.draw.circle(self.screen, self.color, self.pos, self.size)

And I want to create an output and looks like a circle made of those Pixel objects. So far, I've tried a program like this:

# PyMate

import pygame
from pygame.colordict import THECOLORS
from drawing import Pixel, Frame

frame = Frame((800, 650))
frames = [frame]
pixels = []

x, y = 50, 50
li = []

for i in range(1000):
    li.append(Pixel(frames[0], THECOLORS["orange"], (x, y)))

    if i % 500 == 0:
        x -= 0.002
        y -= 0.006
    else:
        y += 0.006
        x += 0.002

pixels.extend(li)
frames.append(frame)

running = True
while running:
    frame = Frame((800, 650))
    frames.append(frame)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    for i in frames:
        i.fill(THECOLORS["white"])

    for i in pixels:
        i.update()

    del frame, frames[0]

    pygame.display.update()

This kind of works, but it draws a straight line (not what I wanted). The part I'm really fouced on is this:

for i in range(1000):
    li.append(Pixel(frames[0], THECOLORS["orange"], (x, y)))

    if i % 500 == 0:
        x -= 0.002
        y -= 0.006
    else:
        y += 0.006
        x += 0.002

The x and y changes don't seem to be right, the modulus number doesn't seem to be right either. What numbers could they be?

1 Answers

One way is to step forward with a vector of constant length but changing angle:

x, y = 300, 200
step = 20
angle = 0
for i in range(36):
    x -= math.sin(angle*math.pi/180) * step
    y += math.cos(angle*math.pi/180) * step 
    angle += 10
    pixels.append(Pixel(screen, "orange", (x, y)))

Minimal examaple:

import pygame
import math

class Pixel:
    def __init__(self, screen, color, pos, size=8):
        self.screen = screen
        self.color = color
        self.pos = pos
        self.size = size
    def update(self):
        pygame.draw.circle(self.screen, self.color, self.pos, self.size)

screen = pygame.display.set_mode((800, 650))

pixels = []
x, y = 300, 200
step = 20
angle = 0
for i in range(36):
    x -= math.sin(angle*math.pi/180) * step
    y += math.cos(angle*math.pi/180) * step 
    angle += 10
    pixels.append(Pixel(screen, "orange", (x, y)))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill(0)
    for p in pixels:
        p.update()
    pygame.display.update()
Related