Skip to content

Instantly share code, notes, and snippets.

@BekaValentine
Last active August 29, 2015 13:57
Show Gist options
  • Select an option

  • Save BekaValentine/9718653 to your computer and use it in GitHub Desktop.

Select an option

Save BekaValentine/9718653 to your computer and use it in GitHub Desktop.
def rayHit(raySeg, polys):
return minimizeBy([rayIntersectsPoly(raySeg, poly) for poly in polys], lambda(pt => length(pt - raySeg)))
def rayIntersectsPoly(raySeg, poly):
return minimizeBy([rayIntersectsEdge(raySeg, edge) for edge in poly], lambda(pt => length(pt - raySeg)))
def rayIntersectsEdge(raySeg, edgeSeg):
pt = intersectLines(raySeg, edgeSeg)
if lineSegmentContains(edgeSeg, pt) && pointIsInRightDir(raySeg, pt)
then return pt
else return Nothing
def intersectLines(seg, seg'):
dx = seg.end.x - seg.start.x
dy = seg.end.y - seg.start.y
dx' = seg'.end.x - seg'.start.x
dy' = seg'.end.y - seg'.start.y
x = (dy*dx'*seg.start.x + seg.start.y*dx' - dy'*dx*seg'.start.x) / (dy*dx' - dy'*dx)
y = (dy/dx) * (x - x1) + y1
return point(x,y)
def lineSegmentContains(point, seg):
return bounded(seg.start.x, point.x, seg.end.x) && bounded(seg.start.y, point.y, seg.end.y)
def bounded(x, y, z):
return (x <= y <= z) || (z <= y <= x)
def pointIsInRightDir(raySeg, pt):
ptVec = pt - raySet.start
return sign(ptVec.end.x - ptVec.start.x) == sign(raySeg.end.x - raySeg.start.x) &&
sign(ptVec.end.y - ptVec.start.y) == sign(raySeg.end.y - raySeg.start.y)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment