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: 5714
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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: 5714
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
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