Rect.intersects non funziona!

di il
11 risposte

Rect.intersects non funziona!

Ciao a tutti ragazzi.. sto avendo problemi con la classe Rect di Android.

        rect.set(200,600,100,100);
        rect2.set(200,600,100,100);
        Log.d(TAG, ""+Rect.intersects(rect2,rect));
        if(Rect.intersects(rect,rect2)){
           	//fai cose
        }
I due rettangoli sono sovrapposti eppure Rect.intersects(rect,rect2) mi da comunque false.
(Il discorso è analogo anche se slitto leggermente uno dei due.)

11 Risposte

  • Re: Rect.intersects non funziona!

    Ciao, il metodo Rect.intersects(Rect, Rect) è implementato in questo modo:
    
    public static boolean intersects(Rect a, Rect b) {
        return a.left < b.right && b.left < a.right && a.top < b.bottom && b.top < a.bottom;
    }
    
    Di conseguenza, se il lato sinistro o il lato superiore combaciano, questo metodo restituirà sempre false
  • Re: Rect.intersects non funziona!

    Ah ecco stavo uscendo pazzo, grazie mille.

    A me servirebbe avere true quando anche uno solo dei quattro lati entra in contatto con l'altro rettangolo.

    Mi conviene creare un metodo mio o c'è qualche altro metodo di intersezione già pronto all'uso?
  • Re: Rect.intersects non funziona!

    In realtà ripensandoci meglio, questa frase non è vera
    Di conseguenza, se il lato sinistro o il lato superiore combaciano, questo metodo restituirà sempre false
    Il problema che riscontri è che nel tuo rettangolo hai invertito i lati "top" e "bottom" (e "left" con "right").
    La signature del metodo "set" è: "set (int left, int top, int right, int bottom)", e l'asse y cresce verso il basso, per cui l'istruzione "rect.set(200,600,100,100)" crea un rettangolo il cui lato superiore sta più in basso di quello inferiore (lo stesso vale per il lato destro e sinistro), e di conseguenza tutta la logica di intersezione non funziona più
  • Re: Rect.intersects non funziona!

    Della ha scritto:


    In realtà ripensandoci meglio, questa frase non è vera
    Di conseguenza, se il lato sinistro o il lato superiore combaciano, questo metodo restituirà sempre false
    Il problema che riscontri è che nel tuo rettangolo hai invertito i lati "top" e "bottom".
    La signature del metodo "set" è: "set (int left, int top, int right, int bottom)", e l'asse y cresce verso il basso, per cui l'istruzione "rect.set(200,600,100,100)" crea un rettangolo il cui lato superiore sta più in basso di quello inferiore, e di conseguenza tutta la logica di intersezione non funziona più
    Grazie della dritta.

    Anche sistemando i rettangoli nel verso giusto però nel metodo intersects (come appunto stavi dicendo prima) se i lati left o top combaciano ottengo lo stesso false, quindi dovrei creare comunque un metodo mio giusto?
  • Re: Rect.intersects non funziona!

    No in realtà quello che ho detto prima era sbagliato. Se anche tutti i lati dovessero combaciare il metodo restituirebbe "true". Vedrai che tutto tornerà a funzionare una volta sistemato il problema di tutti e 4 i lati nella chiamata al metodo "set"
  • Re: Rect.intersects non funziona!

    Ok funziona!
  • Re: Rect.intersects non funziona!

    Tutti e 4 i lati erano errati, non solo top e bottom! Devi invertire pure right con left
  • Re: Rect.intersects non funziona!

    Si scusa, ora funziona Grazie davvero
  • Re: Rect.intersects non funziona!

    Mi sfugge un'altra cosa sui Rettangoli creati in questo modo.

    Se io imposto queste coordinate:
    
    rect.set(100,50, 200,100);
    rect2.set(100,200,200,250);
    
    Ottengo due rettangoli di altezze differenti, anche se in entrambi la differenza tra top e bottom è comunque di 50 pixel.

    Edit: Forse il problema nasce dal metodo che utilizzo per disegnare i Rettangoli ovvero g.drawRect.
    g.drawRect vuole in input (x, y, width, height, color)
    Dovrei utilizzare x= left, y= top, width = right-left; height= bottom-top ?
  • Re: Rect.intersects non funziona!

    Nel tuo esempio "g" è un'istanza di Canvas? Se si, puoi passare direttamente il rettangolo da disegnare.
    Altrimenti dipende da cosa si aspetta il metodo "drawRect" come punto di origine: se è l'angolo in alto a sinistra allora è come dici tu, ma se ad esempio il metodo si aspetta il centro (improbabile, ma possibile) allora devi aggiustare i dati. La risposta sta nella javadoc
  • Re: Rect.intersects non funziona!

    Nope si tratta di android.graphics.Paint
    Comunque con x= left, y= top, width = right-left; height= bottom-top sembra funzionare
Devi accedere o registrarti per scrivere nel forum
11 risposte