Skip to content

Instantly share code, notes, and snippets.

@iminurnamez
Last active August 29, 2015 14:08
Show Gist options
  • Save iminurnamez/4e8d505daf423d1f3db4 to your computer and use it in GitHub Desktop.
Save iminurnamez/4e8d505daf423d1f3db4 to your computer and use it in GitHub Desktop.
finding where a ray intersects the edge of a bounding rectangle
import sys
from math import pi, tan
import pygame as pg
from angles import get_angle, project
def get_edge_pos(origin, angle, rect):
"""Returns the intersection of the ray from
origin at angle with the edge of rect. origin
should be a point inside rect."""
tl = get_angle(origin, rect.topleft)
tr = get_angle(origin, rect.topright)
br = get_angle(origin, rect.bottomright)
bl = get_angle(origin, rect.bottomleft)
if tl >= angle >= tr:
edge_dist = origin[1] - rect.top
edge_angle = get_angle(origin, (origin[0], rect.top))
dist = edge_dist * tan(angle - edge_angle)
edge_pos = (origin[0] - dist, rect.top)
elif (tr >= angle>= 0) or (2*pi >= angle>= br):
edge_dist = rect.right - origin[0]
edge_angle = get_angle(origin, (rect.right, origin[1]))
dist = edge_dist * tan(angle - edge_angle)
edge_pos = (rect.right, origin[1] - dist)
elif bl <= angle<= br:
edge_dist = rect.bottom - origin[1]
edge_angle = get_angle(origin, (origin[0], rect.bottom))
dist = edge_dist * tan(angle - edge_angle)
edge_pos = (origin[0] + dist, rect.bottom)
elif tr <= angle<= br:
edge_dist = origin[0] - rect.left
edge_angle = get_angle(origin, (rect.left, origin[1]))
dist = edge_dist * tan(angle- edge_angle)
edge_pos = (rect.left, origin[1] + dist)
return edge_pos
class AngleTest(object):
def __init__(self):
self.done = False
self.screen = pg.display.set_mode((800, 800))
self.screen_rect = self.screen.get_rect()
self.clock = pg.time.Clock()
self.origin = self.screen_rect.center
#self.origin = (200, 200)
#self.origin = (600, 200)
#self.origin = (600, 600)
#self.origin = (200, 600)
def event_loop(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.done = True
def update(self):
self.mouse_pos = pg.mouse.get_pos()
self.ray_end = get_edge_pos(self.origin,
get_angle(self.origin, self.mouse_pos),
self.screen_rect)
def draw(self):
self.screen.fill(pg.Color("black"))
pg.draw.line(self.screen, pg.Color("green"), self.origin, self.ray_end)
pg.draw.line(self.screen, pg.Color("red"), self.origin, self.mouse_pos)
def run(self):
while not self.done:
self.event_loop()
self.update()
self.draw()
pg.display.update()
self.clock.tick(60)
if __name__ == "__main__":
test =AngleTest()
test.run()
pg.quit()
sys.exit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment