Clean up and worked on main

This commit is contained in:
Kyler Olsen 2025-02-12 23:33:09 -07:00
parent d3af7327a7
commit 510ce201cd
3 changed files with 63 additions and 100 deletions

View File

@ -3,7 +3,7 @@
from enum import Enum
import math
from typing import Any, Callable, ClassVar, Iterable, Sequence
from typing import Callable, ClassVar, Iterable, Sequence
from textwrap import indent
@ -1323,6 +1323,33 @@ class Screen:
@property
def file_info(self) -> FileInfo: return self._file_info
@property
def top(self) -> None | int: return self._top
@property
def bottom(self) -> None | int: return self._bottom
@property
def right(self) -> None | int: return self._right
@property
def left(self) -> None | int: return self._left
@property
def width(self) -> None | int: return self._width
@property
def height(self) -> None | int: return self._height
@property
def width_scale(self) -> float: return self._width_scale
@property
def height_scale(self) -> float: return self._height_scale
@property
def fps(self) -> int: return self._fps
def tree_str(self, pre: str = "", pre_cont: str = "") -> str:
s: str = f"{pre} Screen\n"
if self._top is not None:
@ -2584,6 +2611,9 @@ class Context:
@property
def file_info(self) -> FileInfo: return self._file_info
@property
def screen(self) -> Screen: return self._screen
def step(self):
for anim in self._animations.values():
anim.step(ContextNamespace(self))
@ -2997,6 +3027,19 @@ def semantics_analyzer(file: File) -> Context:
)
def compile(filename: str) -> Context | CompilerError:
try:
with open(filename, encoding='utf-8') as file:
code = file.read()
tokens = lexer(code, filename)
syntax_tree = syntactical_analyzer(tokens)
context = semantics_analyzer(syntax_tree)
return context
except CompilerError as err:
print(err.compiler_error())
return err
if __name__ == '__main__':
try:
with open("example.graph", encoding='utf-8') as file:

View File

@ -1,53 +0,0 @@
class Equation:
def __init__(self, xf, yf, cf=(255,255,255), wf=1):
self.xf = xf
self.yf = yf
self.cf = cf
self.wf = wf
def _xf(self, t):
if callable(self.xf):
return self.xf(t)
else:
return t
def _yf(self, t):
if callable(self.yf):
return self.yf(t)
else:
return t
def _cf(self, t, r):
if callable(self.cf):
return self.cf(t, r)
else:
return self.cf
def _wf(self, t, r):
if callable(self.wf):
return self.wf(t, r)
else:
return self.wf
def plot(self, r=(0, 12, 0.1), scale=(1,1)):
t = r[0]
prev_x = self._xf(t)
prev_y = self._yf(t)
while t <= r[1]:
x = self._xf(t)
y = self._yf(t)
c = self._cf(t, r)
w = self._wf(t, r)
yield (
int(prev_x * scale[0]),
int(prev_y * scale[1]),
int(x * scale[0]),
int(y * scale[1]),
c,
w,
)
prev_x, prev_y = x, y
t += r[2]

65
main.py
View File

@ -1,7 +1,7 @@
import pygame
import sys
import math
from equation import Equation
from compiler import compile, Context, CompilerError
# Initialize Pygame
pygame.init()
@ -15,61 +15,37 @@ pygame.display.set_caption("Equation Plotter")
pygame.mouse.set_visible(False)
MOD_KEYS = pygame.key.get_mods()
class Hypotrochoid(Equation):
def __init__(self, R, r, d, c=(255,255,255)):
self.R = R
self.r = r
self.d = d
super().__init__(self._h_xf, self._h_yf, self._h_cf, 5)
def _h_xf(self, t):
return (self.R - self.r) * math.cos(t) + self.d * math.cos(((self.R - self.r) / self.r) * t)
def _h_yf(self, t):
return (self.R - self.r) * math.sin(t) - self.d * math.sin(((self.R - self.r) / self.r) * t)
def _h_cf(self, t, r):
c = int(((t - r[0]) / (r[1] - r[0])) * 255)
return c, c, c
# def _h_wf(self, t, r):
# return int(((t - r[0]) / (r[1] - r[0])) * 5)
def main(equ):
def main(filename):
SCREEN_WIDTH = screen.get_width()
SCREEN_HEIGHT = screen.get_height()
HALF_WIDTH = SCREEN_WIDTH // 2
HALF_HEIGHT = SCREEN_HEIGHT // 2
context = compile(filename)
if isinstance(context, CompilerError):
running = False
else:
running = True
# Main loop
off = 0
mouse_x_last, mouse_y_last = pygame.mouse.get_pos()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Clear the screen
screen.fill((0,0,0))
if isinstance(context, Context):
# Clear the screen
screen.fill((0,0,0))
for prev_x, prev_y, x, y, c, w in equ.plot((0 + off, (8 * math.pi) + off, math.pi/32), (100, 100)):
pygame.draw.line(screen, c, (prev_x + HALF_WIDTH, HALF_HEIGHT - prev_y), (x + HALF_WIDTH, HALF_HEIGHT - y), w)
# for prev_x, prev_y, x, y, c, w in equ.plot((0 + off, (8 * math.pi) + off, math.pi/32), (100, 100)):
# pygame.draw.line(screen, c, (prev_x + HALF_WIDTH, HALF_HEIGHT - prev_y), (x + HALF_WIDTH, HALF_HEIGHT - y), w)
pygame.display.flip()
pygame.time.Clock().tick(60)
off += math.pi/128
pygame.display.flip()
pygame.time.Clock().tick(context.screen.fps)
# if direction:
# equ.R += 0.1
# equ.r += 0.05
# if equ.R >= 20:
# direction = False
# else:
# equ.R -= 0.1
# equ.r -= 0.05
# if equ.R <= 6:
# direction = True
context.step()
mouse_x, mouse_y = pygame.mouse.get_pos()
if 5 < math.sqrt(pow(mouse_x_last - mouse_x, 2) + pow(mouse_y_last - mouse_y, 2)):
@ -83,7 +59,4 @@ def main(equ):
pygame.quit()
sys.exit()
# main(Equation(None, lambda t: math.sin(t)))
# main(Hypotrochoid(6, 4, 1))
main(Hypotrochoid(7, 4, 1))
# main(Hypotrochoid(15, 14, 1))
main("example.graph")