IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Intersection de deux rectangles


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut Intersection de deux rectangles
    Bonjour,

    Voici les exos :

    http://img11.hostingpics.net/pics/840227Exos.jpg


    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	//Question 1
    	static boolean contientPoint(Rectangle R, int x1, int y1) {
    		if ( x1>= R.x && x1<= R.x+R.longueur && y1>= R.y && y1<= R.y+R.hauteur ) {
    			return true;
    		}
    		return false;
    	}
     
    	//Question 2
    	static boolean intersecte(Rectangle R1, Rectangle R2) {
    		boolean inter = false;
    		if (R1.x == R2.x && R1.y == R2.y && R1.longueur == R2.longueur && R1.hauteur == R2.hauteur) {
    			return inter;
    		} else if (contientPoint(R1, R2.x, R2.y) || contientPoint(R1, R2.x+R2.longueur, R2.y) || contientPoint(R1, R2.x, R2.y+R2.hauteur) || contientPoint(R1, R2.x+R2.longueur, R2.y+R2.hauteur)) {
    			inter = true;
    		} 
    		return inter;
    	}
    Est-ce que mon code est correct ?

    Pour la question 3 je vois pas trop ce qu'il faut faire...

    Cordialement.

  2. #2
    Membre chevronné

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Par défaut
    Bonjour,

    Oui, le code semble correct. Il peut encore être un peu simplifié, par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	//Question 1
    	static boolean contientPoint(Rectangle R, int x1, int y1) {
    		return ( x1>= R.x && x1<= R.x+R.longueur && y1>= R.y && y1<= R.y+R.hauteur ) ;
    	}
     
    	//Question 2
    	static boolean intersecte(Rectangle R1, Rectangle R2) {
    		return (contientPoint(R1, R2.x, R2.y) 
                                       || contientPoint(R1, R2.x+R2.longueur, R2.y) 
                                       || contientPoint(R1, R2.x, R2.y+R2.hauteur) 
                                       || contientPoint(R1, R2.x+R2.longueur, R2.y+R2.hauteur));
    	}
    Pour la 3e question, tu peux parcourir le tableau de rectangle pour identifier les 2 points les plus excentrés, donc 4 valeurs : x et y min (en bas à gauche) et x+longueur et y+hauteur max (en haut à droite). Une fois les 4 valeurs déterminées, soit 2 points, il faut en déduire le rectangle de façon à ce qu'il ne se superpose pas à un point trouvé (donc soustraire 1 aux x et y min trouvés, et ajouter 1 aux coordonnées de l'autre point).

    Bon courage

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut
    Citation Envoyé par TIFéç Voir le message
    Bonjour,

    Oui, le code semble correct. Il peut encore être un peu simplifié, par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	//Question 1
    	static boolean contientPoint(Rectangle R, int x1, int y1) {
    		return ( x1>= R.x && x1<= R.x+R.longueur && y1>= R.y && y1<= R.y+R.hauteur ) ;
    	}
    D'accord.

    Citation Envoyé par TIFéç Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	//Question 2
    	static boolean intersecte(Rectangle R1, Rectangle R2) {
    		return (contientPoint(R1, R2.x, R2.y) 
                                       || contientPoint(R1, R2.x+R2.longueur, R2.y) 
                                       || contientPoint(R1, R2.x, R2.y+R2.hauteur) 
                                       || contientPoint(R1, R2.x+R2.longueur, R2.y+R2.hauteur));
    	}
    Tu es sûr que c'est bon ? Parce que dans le cas où les deux rectangles se superposent, la fonction doit renvoyer faux or là elle va renvoyer vrai, non ?

    Pour la question 3, je n'arrive pas à visualiser le tableau en fait.
    Est-ce un tableau avec un seul rectangle dans chaque case du tableau ? Si oui, le tableau a juste trois cases pour les trois rectangles ou bien on ne connait pas le nombre de rectangles et donc ni la longueur du tableau ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	//Question 3
    	static Rectangle unionRectangles(Rectangle[] Rects) {
    		Rectangle englobant = new Rectangle();
    		for (int i = 0; i < Rects.length; i++) {
    			//je bloque
    		}	
    	 }

  4. #4
    Membre chevronné

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Par défaut
    Oui, pardon, il faut effectivement gérer aussi le cas particulier...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static boolean intersecte(Rectangle R1, Rectangle R2) {
    		return (! (R1.x == R2.x && R1.y == R2.y && R1.longueur == R2.longueur && R1.hauteur == R2.hauteur)
                                       && (contientPoint(R1, R2.x, R2.y) 
                                       || contientPoint(R1, R2.x+R2.longueur, R2.y) 
                                       || contientPoint(R1, R2.x, R2.y+R2.hauteur) 
                                       || contientPoint(R1, R2.x+R2.longueur, R2.y+R2.hauteur)));
    	}
    Pour la question 3, oui il semble s'agir d'un tableau de rectangles dont le nombre n'est pas forcément connu par avance. Ça donnerait quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    static Rectangle unionRectangles(Rectangle[] Rects) {
    		int xMin = Rects[0].x;
    		int yMin = Rects[0].y;
    		int xMax = Rects[0].x + Rects[0].longueur;
    		int yMax = Rects[0].y + Rects[0].hauteur;
    		Rectangle tempRec;
    		for (int i = 0; i < Rects.length; i++) {
    			tempRec = Rects[i];
    			if (tempRec.x < xMin) { xMin = tempRec.x;} 
    			if (tempRec.y < yMin) { yMin = tempRec.y;} 
    			if (tempRec.x + tempRec.longueur > xMax) { xMax= tempRec.x + tempRec.longueur;} 
    			if (tempRec.y + tempRec.hauteur > yMax) { yMax= tempRec.y + tempRec.hauteur;} 
    		}
     
    		// creation du rectangle englobant
    		Rectangle englobant = new Rectangle();
    		englobant.x = xMin - 1;
    		englobant.y = yMin - 1;
    		englobant.longueur = xMax - xMin + 1;
    		englobant.hauteur = yMax - yMin + 1;
     
    		return englobant;
    	 }
    A vérifier... Il me semble qu'il faut les -1 et +1 pour que le rectangle englobant ne repose pas sur l'un des points extrêmes trouvés?
    Tu a fais une petite classe de test pour vérifier?

    Bon courage

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 16
    Par défaut
    D'accord merci ! Ca m'a l'air pas mal du tout sauf une petite erreur dans le for qui commence à 1 vu que juste avant on initialise déjà à 0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    static Rectangle unionRectangles(Rectangle[] Rects) {
    		int xMin = Rects[0].x;
    		int yMin = Rects[0].y;
    		int xMax = Rects[0].x + Rects[0].longueur;
    		int yMax = Rects[0].y + Rects[0].hauteur;
    		Rectangle tempRec;
    		for (int i = 1; i < Rects.length; i++) {
    			tempRec = Rects[i];
    			if (tempRec.x < xMin) { xMin = tempRec.x;} 
    			if (tempRec.y < yMin) { yMin = tempRec.y;} 
    			if (tempRec.x + tempRec.longueur > xMax) { xMax= tempRec.x + tempRec.longueur;} 
    			if (tempRec.y + tempRec.hauteur > yMax) { yMax= tempRec.y + tempRec.hauteur;} 
    		}
     
    		// creation du rectangle englobant
    		Rectangle englobant = new Rectangle();
    		englobant.x = xMin - 1;
    		englobant.y = yMin - 1;
    		englobant.longueur = xMax - xMin + 1;
    		englobant.hauteur = yMax - yMin + 1;
     
    		return englobant;
    	 }
    J'ai fait mes tests et ça fonctionne pour les deux premières mais apparemment il y a quelques soucis pour unionRectangle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    	public static void main(String[] args) {
            Rectangle rect1 = new Rectangle(); 
            rect1.x = 0; 
            rect1.y = 0; 
            rect1.longueur = 3; 
            rect1.hauteur = 2; 
     
            Rectangle rect2 = new Rectangle(); 
            rect2.x = 1; 
            rect2.y = 1; 
            rect2.longueur = 3; 
            rect2.hauteur = 2; 
            boolean result = contientPoint(rect1, 0, 0); 
            if (result) {  
            	System.out.println("The point is inside"); 
            } else {
            	System.out.println("The point is outsdide"); 
            }
     
            boolean result2 = intersecte(rect1, rect2); 
            if (result2) {  
            	System.out.println("Intersecte"); 
            } else {
            	System.out.println("Intersecte pas"); 
            }
     
            Rectangle[] test = {rect1, rect2};
            Rectangle result3 = new Rectangle();
            result3 = unionRectangles(test);
            System.out.println(result3.x);
            System.out.println(result3.y);
            System.out.println(result3.longueur);
            System.out.println(result3.hauteur);
     
    	}
    Ca retourne ça :

    The point is inside
    Intersecte
    -1
    -1
    5
    4

    C'est censé retourner :

    0
    0
    4
    3

    Du coup il faut écrire ça plutôt dans la fonction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		// creation du rectangle englobant
    		Rectangle englobant = new Rectangle();
    		englobant.x = xMin;
    		englobant.y = yMin;
    		englobant.longueur = xMax - xMin;
    		englobant.hauteur = yMax - yMin;
     
    		return englobant;

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pour la question 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      +++
      + +
    ++++++++
    + + +  +
    + + +  +
    ++++++++
      + +
      +++
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Détecter l'intersection entre deux rectangles
    Par Arnaud F. dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 10/07/2009, 09h43
  2. surface de l'intersection de deux triangles quelconques
    Par zekey dans le forum Mathématiques
    Réponses: 35
    Dernier message: 07/10/2007, 13h12
  3. [debutant] intersection de deux plages horaires
    Par absolut75 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 24/05/2006, 13h03
  4. Intersection de deux courbes quelconques
    Par ShootDX dans le forum Algorithmes et structures de données
    Réponses: 32
    Dernier message: 31/03/2006, 10h32
  5. [prg jeux ]Définir l'intersection de deux rectangles
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 30/07/2003, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo