Come ottenere tutti i pixel che compongono una linea disegnata da drawLine

di il
6 risposte

Come ottenere tutti i pixel che compongono una linea disegnata da drawLine

Ciao a tutti, se disegno una linea in un JPanel usando:

@Override
public void paintComponents(Graphics g) {
    super.paintComponents(g);
    g.drawLine(0, 0, 100, 100);
}
come faccio ad ottenere tutte le coordinate dei pixel che sono stati disegnati?

Se disegno una linea parallela all'asse x o all'asse y riesco a calcolarli, infatti disegnando:

g.drawLine(0, 0, 100, 0);
so che le coordinate dei pixel sono:
(0,0)
(1,0)
(2,0)
...
(99,0)
(100,0)

Il problema sorge con le linee non parallele.

In alternativa ci sono altri modi di farlo?

6 Risposte

  • Re: Come ottenere tutti i pixel che compongono una linea disegnata da drawLine

    Toro ha scritto:


    come faccio ad ottenere tutte le coordinate dei pixel che sono stati disegnati?
    Di per sé no, non puoi saperlo (facilmente). Poi bisognerebbe anche vedere se c'è il anti-aliasing attivato oppure no (ma se non lo attivi esplicitamente, di norma non lo è).
    Potresti disegnare su un BufferedImage e poi ispezionare pixel x pixel. Di per sé fattibile.
    Ma .... la domanda che sorge spontanea è: PERCHÉ avresti bisogno di fare una cosa del genere? Chiarisci magari il contesto e gli obiettivi.
  • Re: Come ottenere tutti i pixel che compongono una linea disegnata da drawLine

    andbin ha scritto:


    Toro ha scritto:


    come faccio ad ottenere tutte le coordinate dei pixel che sono stati disegnati?
    Di per sé no, non puoi saperlo (facilmente). Poi bisognerebbe anche vedere se c'è il anti-aliasing attivato oppure no (ma se non lo attivi esplicitamente, di norma non lo è).
    Potresti disegnare su un BufferedImage e poi ispezionare pixel x pixel. Di per sé fattibile.
    Ma .... la domanda che sorge spontanea è: PERCHÉ avresti bisogno di fare una cosa del genere? Chiarisci magari il contesto e gli obiettivi.
    Sto scrivendo un programma che permetta di disegnare delle forme geometriche, come una sorta di CAD in 2D molto semplificato.
    Avere tutte le coordinate dei pixel che compongono la linea mi serve per poter far selezionare la linea all'utente, ossia quando l'utente fa un click sulla linea.
    Avevo pensato di farlo senza antialiasing perché trovare tutte le coordinate che l'antialiasing mi sembra molto più difficile.
  • Re: Come ottenere tutti i pixel che compongono una linea disegnata da drawLine

    Diciamo che l'approccio e' TOTALMENTE sbagliato, almeno nel senso dell'implementazione CANONICA.

    La prima cosa che bisogna capire e che

    - 'una linea' e' un concetto 'geometrico', formato dalle coordinate dei due estremi. Una 'spezzata' e' composta da piu' linee con la condizione che le coordinate della fine di una linea COINCIDONO con le coordinate di inizio di quella successiva. Ora, le coordinate potrebbero anche essere degli interi(le coordinate in termini di pixel degli estremi)

    - 'un raster", cioe' la matrice di pixel usata per disegnare, NON POSSIEDE il concetto di "geometria": sa SOLO che hai acceso un pixel oppure no. Ma, ad esempio, NON E' IN GRADO di sapere se un pixel e' stato accesso da DUE linee che si intersecano esattamente in quel punto. Inoltre, i pixel che vengono accessi per disegnare una linea sono scelti in base ad un algoritmo bbastanza incasinato.

    L'operazione di "selezionare una linea" e' un'operazione COMPLICATA e fa parte di quei problemi che stanno sotto il capello della "geometria computazionale".

    Questo per dire che, partendo da un pixel, sapere a quale linea appartiene, potrebbe non essere possibile,

    MA

    scelto un punto punto dello schermo (e quindi le coordinate del pixel) e' SEMPRE possibile trovare la linea (come oggetto GEOMETRICO) che gli sta' piu' vicino.

    Il discorso e' SOLO agli inizi. Ci si potrebbe fare una lezioe su questo semplice argomento
  • Re: Come ottenere tutti i pixel che compongono una linea disegnata da drawLine

    migliorabile ha scritto:


    Diciamo che l'approccio e' TOTALMENTE sbagliato, almeno nel senso dell'implementazione CANONICA.

    La prima cosa che bisogna capire e che

    - 'una linea' e' un concetto 'geometrico', formato dalle coordinate dei due estremi. Una 'spezzata' e' composta da piu' linee con la condizione che le coordinate della fine di una linea COINCIDONO con le coordinate di inizio di quella successiva. Ora, le coordinate potrebbero anche essere degli interi(le coordinate in termini di pixel degli estremi)

    - 'un raster", cioe' la matrice di pixel usata per disegnare, NON POSSIEDE il concetto di "geometria": sa SOLO che hai acceso un pixel oppure no. Ma, ad esempio, NON E' IN GRADO di sapere se un pixel e' stato accesso da DUE linee che si intersecano esattamente in quel punto. Inoltre, i pixel che vengono accessi per disegnare una linea sono scelti in base ad un algoritmo bbastanza incasinato.

    L'operazione di "selezionare una linea" e' un'operazione COMPLICATA e fa parte di quei problemi che stanno sotto il capello della "geometria computazionale".

    Questo per dire che, partendo da un pixel, sapere a quale linea appartiene, potrebbe non essere possibile,

    MA

    scelto un punto punto dello schermo (e quindi le coordinate del pixel) e' SEMPRE possibile trovare la linea (come oggetto GEOMETRICO) che gli sta' piu' vicino.

    Il discorso e' SOLO agli inizi. Ci si potrebbe fare una lezioe su questo semplice argomento
    Pensavo che fosse molto più semplice.
    In alternativa non esiste una classe o del codice che implementi un algoritmo per disegnare delle linee?
    In modo che possa disegnare io punto per punto ogni linea.
  • Re: Come ottenere tutti i pixel che compongono una linea disegnata da drawLine

    0) NON SERVE quotare tutto il post!!!!! E' gia' scritto ede' visibile a tutti!!!!

    1) che c'entra l'algo per disegnare le linee?
    CERTO che ci sono: trovi tutto su qualunque libro di computer grafica e anche con delle banali ricerche con Google (cerca in inglese """che e' meglio""" come dicono i Puffi).
  • Re: Come ottenere tutti i pixel che compongono una linea disegnata da drawLine

    Toro ha scritto:


    Avere tutte le coordinate dei pixel che compongono la linea mi serve per poter far selezionare la linea all'utente, ossia quando l'utente fa un click sulla linea.
    No, approccio proprio sbagliato.
    Devi tenerti delle apposite strutture dati che mantengono a livello "logico" le informazioni sulle figure che vengono man mano disegnate dall'utente.
    Banalmente (ma poi è quello che si fa di solito), una classe astratta es. Figura e poi sottoclassi es. Cerchio, Rettangolo, ecc.... E poi mantieni un List<Figura> . Quando vuoi sapere se un punto "cade" su una delle figure, se hai modellato le figure nel modo giusto lo fai in pochi semplici passi ...
    Si tratta solo di "ragionare" in termini di programmazione Object Oriented.

    E nota che nel framework esiste già la interfaccia Shape con implementazioni es. Rectangle2D.Double, Ellipse2D.Double, ecc.... Ma se devi aggiungere altri dati es. colore di riempimento, colore del bordo, ecc... HA SENSO fare una TUA gerarchia di classi che poi magari incapsula un apposito shape.

    Toro ha scritto:


    In alternativa non esiste una classe o del codice che implementi un algoritmo per disegnare delle linee?
    In modo che possa disegnare io punto per punto ogni linea.
    Se vuoi implementare tu l'algoritmo, certo si può. Si usa l'algoritmo di Bresenham (https://it.wikipedia.org/wiki/Algoritmo_della_linea_di_Bresenham). Ma ti devi "sporcare" un po' le mani con molta matematica.
    E NON vedo il perché devi farlo ....


    P.S. rileggi bene tutto quello che ti è stato risposto.
Devi accedere o registrarti per scrivere nel forum
6 risposte