Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    32

    [Java] Metodo contains di Rectangle2D

    Ciao,
    Ho un comportamento che non mi spiego del metodo contains su un oggetto di tipo Rectangle2D. Spiego meglio:
    Se ho un rettengolo
    codice:
    Rectangle2D r = new Rectangle2D.Float();
    			r.setRect(1, 1, 6, 6);
    Successivamente se applico contains in questo modo
    codice:
    r.contains(7, 7)
    Mi restituisce false, così per ogni coordinata che contiene un 7 o in X o in Y.

    E non capisco perché visto che se stampo i valori del rettangolo ottengo questo:
    codice:
    miniX= 1.0  maxX=7.0  miniY= 1.0  maxY= 7.0
    Quindi teoricamente le coordinate dovrebbero esser contenute anche perché ad esempio (1, 1) mi dà true, quindi non penso sia dovuto al fatto che è sui margini.

    Qualcuno sa spiegarmi come mai? È normale questo comportamento?

    PS: ho cercato in giro e visto sulle javadoc ma non si fa cenno a casi particolari

    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Stando alla definizione di "inside" riportata nella JavaDoc della classe Shape:

    Definition of insideness: A point is considered to lie inside a Shape if and only if:

    - it lies completely inside theShape boundary or
    - it lies exactly on the Shape boundary and the space immediately adjacent to the point in the increasing X direction is entirely inside the boundary or
    - it lies exactly on a horizontal boundary segment and the space immediately adjacent to the point in the increasing Y direction is inside the boundary.
    Ne si deduce che un punto sul bordo superiore o sul bordo sinistro è considerato "inside". Un punto sul bordo destro o sul bordo inferiore è considerato "outside".

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    32
    Grazie mille, era esattamente la definizione che cercavo ma non trovavo. L'ho scoperto empiricamente che è così (aka mi ha fatto perder tempo). Ho risolto con un override del metodo contains. Incollo quì, anche se non è niente di eccezionale, magari può servire a qualcuno di passaggio:

    codice:
    	@Override
    	public boolean contains(double x, double y) {
    		if(x < this.getX())
    			return false;
    		
    		if(x > this.getX() + this.getWidth())
    			return false;
    		
    		if(y < this.getY())
    			return false;
    		
    		if(y > this.getY() + this.getHeight())
    			return false;
    		
    		return true;
    		
    	}
    Ciao

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [Java] Metodo contains di Rectangle2D

    Originariamente inviato da AuéIC
    Se ho un rettengolo
    codice:
    Rectangle2D r = new Rectangle2D.Float();
    			r.setRect(1, 1, 6, 6);
    Successivamente se applico contains in questo modo
    codice:
    r.contains(7, 7)
    Mi restituisce false, così per ogni coordinata che contiene un 7 o in X o in Y.

    E non capisco perché visto che se stampo i valori del rettangolo ottengo questo:
    codice:
    miniX= 1.0  maxX=7.0  miniY= 1.0  maxY= 7.0
    No no. Occhio che Rectangle/Rectangle2D trattano x, y, width, height (e gli argomenti di setRect sono proprio questi in quest'ordine).

    Quindi setRect(1, 1, 6, 6) vuol dire che in orizzontale è largo 6 e che le coordinate x contenute nel rettangolo vanno da 1 (incluso) a 7 (escluso).

    La implementazione di contains di Rectangle2D è corretta, infatti fa:
    codice:
    	double x0 = getX();
    	double y0 = getY();
    	return (x >= x0 &&
    		y >= y0 &&
    		x < x0 + getWidth() &&
    		y < y0 + getHeight());
    Quindi 7 < 1 + 6 è false.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2024 vBulletin Solutions, Inc. All rights reserved.