Add reflection demo
This commit is contained in:
parent
0293c17b3b
commit
17e0ab19ca
52
geom/demos/reflection.py
Normal file
52
geom/demos/reflection.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import pygame
|
||||||
|
from ..geom import Polygon, generate_polygon
|
||||||
|
from .. import WIDTH, HEIGHT, get_cursor_pos, get_inputs
|
||||||
|
from ..colors import *
|
||||||
|
from ..math import *
|
||||||
|
from ..draw import *
|
||||||
|
from math import pi, sin, cos
|
||||||
|
|
||||||
|
class Reflection:
|
||||||
|
|
||||||
|
title = "Reflection"
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.s_angle = -pi/4
|
||||||
|
|
||||||
|
def handle_key_down(self, key):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def handle_input(self):
|
||||||
|
inputs = get_inputs()
|
||||||
|
if inputs[pygame.K_q]:
|
||||||
|
self.s_angle -= (1/60) * pi/3
|
||||||
|
if inputs[pygame.K_e]:
|
||||||
|
self.s_angle += (1/60) * pi/3
|
||||||
|
|
||||||
|
def render(self, surface):
|
||||||
|
self.handle_input()
|
||||||
|
|
||||||
|
s_end = scale(cos(self.s_angle),
|
||||||
|
sin(self.s_angle),
|
||||||
|
WIDTH)
|
||||||
|
s_start = reverse(*s_end)
|
||||||
|
|
||||||
|
# the reflecting surface
|
||||||
|
s = sub(*s_end, *s_start)
|
||||||
|
|
||||||
|
# the incoming ray, towards reflection surface
|
||||||
|
incoming = sub(0, 0, *get_cursor_pos())
|
||||||
|
|
||||||
|
# surface normal
|
||||||
|
normal = normalize(*lnormal(*s))
|
||||||
|
|
||||||
|
# projection of incoming ray onto normal, multiplied by 2
|
||||||
|
projection_2 = dot(*incoming, *normal) * 2
|
||||||
|
|
||||||
|
# outgoing ray, away from reflection surface
|
||||||
|
outgoing = sub(*incoming, *scale(*normal, projection_2))
|
||||||
|
|
||||||
|
line(surface, WHITE, s_start, s_end)
|
||||||
|
line(surface, CYAN, (0, 0), scale(*normal, 1000))
|
||||||
|
line(surface, YELLOW, get_cursor_pos(), (0, 0))
|
||||||
|
line(surface, RED, (0, 0), outgoing)
|
@ -1,5 +1,5 @@
|
|||||||
import pygame
|
import pygame
|
||||||
from .demos import aabb, vec_proj, sat
|
from .demos import aabb, vec_proj, sat, reflection
|
||||||
from . import HEIGHT
|
from . import HEIGHT
|
||||||
from .colors import *
|
from .colors import *
|
||||||
from .draw import text_screen
|
from .draw import text_screen
|
||||||
@ -9,6 +9,7 @@ class Screen:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.demos = [
|
self.demos = [
|
||||||
vec_proj.VecProj(),
|
vec_proj.VecProj(),
|
||||||
|
reflection.Reflection(),
|
||||||
aabb.AABBDistance(),
|
aabb.AABBDistance(),
|
||||||
aabb.PointAABBDistance(),
|
aabb.PointAABBDistance(),
|
||||||
sat.SeparatingAxisTheorem(),
|
sat.SeparatingAxisTheorem(),
|
||||||
|
Loading…
Reference in New Issue
Block a user