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

Algorithmes et structures de données Discussion :

Agrandissement/Réduction de rectangle, les uns par rapport aux autres avec contrainte


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut Agrandissement/Réduction de rectangle, les uns par rapport aux autres avec contrainte
    Bonjour à tous, et Meilleurs Voeux !!!

    Je reviens cette année avec encore (et toujours) des questions !
    J'ai presque fini de mettre au point mon algorithme de disposition de fenêtres avec contraintes.

    Je voudrais faire appel à vous pour un soucis, qui peut être vous rappellera quelque chose que vous avez déjà vu.

    Donc je me lance :
    J'ai des rectangles qui sont tous déjà positionnés (aucun ne se chevauche).
    Et voici que je voudrais en aggrandir un ou le rétrécir... Cependant, je souhaiterais que les rectangles avoisinant se rétrécissent à leur tour où s'agrandissent afin de laisser de la place ou d'occuper celle qui se libère.

    Voilà, c'est mon soucis, seulement il y a une contrainte. En effet, chaque rectangle à une taille maximum et minimum à respecter...
    C'est à dire que lorsque l'un est réduit au maximum, il faut que je passe à un autre pour permettre de libérer assez de place pour l'agrandissement du rectangle courant. Et inversément, lorsqu'il s'agit de réduire le rectangle courant...

    J'espère que je vous ai donné assez de détails... En attendant, je réfléchie encore un peu...

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    quel est ton espace de représentation de tes rectangles ?
    Si tu es dans un espace discret, cela est facile, sinon il nous faudra être un peu plus fin...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Oui, c'est dans un espace discret... Mes rectangles n'ont que des valeurs entieres pour taille.

    J'ai omis aussi d'indiquer une contrainte : Les rectangles doivent garder leur proportions (ratio).

    Je crois que je suis en bonne voie pour trouver la solution concernant l'agrandissement d'un rectangle (donc la réduction des autres). Ensuite, je ne suis pas sure que ce soit une méthode optimale... Donc je suis preneuse si vous avez des suggestions !

  4. #4
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    ça à l'air bien casse tete comme truc...
    peut etre qu'en faisant des tests de collisions entre les regtangles et le rectangle redimensionné, et en lançant une routine pour chaque collisions, on peu faire ça:

    incase collision de "cible" avec rect_redimensionné

    case à_gauche?
    appliquer l'equation de redimension par la droite de la "cible"
    case à_droite?
    appliquer l'equation de redimension par la gauche de la "cible"
    case en_bas?
    appliquer l'equation de redimension par le haut de la "cible"
    case en_haut?
    appliquer l'equation de redimension par le bas de la "cible"

    que doit il se passer si l'on deplace un de ces rectangles, si c'est possible de le faire?
    puis si le ratio doit etre conservé, on risque fort d'avoir des trous.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Bon finalement pour l'agrandissement d'un rectangle et donc la reduction des autres, je crois que j'ai une solution :
    Je vais simuler que je l'ai agrandi, voir quels sont ceux qui sont chevauché, essayer de les reduire, et ainsi de suite tant qu'ils chevauchent eux meme à nouveaux un rectangle voisin. Arrivé contre la limite de la fenetre, j'indique de combien , je ne pourrais pas diminuer plus, et finalement, mon rectangle de base ne pourra être dimuné que de la valeur initiale moins cette dernière valeur.

    Pour l'autre cas, je pense que lorsque je vais réduire la taille d'un rectangle, les autres ne vont finalement pas d'agrandir, mais se coller à celui qui diminue tant que cela est possible...

    Voilà, si jamais une idée plus ingénieuse vous trottre dans l'esprit, je suis preneuse. En tout cas, je vous remercie !

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    un espace discret wonderfull.
    Une solution super simple c'est de représenter ton espace par un tableau 2D. Chaque case contiendra soit du vide, soit le numéro d'un rectangle.
    Cet espace va te permettre de gérer facilement les voisinages et donc de savoir quels sont les rectangles voisins à agrandir ou à réduire.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Mais comment tu remplie ton tableau et le lit...
    Il peut y avoir de nombreux rectangles voisins :

    Exemple :

    ________________
    .....1..........|.2.|.3.|
    .................|__|__|
    .................|.4.|.5.|
    .................|...|...|
    ________________

  8. #8
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    Citation Envoyé par zuzuu Voir le message
    Mais comment tu remplie ton tableau et le lit...
    Il peut y avoir de nombreux rectangles voisins
    ben oui justement, le tableau va te donner tous les voisins :
    - Pour un rectangle R (numéro de remplissage = R).
    - Tu parcours tous les bords de R et tu listes tous les voisins. Un bord du rectangle est une case du tableau valant R et dont une case voisine est différente de R. En plus tu n'as que des rectangles, donc lorsque tu as deux coins tu connais ton rectangle.

    Est ce que tu laisses une marge entre tes rectangles ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Oui il peut y en avoir mais je ne comprends toujours pas ton tableaux... Tu peux me montrer avec un tout petit exemple ce que cela pourait donner...

  10. #10
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    incase collision de "cible" avec rect_redimensionné

    case à_gauche?
    appliquer l'equation de redimension par la droite de la "cible"
    case à_droite?
    appliquer l'equation de redimension par la gauche de la "cible"
    case en_bas?
    appliquer l'equation de redimension par le haut de la "cible"
    case en_haut?
    appliquer l'equation de redimension par le bas de la "cible"
    ce shemas de base fonctione bien, je l'ai deja essayé, c'est la base de mon moteur 2D, un service de collisions couplé a des conitions de collision.

    ça marche.
    par contre je n'ai pas encore fait le redimensionement de rectangle, car je n'en suis pas là

  11. #11
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    Trois rectangle : R 2 3
    0 0 0 0 0 0
    0 2 2 2 2 0
    0 2 2 2 2 0
    0 0 0 0 0 0
    0 R R 0 0 0
    0 R R 0 0 0
    0 0 0 0 0 0
    0 0 0 3 3 0
    0 0 0 3 3 0
    0 0 0 0 0 0

    voilà.
    Tu redimenssionnes le rectangle R. Avec un tableau, il te suffit de parcourir ses bords et de regarder plus ou moins loin en fonction de la taille de la marge afin de trouver ses voisins.
    Si tu agrandis dans une direction et qu'il y a un voisin, tu as immédiatement le numéro du voisin et tu peux le réduire.
    Inversement quand tu réduis, tu connais les voisins et tu les agrandis.

  12. #12
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    cette technique a le don de bouffer enormement de temps de cacul, pour faire la sillouette des objets, c'est pas la meilleure maniere pour tester les collisions de rectangles..

  13. #13
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    Citation Envoyé par edfed Voir le message
    cette technique a le don de bouffer enormement de temps de cacul, pour faire la sillouette des objets, c'est pas la meilleure maniere pour tester les collisions de rectangles..
    Comme c'est des rectangles, la sillouhette est super rapide à trouvers. En revanche, je suis d'accord qu'elle n'est sans doute pas optimale, mais elle a le mérite d'être simple.

  14. #14
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    le plus pas drole, c'est que c'est meme pas simple, je l'ai essayée pour faire un moteur de collisions, et bien , c'est limité , et c'est long.
    alors qu'avec le calcul des coordonnées, c'est plus rapide, et si les figure sont des formes non rectangulaires, le traçage des contour suffit, pas besoin des pixels interieurs pour detecter par couleurs.
    mais par couleurs, le nombre d'objet est limité.
    heu... par le nombre de couleurs possibles.
    256 en 8 bits
    16 millions et des brouettes en 24 bits
    4 milliard et des tonneaux en 32 bits.
    hum hum.. une combinaison des deux methodes serait pas mal pour un moteur de collisions de jeu video...
    voire pour un moteur de collision pour un environement 3D.

    je sais pas, il faut tout essayer, mesurer la vitesse d'execution, comparer les precisions, etc...

  15. #15
    En attente de confirmation mail
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Points : 348
    Points
    348
    Par défaut Agrandissement/Réduction de rectangle
    Une idée...
    En 1 dimension, l'adaptation en 2D est assez facile.

    Soit N segments S définis par a bord gauche, b bord droit.

    Modification de la distance du segment i de d
    On compte le nombre de segments n'ayant pas atteinds leur limite (haute si d<0, basse si d>0) avec Si exclu. Soit K cette valeur. S{k} la liste de ces segments

    On calcul le pas p qui affecte la taille des N segments pour chaque segments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Si |d| < K, 
    p = 1 pour d segments à choisir parmis les S{K} segments
    p = 0 pour les autres sauf Si
    p = d pour Si
     
    Si |d| >=K, 
    p = int(K/d)      pour int(K/d)*d parmis les S{K} segments
    p = int(K/d) + 1 pour K-int(K/d)*d parmis les S{K} segments
    p = 0               pour les autres sauf Si
    p = d                pour Si
    On calcul les listes pA et pB avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    pA[0] = 0
    pB[0] = p[0]
     
    pour n = 1 à N-2
    <div style="margin-left:40px">pA[n] = - p[n]/2 + |pA[n-1]| +  |pB[n-1]|
    pB[n] = p[n]/2 + |pA[n-1]| +  |pB[n-1]|</div>
    pA[N-1] = - p[n-1] + |pA[N-2]| + |pB[N-1]|
    pB[N-1] = 0
    On affecte les changements de coordonnées au S{N} segments

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pour n = 0 à N-1
    <div style="margin-left:40px">a[n] += pA[n]
    b[n] += pB[n]</div>
    J'espère qu'aucune coquille ne s'est glissée. Bien sùr à vérifier et valider (surtout signes valeurs absolues).
    Il me semble que l'algo reste assez simple à mettre en oeuvre. Peut être gérer une exeption lors du redimensionnement des rectangles aux bords...

    En espérant avoir pu aider

    Cdt

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    bah il n'y a pas besoin de suivre les contours...

    Un rectangle :

    xmin, xmax
    ymin, ymax


    Si on augmente xmax (on allonge le rectangle horizontalement)
    pour le rectangle i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Pour tous les autres rectangles :
       Si ymin > ymax_i  OU Si ymax < ymin_i OU si xmax < xmin_i OU si xmin > xmax_i
             Rien a faire
       Sinon
             Si xmin < xmax_i
                  xmin = xmax_i (+marge)
             Fin si
       Fin si
    Fin pour
    [EDIT]
    Ajoute un _i pour mieux discerner entre les rectangles utilises et le rectyangle de comparaison..
    [/EDIT]

Discussions similaires

  1. Position des QLabel les uns par rapport aux autres
    Par dharkan dans le forum Débuter
    Réponses: 4
    Dernier message: 23/04/2011, 19h21
  2. Réponses: 3
    Dernier message: 24/07/2010, 22h02
  3. [MySQL 5] Mise à jour de 3 bases les unes par rapport aux autres
    Par Doc.Fusion dans le forum Administration
    Réponses: 1
    Dernier message: 17/07/2009, 21h15
  4. Placer des table les unes par rapport aux autres.
    Par IyF33 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 03/07/2008, 10h29
  5. Numeroter les tables par rapport aux contraintes
    Par nicassy dans le forum Outils
    Réponses: 10
    Dernier message: 02/02/2007, 12h39

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