Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Calcolo di punti intermedi ad una retta! [VB.Net]
Forum - C# / VB.NET - Calcolo di punti intermedi ad una retta! [VB.Net]

Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 20:30
Martedì, 10/07/2012
Ciao a tutti, ho bisogno di sapere come calcolare i punti intermedi ad un segmento conoscendo i punti di inizio e di fine! Mi spiego meglio, quando passo questi due punti ad una funzione, quest'ultima deve calcolare tutti i punti intermedi ai punti passati, non il punto medio. Per esempio il punto A ha le coordinate (0;0) mentre il punto B ha le coordinate (10;10). Ora la funzione dovrà inserire in una lista di punti i punti:
0;0
1;1
2;2
ecc.
e non 5;5 (il punto medio). Avevo pensato di disegnare la retta su di una bitmap e poi leggere i pixel con il colore della retta ma non mi sembra un modo molto elegante e inoltre è lentissimo (ho provato)! :)
Come posso risolvere?
Grazie!


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:38
Martedì, 10/07/2012
La questione è solamente geometrica non grafica.

Ma non ho capito esattamente cosa devi calcolare alla fine ... ti serve il punto medio dati i punti iniziale e finale?

http://it.wikipedia.org/wiki/Punto_medio

Ultima modifica effettuata da nessuno il 10/07/2012 alle 20:38


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 21:04
Martedì, 10/07/2012
Testo quotato

Postato originariamente da nessuno:

La questione è solamente geometrica non grafica.

Ma non ho capito esattamente cosa devi calcolare alla fine ... ti serve il punto medio dati i punti iniziale e finale?

http://it.wikipedia.org/wiki/Punto_medio



No, non mi serve il punto medio, l'ho anche scritto. :yup:
Praticamente devo calcolare TUTTI i punti della retta. Forse con un'immagine mi spiego meglio! :)


Uno sciame di API ha allegato un file: esempio.png (21397 bytes)
Clicca qui per guardare l'immagine


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:10
Martedì, 10/07/2012
I punti in un segmento sono infiniti ...

Devi quindi definire un "passo" orizzontale (o verticale) e impostare un ciclo apposito.
In base al valore del ciclo (sia X o Y) calcoli l'altra coordinata in base alla nota formula che ottiene le coordinate di un punto appartenente a un segmento dato.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Uno sciame di API (Member)
Pro


Messaggi: 66
Iscritto: 10/07/2012

Segnala al moderatore
Postato alle 9:43
Mercoledì, 11/07/2012
Ho risolto! :)
Grazie nessuno, mi sei stato molto di aiuto. :hail:
Se a quelcuno potesse servire, questa è la funzione:

Codice sorgente - presumibilmente VB.NET

  1. Function PointsToArray(ByVal p1 As Point, ByVal p2 As Point)
  2.         Dim s, p As Size
  3.         Dim punti As New List(Of Point)
  4.         If p1.Equals(p2) = True Then
  5.             punti.Add(New Point(p1.X, p1.Y)) 'se i punti sono uguali non esegue tutta la funzione
  6.         Else
  7.             s = New Size(((p1.X - p2.X) ^ 2) ^ 0.5, ((p1.Y - p2.Y) ^ 2) ^ 0.5) 'imposta come dimensioni di s il valore assoluto della differenza dei due punti
  8.             'Questi if controllano quali sono i lati più corti e li impostano come dimensioni di p
  9.             If p1.X > p2.X Then
  10.                 p.Width = p2.X
  11.             Else
  12.                 p.Width = p1.X
  13.             End If
  14.             If p1.Y > p2.Y Then
  15.                 p.Height = p2.Y
  16.             Else
  17.                 p.Height = p1.Y
  18.             End If
  19.             'imposta un "passo" adatto in base alle dimensioni di s
  20.             If s.Width > s.Height Then
  21.                 For x = 0 To s.Width
  22.                     punti.Add(New Point(x, s.Height * x / s.Width))
  23.                 Next
  24.             Else
  25.                 For y = 0 To s.Height
  26.                     punti.Add(New Point(s.Width * y / s.Height, y))
  27.                 Next
  28.             End If
  29.  
  30.             If p1.X < p2.X And p1.Y > p2.Y Then
  31.                 punti.Reverse() 'inverte i valore nell'array
  32.                 For n = 0 To punti.Count - 1
  33.                     punti.Item(n) = New Point(s.Width - punti.Item(n).X, punti.Item(n).Y) 'e con un ciclo cambia il valore di x
  34.                 Next
  35.             ElseIf p1.X > p2.X And p1.Y > p2.Y Then
  36.                 punti.Reverse() 'inverte i valore nell'array
  37.             End If
  38.             For n = 0 To punti.Count - 1
  39.                 punti.Item(n) = New Point(punti.Item(n).X + p.Width, punti.Item(n).Y + p.Height) 'tramite un ciclo for somma alle coordinate i valori di p
  40.             Next
  41.         End If
  42.         Return punti
  43.     End Function


Ultima modifica effettuata da Uno sciame di API il 11/07/2012 alle 10:52


A gent fann tant e' signur, e ppo s' fottn e mllun! (www.youtube.com/watch?v=N6xUYGo0Log)
PM Quote