This is my attempt on creating a script that draws a function. It doesnt work properly. You can zoom in on the x axis by the left and right arrow keys and on the y axis with the up and down arous.
import pygame import math import keyboard pygame.init() WIDTH, HEIGHT = 1800, 1000 WIN = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Function Graph") font = pygame.font.Font('freesansbold.ttf', 10) scaley = 100 scalex = 1 spacing = WIDTH/20 maximum = 0 domain = [-180, 180] def f(x): return math.sin(math.radians(x)) return x def drawballat(x, y, size): pygame.draw.circle(WIN, (255, 255, 255), (x+WIDTH/2, y+HEIGHT/2), size) def renderGrid(): print(scalex, spacing) pygame.draw.line(WIN, (200, 200, 200), (0, (HEIGHT / 2)), (WIDTH, (HEIGHT / 2))) pygame.draw.line(WIN, (200, 200, 200), (WIDTH/2, 0), (WIDTH/2, HEIGHT)) for i in range(30): print(i) pygame.draw.line(WIN, (200, 200, 200), (i*spacing*scalex+WIDTH/2, HEIGHT/2 + 5), (i*spacing*scalex+WIDTH/2, HEIGHT/2 - 5)) value = round(i*spacing, 1) text = font.render(str(value), True, (255, 0, 0)) textRect = text.get_rect() textRect.center = (i*spacing*scalex+WIDTH/2, (HEIGHT // 2)+10) WIN.blit(text, textRect) for i in range(30): print(i) pygame.draw.line(WIN, (200, 200, 200), (WIDTH/2-i*spacing*scalex, HEIGHT/2 + 5), (WIDTH/2-i*spacing*scalex, HEIGHT/2 - 5)) value = round(-1*i*spacing, 1) text = font.render(str(value), True, (255, 0, 0)) textRect = text.get_rect() textRect.center = (WIDTH/2-i*spacing*scalex, (HEIGHT // 2)+10) WIN.blit(text, textRect) pygame.draw.line(WIN, (200, 200, 200), (WIDTH/2-5, HEIGHT/2-scaley), (WIDTH/2+5, HEIGHT/2-scaley)) text = font.render(str(round(maximum)), True, (255, 0, 0)) textRect = text.get_rect() textRect.center = (WIDTH/2+15, HEIGHT/2-scaley) WIN.blit(text, textRect) pygame.draw.line(WIN, (200, 200, 200), (WIDTH/2-5, HEIGHT/2-scaley), (WIDTH/2+5, HEIGHT/2-scaley)) text = font.render(str(round(-1*maximum)), True, (255, 0, 0)) textRect = text.get_rect() textRect.center = (WIDTH/2+15, HEIGHT/2+scaley) WIN.blit(text, textRect) for x in range(domain[0], domain[1]): if f(x) > maximum: maximum = f(x) print(maximum) running = True renderGrid() while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if keyboard.is_pressed("down"): print(scaley) scaley-=0.3 WIN.fill((0, 0, 0)) renderGrid() if keyboard.is_pressed("up"): print(scaley) scaley+=0.3 WIN.fill((0, 0, 0)) renderGrid() if keyboard.is_pressed("right"): print(scalex) scalex+=0.01 WIN.fill((0, 0, 0)) renderGrid() if keyboard.is_pressed("left"): print(scalex) scalex-=0.01 WIN.fill((0, 0, 0)) renderGrid() for x in range(domain[0], domain[1]): #print(x, f(x)) drawballat(scalex*x, scaley*f(x), 2) if f(x) > maximum: maximum = f(x) print(maximum) pygame.display.update() pygame.quit()