0

I have a code that moves all the circles from a spirograph away from the center. This is how its supposed to look like: this is how it is supposed to start out before it gets moved

Then, I want to move the all of the circles, together, at once, away from the center: this is what its supposed to look like after its been moved

This is my current code:

import time
import pygame
import math
import sys

# setting colors
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
ORANGE = (255, 127, 0)
YELLOW = (255, 255, 0)
PURPLE = (160, 32, 240)
# setting what order the colors go in
listCircleColor = (RED, BLUE, GREEN, ORANGE, YELLOW, PURPLE, WHITE)
# how many circles per color
intGroup = 5
# the space between each circle
turnangle = 360 / 35
# width of screen
width = 600
# height of screen
height = 600
# radius of circles
radius = 100
# making the screen
screen = pygame.display.set_mode((width, height))
# if the code is running, then continue
running = True
clock = pygame.time.Clock()

##.draw.circle(screen, BLUE, (0, 0), radius, width=2)
alpha = turnangle
circles = []
# draw
alpha = turnangle
for i in range(intGroup):
    for cl in listCircleColor:
        if alpha > 0 and alpha < 90:
            x = 300 + radius * math.cos(math.radians(alpha))
            y = 300 + radius * math.sin(math.radians(alpha))
            pygame.draw.circle(screen, cl, (x, y), radius, width=2)
            # second quarter of circles
        if alpha > 90 and alpha < 180:
            x = 300 - radius * math.cos(math.radians(180 - alpha))
            y = 300 + radius * math.sin(math.radians(180 - alpha))
            pygame.draw.circle(screen, cl, (x, y), radius, width=2)
            # third quarter of circles
        if alpha > 180 and alpha < 270:
            x = 300 - radius * math.cos(math.radians(alpha - 180))
            y = 300 - radius * math.sin(math.radians(alpha - 180))
            pygame.draw.circle(screen, cl, (x, y), radius, width=2)
            # last quarter of circles
        if alpha > 270 and alpha < 360:
            x = 300 + radius * math.cos(math.radians(360 - alpha))
            y = 300 - radius * math.sin(math.radians(360 - alpha))
            pygame.draw.circle(screen, cl, (x, y), radius, width=2)

        circles.append(([x, y], cl, alpha))
        alpha = alpha + turnangle
        pygame.display.update()
        clock.tick(10)
        #circle = [pygame.draw.circle(screen, cl, (300 + radius * math.cos(math.radians(alpha)), 300 + radius * math.sin(math.radians(alpha))), radius, width=2)]
        #circles = {'circles': circle.get_rect()}

# move"
trangleedge = radius
movetimes = 1
time.sleep(2)



# exit only when user clicks on exit button
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    screen.fill((0, 0, 0))
    while movetimes <= 100:
        trangleedge = trangleedge + 1
        for circle in circles:
            #x = circle[0][0]
            #y = circle[0][1]
            alpha = circle[2]
            cl = circle[1]

            if alpha > 0 and alpha < 90:
                x = 300 + trangleedge * math.cos(math.radians(alpha))
                y = 300 + trangleedge * math.sin(math.radians(alpha))
                #pygame.draw.circle(screen, cl, (x, y), radius, width=2)
                # second quarter of circles
            if alpha > 90 and alpha < 180:
                x = 300 - trangleedge * math.cos(math.radians(180 - alpha))
                y = 300 + trangleedge * math.sin(math.radians(180 - alpha))
                #pygame.draw.circle(screen, cl, (x, y), radius, width=2)
                # third quarter of circles
            if alpha > 180 and alpha < 270:
                x = 300 - trangleedge * math.cos(math.radians(alpha - 180))
                y = 300 - trangleedge * math.sin(math.radians(alpha - 180))
                #pygame.draw.circle(screen, cl, (x, y), radius, width=2)
                # last quarter of circles
            if alpha > 270 and alpha < 360:
                x = 300 + trangleedge * math.cos(math.radians(360 - alpha))
                y = 300 - trangleedge * math.sin(math.radians(360 - alpha))
                #pygame.draw.circle(screen, cl, (x, y), radius, width=2)

            circle[0][0] = x
            circle[0][1] = y
            screen.fill((0, 0, 0))
            for center, color, alpha in circles:
                pygame.draw.circle(screen, color, center, radius, 2)

            pygame.display.flip()
        clock.tick(60)
        movetimes += 1

this is the result:enter image description here

It creates basically 2 pictures and blits them together, but I don't want that. I want it to start out as a spirograph and then all the circles slowly move away from the center at once.

Edit: https://i.stack.imgur.com/ODIVY.jpg This is what the finished project is supposed to look like, but there is no "delay" when the circles move.What i mean is that the circles should be moving together, and not one by one like the code shown here.

Edit 2: I achieved what i wanted thanks to someone showing me their code. I then took their code as an example and made it what i described. Now i just need to move the circles in groups of their color.

Ven
  • 31
  • 5

1 Answers1

1

You need to change the distance from the center of each circle to the center of the window. Use pygame.math.Vector2. Coumpute the vector (v) from the center of the window to the center of the circle and scale it with scale_to_length:

window_center = pygame.math.Vector2(300, 300)
for circle in circles:
    circle_center = pygame.math.Vector2(circle[0])
    v = circle_center - window_center 
    v.scale_to_length(distance_from_center)
    new_circle_center = window_center + v
    circle[0][0] = round(new_circle_center.x)
    circle[0][1] = round(new_circle_center.y)

Change distance_from_center by time:

direction = 1
distance_from_center = radius

while running:
    # [...]

    distance_from_center += direction
    if distance_from_center >= 200 or distance_from_center <= 100:
        direction *= -1

If you just want to move the circles outward, here's what you can do:

distance_from_center = radius

while running:
    # [...]

    if distance_from_center < 200:
        distance_from_center += 1

Complete example:

import pygame
import math

# setting colors
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
ORANGE = (255, 127, 0)
YELLOW = (255, 255, 0)
PURPLE = (160, 32, 240)
# setting what order the colors go in
listCircleColor = (RED, BLUE, GREEN, ORANGE, YELLOW, PURPLE, WHITE)
# how many circles per color
intGroup = 5
# the space between each circle
turnangle = 360 / 35
# width of screen
width = 600
# height of screen
height = 600
# radius of circles
radius = 100
# making the screen
screen = pygame.display.set_mode((width, height))
# if the code is running, then continue
running = True

##.draw.circle(screen, BLUE, (0, 0), radius, width=2)
alpha = turnangle
circles = []
# draw
alpha = turnangle
for i in range(intGroup):
    for cl in listCircleColor:
        x = 300 + radius * math.cos(math.radians(alpha))
        y = 300 + radius * math.sin(math.radians(alpha))
        circles.append(([x, y], cl, alpha))
        alpha = alpha + turnangle

clock = pygame.time.Clock()
direction = 1
distance_from_center = radius

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

    window_center = pygame.math.Vector2(300, 300)
    for circle in circles:
        circle_center = pygame.math.Vector2(circle[0])
        v = circle_center - window_center 
        v.scale_to_length(distance_from_center)
        new_circle_center = window_center + v
        circle[0][0] = round(new_circle_center.x)
        circle[0][1] = round(new_circle_center.y)

    # move in and out
    distance_from_center += direction
    if distance_from_center >= 200 or distance_from_center <= 100:
        direction *= -1

    # only move out
    #if distance_from_center < 200:
    #    distance_from_center += 1

    screen.fill((0, 0, 0))
    for center, color, alpha in circles:
        pygame.draw.circle(screen, color, center, radius, 2)
    pygame.display.update()
    clock.tick(40)

pygame.quit()
exit()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174