Function DetectIntersection(ByVal Line1() As PointF, ByVal Line2() As PointF) As PointF()
If Line1.Length = 1 Then
Return Nothing
End If
Dim Result As New List(Of PointF)
For I As Int32 = 0 To Line1.Length - 2
If Line1(I) = Line2(I) Or Line1(I + 1) = Line2(I + 1) Then
If Line1(I) = Line2(I) Then
Result.Add(Line1(I))
Else
Result.Add(Line1(I + 1))
End If
Continue For
End If
Dim m1 As Single = (Line1(I + 1).Y - Line1(I).Y) / (Line1(I + 1).X - Line1(I).X)
Dim q1 As Single = Line1(I).Y - Line1(I).X * m1
Dim m2 As Single = (Line2(I + 1).Y - Line2(I).Y) / (Line2(I + 1).X - Line2(I).X)
Dim q2 As Single = Line2(I).Y - Line2(I).X * m2
If m1 = m2 And q1 = q2 Then
'Le rette sono coincidenti, ci sono infiniti punti di intersezione
Continue For
ElseIf m1 = m2 Then
'Le rette sono parallele, non ci sono punti di intersezione
Continue For
Else
Dim p As PointF
p.X = (q1 - q2) / (m2 - m1)
p.Y = m1 * p.X + q1
'Esiste un punto di intersezione, ma bisogna controllare che appartenga
'al segmento considerato
Dim Area As New RectangleF(Math.Min(Line1(I).X, Line1(I + 1).X), Math.Min(Line1(I).Y, Line1(I + 1).Y), _
Math.Abs(Line1(I).X - Line1(I + 1).X), Math.Abs(Line1(I).Y - Line1(I + 1).Y))
If Area.Contains(p) Then
Result.Add(p)
End If
End If
Next
Return Result.ToArray()
End Function