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

2D Java Discussion :

Interdire la superposition de fillRect qui se déplacent


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Par défaut Interdire la superposition de fillRect qui se déplacent
    Bonjour,

    j'ai crée une petit application où mes objets sont représentés à l'écran avec des rectangle crée avec la méthode fillRect().
    J'ai donc plusieurs rectangle sur ma fenêtre.
    Je peux déplacer mes rectangles avec la souris ( avec MouseDragged). Le problème c'est que j'aimerais interdire que deux rectangles se superpose.
    J'ai déjà passé plusieurs heures à chercher l'algorithme, mais j'ai pas réussit.

    Les seules données que j'ai sur chacun des rectangle est donc sa position, et ses dimensions.


    Savez vous où ou comment je pourrai trouver la solution à mon problème ?

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 906
    Billets dans le blog
    54
    Par défaut
    Plutot que d'utiliser fillRect(), utilise donc des objets Rectangle et la methode fill(shape). Ceci te permet nottament d'utiliser la methode intersects(Rectangle) de la classe Rectangle.
    Ainsi quand tu vois qu'un rectangle, apres deplacement, en intersecte un autre... tu le remet a sa position precedente... et voila !!

    Sinon, tu peux aussi garder tes valeurs separee (x, y, width, height) pour chaque rectangle et tu regarde le code source de intersects() (voir le fichier src.zip dans le JDK) pour voir comment detecter les colisions... Mais bon c'est pas bien dur non plus a faire comme ca de tete...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    mon problème a un peu changé.

    Comme je devai permettre à mes rectangle de faire des rotations autour de leur centre de gravité j'ai du abandonné les fillRect().

    Désormais j'utilise la classe PolygonDrawable (une classe que j'ai crée), c'est une sous classe de Polygon qui elle implement la classe Shape. Ainsi ma classe a une méthode intersects.
    Ma classe PolygonDrawable a une méthode draw qui permet de la dessiner à l'écran avec un fillPolygon().

    J'aimerais empecher de la même manière mes polygon de se superposer. Sachant que sont sont à chaque fois des rectangle mais parfois en diagonal (4 points et 4 angles droits).
    La fonction intersects prendre en paramètre soit 4 double, soit 1 Rectangle2D.
    Mais je n'arrive à utiliser aucune des deux méthodes correctement.

    J'ai essayé de faire l'algorithme et c'est vraiment trop dur. Sur papier, j'ai vu que lorsqu'un rectangle est en digonale et l'autre juste en dessous, mon algo pour les simple rectanle n'est plus valable...

    Comment faire ?


    Merci

  4. #4
    Membre éclairé Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Par défaut
    moi aussi ça m'interesse .
    Si on doit faire ça maison, je pense qu'il faut décomposer les rectangles en segments (un coté du rectangle est un segment). Un segment serait une droite représentée par ses deux paramètres a et b ( y=ax+b ) et par son intervalle [x1,x2] où il serait défini. Un rectangle serait alors une collection de quatre segments qu'on rangerait dans un vecteur.
    Pour savoir si un rectangle est rentré en collision avec un autre, il faudrait vérifier si au moins un des segments du rectangle R1 a une intersection avec un segment du rectangle R2.
    [Dans le cas où un des rectangle est contenu dans l'autre, le plus facile serait de trouver les objets java.awt.geom.Rectangle2D qui contiendraient ces rectangles de d'appliquer contains(double x, double y, double w, double h).]
    Pour qu'un un segment S1 soit en intersection avec un autre (S2), il faut que :
    le point d'intersection [d'ordonnée : x0=(b2-b1)/(a1-a2) et d'absisse y0=a1*x0+b1] appartienne à l'intervalle de S1 et aussi à l'intervalle de S2.

    ..Voilà, j'espere ne pas avoir dit de betises. Sans doute qu'il y a plus facile

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 906
    Billets dans le blog
    54
    Par défaut
    Tu peux simplifier une partie de ton calcul de colision en revenant au probleme initial a savoir tester des colisions entre rectangles dont les bords sont // aux axes en testant tout simplement... leur boite englobante (getBounds() et getBounds2D()).
    Si les boites englobantes ne s'intersectent pas, les formes ne s'intersectent pas. Sans le cas ou les boites enblobantes s'intersectent et les formes sont elle-meme des rectangles (shapeA.equals(boundsA) && shapeB.equals(boundsB))... elles s'intersectent. Si au moins une n'est pas un Rectangle (rectangle rotationne) alors il faut faire des calculs plus pousses => par exemple en parcourant lineairement les points inclus dans la zones (rectangulaire) ou les boites englobantes se recouvrent et en testant si un point donne (x, y) se trouve a la fois dans la forme A et la forme B (donc dans un tel cas, elles s'intersectent).



    De plus, mais niveau optimisation c'est pas top, la classe Area permet de creer des intersections entre formes : ainsi si l'intersection de l'aire A et de l'aire B donne une Shape resultante de boite englobante (0, 0, 0x0), on peut en deduire que les formes ne s'intersectent pas.

    Enfin vous pouvez sans probleme creer vos formes de rectangles rotationnes a partir des classes Rectangle ou Rectangle2D et de la classe AffineTransforme et de ses methodes getRotateInstance(angle, x, y) et createTransformedShape(shape)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. [C#] Insert CSV dans BDD (champs qui se déplacent)
    Par quake3 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/04/2013, 11h21
  2. Images qui se déplacent
    Par sasa97500 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/10/2012, 09h25
  3. [D5] Image et texte qui se déplacent en même temps
    Par Karim1971 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/11/2007, 20h37
  4. Réponses: 7
    Dernier message: 23/06/2006, 10h38
  5. Réponses: 4
    Dernier message: 28/11/2005, 18h24

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