Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    GDI+ Equazione retta e distanza punti

    Ciao a tutti.
    Ho un problemino, abbastanza banale ma sono assolutamente arrugginito con la matematica.
    Dunque, sto cercando di creare una specie di magic wand alla photoshop per selezionare (con una certa approssimazione) una forma nera disegna in una picturebox.
    Fin qui ci sono, ho un list di point che mi rappresentano tutti i punti ordinati del perimetro della mia figura. Quello che mi serve ora è eliminare i punti in più dalla list.
    Se ad esempio P1-P2-P3 sono consecutivi sulla stessa retta P2 diventa inutile per disegnare il poligono, e lo vorrei eliminare
    A me servono solo i punti di "snodo" della figura, i vertici.
    Avevo pensato allora di fare un ciclo, selezionare P1 e P3, calcolare la retta che li unisce e poi verificare quanto P2 dista dalla retta. Settando poi un margine di tolleranza posso dire se P2 la tenuto o meno...
    In pratica vorrei applicare questa formula:
    Distanza punto-retta


    P1---P2---P3 come vedete P2 è inutile. Se però

    P2
    P1------------ P3 in questo caso P2 lo devo tenere perché è significativo per approssimare il perimetro della figura

    Mi servirebbero solo i passaggi matematici.. Grazie

  2. #2
    Qual è l'attinenza con VS2010? Hai provato a scrivere del codice? Se si in che linguaggio?
    Chi non cerca trova.

  3. #3
    Beh.. si, l'attinenza è il linguaggio, che è vb.net, con VS2010
    Ti posto il codice che ho.
    codice:
    Do Until C1 > Plist.Count - 1 
       PS = Plist(C1) '-> punto1 della retta, Plist è la lista di tutti i punti
    
       For c2 As Integer = C1 + 1 To Plist.Count - 1 
          
          If c2 > Plist.Count - 1 Then Exit For 
          
          PE = Plist(c2) 'punto2 della retta
     
          If PC = Point.Empty Then 
              PC = Plist(c2) 'punto da verificare
              Continue For 
          Else 
          'calcolo dei parametri della retta con la formula y =mx + q formula esplicita
          'm = CSng((PE.Y - PS.Y) / (PE.X - PS.X)) I
          'q = CSng(PE.Y - (((PE.Y - PS.Y) / (PE.X - PS.X)) * PS.X)) 
          'Y = (PC.X * m) + q -> Punto da verificare
    Quello che servirebbe a me è ottenere la formula implicita dell'equazione della retta che passa per PS e PE (puntoStart e PuntoEnd).
    Con tale formula (che non so assolutamente come ottenere) vorrei verificare la distanza del punto PC dalla retta che passa tra PS e PE
    Per la distanza credo si utilizzi questa formula Distanza Punto-retta

    Qualcuno riesce a darmi 2 dritte su sta cosa? Non saprei proprio dove altro chiedere..

  4. #4
    La formula della distanza che hai riportato usa la formula della retta ax+by+c=0, mentre la formula della retta che passa per due punti è:
    (y - y1) / (y2 - y1) = (x - x1) / (x2 - x1)

    Se trasformi quest'ultima formula nella forma ax+by+c=0 dovresti riuscire a calcolare a,b,c e quindi a calcolare la distanza.
    Chi non cerca trova.

  5. #5
    Si, lo so.. Ma è proprio quel passaggio che non riesco a fare..

    Ho i due punti che mi definiscono la retta, P1 e P2, ma come faccio a trovare l'equazione
    nella forma: ax + by + c =0?
    Perché m non è la stessa cosa di 'a'

  6. #6
    Il suggerimento te l'ho dato, si tratta di fare qualche trasformazione algebrica sulla formula (y - y1) / (y2 - y1) = (x - x1) / (x2 - x1) :

    (y - y1) / (y2 - y1) = (x - x1) / (x2 - x1)
    (y - y1) * (x2 - x1) = (x - x1) * (y2 - y1)
    ...
    Chi non cerca trova.

  7. #7
    Ma come si fa a fare una cosa del genere il vb.net? Si può?
    Se ho 2 incognite, cosa devo calcolare? I coefficienti di x e y, giusto?
    Sono passati troppi anni e di matematica non mi ricordo più niente..
    Un aiutino?
    Almeno come si calcola il coefficiente di x, per la y provo da solo..

  8. #8
    (y-y1)/(y2-y1)=(x-x1)/(x2-x1)
    (y-y1)*(x2-x1)=(x-x1)*(y2-y1)
    y*x2-y*x1+y1*x1=x*y2-x*y1-x1*y2+x1*y1

    x1*y1 si può semplificare; raccogliendo x e y diventa:

    y*(x2-x1)-y1*x2=x*(y2-y1)-x1*y2

    e quindi:

    x*(y2-y1)+y(x1-x2)+(y1*x2-x1*y2)=0

    infine:
    a = y2-y1
    b = x1-x2
    c = y1*x2-x1*y2
    Chi non cerca trova.

  9. #9
    Grazie Tas, gentilissimo!
    Comunque è una cosa tutt'altro che facile da fare un algoritmo che tracci i punti di un poligono, non pensavo...
    Alla prossima!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.