Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // translation from C code from this answer http://stackoverflow.com/a/1968345/1418097
- type Point2D =
- {
- x: float
- y: float
- }
- let crossing l1start l1finish l2start l2finish =
- let toTuple point = (point.x, point.y)
- let [(p0x, p0y); (p1x, p1y); (p2x, p2y); (p3x, p3y)] = List.map toTuple [l1start; l1finish; l2start; l2finish]
- let s1x = p1x - p0x
- let s1y = p1y - p0y
- let s2x = p3x - p2x
- let s2y = p3y - p2y
- let sdiv = -s2x * s1y + s1x * s2y
- let tdiv = -s2x * s1y + s1x * s2y
- if 0.0 = sdiv || 0.0 = tdiv
- then None
- else
- let s = (-s1y * (p0x - p2x) + s1x * (p0y - p2y)) / sdiv
- let t = ( s2x * (p0y - p2y) - s2y * (p0x - p2x)) / sdiv
- if (s >= 0.0 && s <= 1.0 && t >= 0.0 && t <= 1.0)
- then Some {x = p0x + (t * s1x); y = p0y + (t * s1y)}
- else None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement