Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Visual Basic 2005   Ciclo Tra due Point di una linea
Forum - C# / VB.NET - Visual Basic 2005 Ciclo Tra due Point di una linea - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 14:36
Domenica, 29/03/2009
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:
Codice sorgente - presumibilmente VB.NET

  1. Function DetectIntersection(ByVal Line1() As PointF, ByVal Line2() As PointF) As PointF()
  2.         If Line1.Length = 1 Then
  3.             Return Nothing
  4.         End If
  5.  
  6.         Dim Result As New List(Of PointF)
  7.  
  8.         For I As Int32 = 0 To Line1.Length - 2
  9.             If Line1(I) = Line2(I) Or Line1(I + 1) = Line2(I + 1) Then
  10.                 If Line1(I) = Line2(I) Then
  11.                     Result.Add(Line1(I))
  12.                 Else
  13.                     Result.Add(Line1(I + 1))
  14.                 End If
  15.                 Continue For
  16.             End If
  17.  
  18.             Dim m1 As Single = (Line1(I + 1).Y - Line1(I).Y) / (Line1(I + 1).X - Line1(I).X)
  19.             Dim q1 As Single = Line1(I).Y - Line1(I).X * m1
  20.             Dim m2 As Single = (Line2(I + 1).Y - Line2(I).Y) / (Line2(I + 1).X - Line2(I).X)
  21.             Dim q2 As Single = Line2(I).Y - Line2(I).X * m2
  22.  
  23.             If m1 = m2 And q1 = q2 Then
  24.                 'Le rette sono coincidenti, ci sono infiniti punti di intersezione
  25.                 Continue For
  26.             ElseIf m1 = m2 Then
  27.                 'Le rette sono parallele, non ci sono punti di intersezione
  28.                 Continue For
  29.             Else
  30.                 Dim p As PointF
  31.                 p.X = (q1 - q2) / (m2 - m1)
  32.                 p.Y = m1 * p.X + q1
  33.                 'Esiste un punto di intersezione, ma bisogna controllare che appartenga
  34.                 'al segmento considerato
  35.                 Dim Area As New RectangleF(Math.Min(Line1(I).X, Line1(I + 1).X), Math.Min(Line1(I).Y, Line1(I + 1).Y), _
  36.                     Math.Abs(Line1(I).X - Line1(I + 1).X), Math.Abs(Line1(I).Y - Line1(I + 1).Y))
  37.                 If Area.Contains(p) Then
  38.                     Result.Add(p)
  39.                 End If
  40.             End If
  41.         Next
  42.  
  43.         Return Result.ToArray()
  44.     End Function


PM
Avatar
Federico1976 (Normal User)
Rookie


Messaggi: 42
Iscritto: 23/03/2009

Segnala al moderatore
Postato alle 16:53
Lunedì, 22/06/2009
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  :hail:

PM
Pagine: [ 1 2 ] Precedente | Prossimo