public static void Intersects(ref Vector2 vertex1, ref Vector2 vertex2, ref Ray2D ray, out float result, float tolerance = 0.0001f) { Vector2 tangent, normal; float edgeMagnitude; Vector2.Subtract(ref vertex1, ref vertex2, out tangent); Vector2Helper.Normalize(ref tangent, out edgeMagnitude, out tangent); Vector2Helper.RightPerp(ref tangent, out normal); float dir; Vector2.Dot(ref normal, ref ray.Direction, out dir); if (MathF.Abs(dir) >= tolerance) { Vector2 originDiff; Vector2.Subtract(ref ray.Origin, ref vertex2, out originDiff); float actualDistance; Vector2.Dot(ref normal, ref originDiff, out actualDistance); var distanceFromOrigin = -(actualDistance / dir); if (distanceFromOrigin >= 0) { Vector2 intersectPos; Vector2.Multiply(ref ray.Direction, distanceFromOrigin, out intersectPos); Vector2.Add(ref intersectPos, ref originDiff, out intersectPos); float distanceFromSecond; Vector2.Dot(ref intersectPos, ref tangent, out distanceFromSecond); if (distanceFromSecond >= 0 && distanceFromSecond <= edgeMagnitude) { // Hit! result = distanceFromOrigin; return; } } } // No hit. result = -1; }