\$\begingroup\$
\$\endgroup\$
I wrote this code using Python 3.5 and Pygame to help me learn more about sine waves. Its goal is to show the variations in the sine and cosine values in the Trigonometry Circle as the distance covered by a point in the circumference increases.
I'd appreciate suggestions and advices about the code, specially about the math involved and my usage of Pygame.
Thanks.
import pygame
import math
SCR_WIDTH = 220
SCR_HEIGHT = 480
RAD_SIZE = 100
CIRCLE_X = int(105)
CIRCLE_Y = int(285)
STD_FONT_SZ = 25
def drawChart(frequency, time, turns, sin, cos, surface):
"""Draws the frequency, time, distance, and sine and cosine values on the given surface"""
freq_txt = font.render("Frequency: {:.3}Hz".format(frequency), False, (0,0,0))
time_txt = font.render("Time: {:.3}s".format(time), False, (0,0,0))
turn_txt = font.render("Turns: {:.3}".format(turns), False, (0,0,0))
sin_txt = font.render("Sine: {:.3}".format(sin), False, (0,0,0))
cos_txt = font.render("Cosine: {:.3}".format(cos), False, (0,0,0))
surface.blit(time_txt,(0,0))
surface.blit(freq_txt,(0,STD_FONT_SZ))
surface.blit(sin_txt,(0,STD_FONT_SZ*2))
surface.blit(cos_txt,(0,STD_FONT_SZ*3))
surface.blit(turn_txt,(0,STD_FONT_SZ*4))
def drawCircle(x,y, surface):
"""Draws the Trigonometry circle on the given surface in position x, y"""
pygame.draw.line(surface,(0,0,0),(x-RAD_SIZE,y),(x+RAD_SIZE,y)) #x-axis
pygame.draw.line(surface,(0,0,0),(x,y-RAD_SIZE),(x,y+RAD_SIZE)) #y-axis
pygame.draw.circle(surface,(0,0,0), (x,y), RAD_SIZE, 1) #main circle
surface.blit(x_txt,(x+RAD_SIZE, y)) #x character
surface.blit(y_txt,(x,y-RAD_SIZE-STD_FONT_SZ-4)) #y character
pygame.init()
pygame.display.set_caption("SineRep v. 1.0")
screen = pygame.display.set_mode((SCR_WIDTH, SCR_HEIGHT), 0, 32)
font = pygame.font.SysFont("arial",STD_FONT_SZ)
frequency = 0.1
x_txt = font.render("x", False, (0,0,0))
y_txt = font.render("y", False, (0,0,0))
while True:
screen.fill((255,255,255))
time = pygame.time.get_ticks()/1000
distance = 2*math.pi*time*frequency
turns = time*frequency
cos = math.cos(distance)
sin = math.sin(distance)
#size of cosine and sine in pixels
cos_pxl = int(cos*RAD_SIZE)
sin_pxl = int(-sin*RAD_SIZE)
##### Draw stuff in the screen
drawChart(frequency, time, turns, sin, cos, screen)
drawCircle(CIRCLE_X, CIRCLE_Y, screen)
pygame.draw.circle(screen,(255,0,0), (CIRCLE_X+cos_pxl,CIRCLE_Y+sin_pxl), 5, 0) #dot
#Auxiliary shapes
pygame.draw.circle(screen,(255,0,0), (CIRCLE_X+cos_pxl,CIRCLE_Y), 3, 1) #cosine dot
pygame.draw.circle(screen,(255,0,0), (CIRCLE_X,CIRCLE_Y+sin_pxl), 3, 1) #sine dot
pygame.draw.line(screen,(255,0,0),(CIRCLE_X,CIRCLE_Y),(CIRCLE_X+cos_pxl,CIRCLE_Y), 2) #projection in x (cos)
pygame.draw.line(screen,(255,0,0),(CIRCLE_X,CIRCLE_Y),(CIRCLE_X,CIRCLE_Y+sin_pxl),2) #projection in y (sine)
event = pygame.event.poll()
if event.type == pygame.QUIT:
break
pygame.display.update()
pygame.quit()
1 Answer 1
\$\begingroup\$
\$\endgroup\$
A few remarks
CIRCLE_X = int(105) CIRCLE_Y = int(285)
- Python is a duck typed language, you don't need a type in order to invoke a method or variable. You could omit the
int()
call here
if __name__ == '__main__':
- guards, use them!
pygame.init() pygame.display.set_caption("SineRep v. 1.0") screen = pygame.display.set_mode((SCR_WIDTH, SCR_HEIGHT), 0, 32) font = pygame.font.SysFont("arial",STD_FONT_SZ) frequency = 0.1 x_txt = font.render("x", False, (0,0,0)) y_txt = font.render("y", False, (0,0,0))
- These should not be global, maybe a function?
def setup_game()
- You have a few PEP8 violations. A good style creates more readable code :)
answered Dec 17, 2017 at 18:32
lang-py