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 :

Distribution homogène de points dans une surface rectangulaire


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Par défaut Distribution homogène de points dans une surface rectangulaire
    Bonjour,
    Je cherche comment m'y prendre pour distribuer un nombre N de points, de façon homogène, dans une surface rectangulaire donnée.
    Voici dans quel cadre j'en ai besoin, pour préciser ma question :
    Je programme un petit jeu de puzzle. Dans la réalité, pour faire un puzzle, le joueur va commencer par étaler toutes les pièces devant lui, de façon à ce qu'elles soient toutes visibles. Dans mon programme, une partie rectangulaire de l'écran de jeu est prévue pour cela. Au début de la partie, je veux présenter au joueur toutes les pièces, dans le désordre et bien réparties dans cette zone (voir la pièce jointe, la zone rectangulaire y est indiquée en vert).
    Une simple distribution aléatoire des pièces n'est pas satisfaisante, car cela peut générer des "amas" de pièces à certains endroits. Je cherche donc la façon de procéder pour que les pièces soient réparties de la façon la plus homogène possible dans le rectangle (même si ensuite je peux rajouter un décalage et une rotation aléatoire pour donner un aspect un peu "fouilli").
    Je souhaite trouver un algoritme qui puisse servir dans tous les cas, quelque soit le nombre de pièces, leurs dimensions, et la dimension du rectangle (car ces paramètres varient selon le puzzle choisi et la difficulté du jeu). C'est pour cela qu'il me semble que procéder à une répartition homogène des points centraux de chaque pièce est une bonne idée. Au final, si la taille du rectangle est trop petite pour contenir toutes les pièces sans qu'elles se recouvrent les unes les autres, je saurais au moins que leur recouvrement est minimum.
    Est-ce que quelqu'un sait comment je pourrais faire cela, ou me donner des liens intéressants?
    Merci bien.
    Images attachées Images attachées  

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Je suppose que tu disposes d'une fonction :
    randfloat() donnant un flottant aléatoire entre 0 et 1.
    La plupart des langages la fournissent, sinon elle est facile à fabriquer à partir de randint().
    En général cette fonction correspond à une distribution homogène sur [0,1].
    En multipliant par k tu as une fonction homogène sur [0,k]
    Donc le point aléatoire [h*randfloat(), k*randfloat()] est distribué de façon homogène sur le rectangle (0,0) (0,k) (k,h) (h,0).
    Si le point inférieur gauche du ectangle est (a,b) tu prends
    (a+h*randfloat(),b+h*randfloat())
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Si j'ai bien compris ce que le P.O cherche a faire, c'est répartir aléatoirement des points sur une surface, tout en garantissant un espacement minimum entre chaque point.

    C'est un problème récurent dans la synthèse d'image (multi-sampling, photon mapping). Pour cela on utilise ce qu'on appelle "Poisson Disk Distribution".


    NB: rien a voir avec la loi de poisson.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Dans ce cas, générer les points comme ci-dessus et conserver le nuage sous forme de tableau liste ou autre. A chaque génération d'un nouveau point, calculer la distance du point au nuage, rejeter si insuffisante (< diamètre d'une pièce -->nouveau tirage).
    Le problème des bords se règle en faisant les tirages dans un rectangle intérieur de dimensions plus petites.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Zavonen Voir le message
    Dans ce cas, générer les points comme ci-dessus et conserver le nuage sous forme de tableau liste ou autre. A chaque génération d'un nouveau point, calculer la distance du point au nuage, rejeter si insuffisante (< diamètre d'une pièce -->nouveau tirage).
    Le problème des bords se règle en faisant les tirages dans un rectangle intérieur de dimensions plus petites.
    Oui, c'est l'implémentation la plus simple pour faire un sampling "Poisson Disk". Il y en a d'autre plus optimisées mais je ne pense pas que la vitesse soit un problème ici.

    Sinon, il y a aussi le "Jittering" qui est une approximation du "Poisson Disk". Cela consiste a découper la surface en cases égales, et a mettre un point dans chaque case (n'importe où dans la case).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    Sinon, il y a aussi le "Jittering" qui est une approximation du "Poisson Disk". Cela consiste a découper la surface en cases égales, et a mettre un point dans chaque case (n'importe où dans la case).
    Pas vraiment n'importe où; suffisamment loin du bord de la case. De facto dans une case qui est dans la case.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Distribution de point à distance uniforme dans une surface carrée
    Par Gannon dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 17/06/2013, 16h32
  2. Réponses: 2
    Dernier message: 28/04/2007, 19h35
  3. Réponses: 2
    Dernier message: 30/03/2007, 13h17
  4. Chaine de caractères dans une zone rectangulaire
    Par Debault dans le forum Delphi
    Réponses: 1
    Dernier message: 28/08/2006, 23h12
  5. le pixel noir le plus proche d'un point dans une image
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 28/03/2006, 08h44

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