# Trigonometry Circle representation using Python and Pygame

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

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.circle(surface,(0,0,0), (x,y), RAD_SIZE, 1) #main circle

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

##### 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()


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__':

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 :)