29/03/09 12:36
Il Totem
Non ho risposto perchè ero a Berlino. Comunque, se si tratta di una linea spezzata o di una curva a bassa tensione, si può usare questo codice, che dovrebbe funzionare con qualsiasi array di punti:
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
aaa
22/06/09 14:53
Federico1976
Ho controllato il mio vechio post per caso con latra funzione trovavo solo il punto di intersezione delle rete e non mi riusciva capire se mi cascava nel segmento con questo e perfetto
Aspio sei un mito
Aspio sei un mito
aaa