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 :

Déterminer le centre de gravité


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut Déterminer le centre de gravité
    Bonjour,

    Je réalise une application en PHP, qui récupère des fichiers contenant des formes diverses.

    Pour le moment, je récupère les formes de la manière suivante:

    J'obtiens les coordonnées (x, y) des différents points du polygone.

    Par exemple pour un carré: j'ai 4 points dont les coord sont:

    1. (0,0)
    2. (0,1)
    3. (1,0)
    4. (1,1)

    Maintenant, j'aimerais trouver les coordonnées du centre de gravité de ce polygone, indépendamment du nombre de cotés.

    Le polygone n'est simplement pas concave et ne contient pas d'arcs de cercle pour le moment.

    Qqun peut-il m'aider?

    Merci

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Tu fais simplement la moyenne des x et la moyenne des y, non?
    Donc dans le cas de ton exemple, (.5,.5)...

  3. #3
    Membre éprouvé Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Points : 1 213
    Points
    1 213
    Par défaut
    +1

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Oui ca marche avec un carré tout simple.

    Mais si tu prends un polygone de 8 cotés quelconque par exemple(pas un octogone régulier), je ne crois pas que ta technique marche?

    Dans tous les cas, merci pour ta réponse....

  5. #5
    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
    est ce que ca fonctionne aussi pour des polygones quelconques : non convexes, troués,...
    j'en suis pas sûr.

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par gids01
    Oui ca marche avec un carré tout simple.

    Mais si tu prends un polygone de 8 cotés quelconque par exemple(pas un octogone régulier), je ne crois pas que ta technique marche?
    Exact, si par exemple tu mets plein de points sur la gauche, mais qui ne changent pas grand chose à la forme, et 1 seul sur la droite, le point de gravité serait à gauche, ce qui est stupide...

    Ca ne marche donc que pour les polygones réguliers...

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Dans un premier temps, j'aimerais me consacrer à des polygones convexes et sans trous.

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    "Le centre de gravité minimise la somme des carrés des distances pondérées."
    http://xavier.hubaut.info/coursmath/app/europe.htm

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    Merci, ca a l'air très intéressant....

    je vais y jeter un oeil

  10. #10
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 259
    Points : 126
    Points
    126
    Par défaut
    En fait ca parle également de masse positionnée à chaque pont.


    Ce n'est pas vraiment ce que je recherche.....

  11. #11
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    La question est imprécise:
    la réponse
    Tu fais simplement la moyenne des x et la moyenne des y, non?
    est vraie si on admet des masses ponctuelles aux sommets.
    si on cherche le barycentre de la surface de densité homogène sous-tendue par les sommets, elle est fausse de façon générale.

    Ne pas oublier le théorème de Guilber & Wages : il peut aider dans bien des cas!

  12. #12
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    La solution de la moyenne des points est trés approximative.

    On peut l'améliorer nettement en pondérant chaque point par la somme des 2 cotés aboutissant à ce point, ce qui peut suffire pour de nombreuses appli.

    Pour avoir un barycentre exact, il me semble que le plus simple est :
    • 1) découper un polygone en polygones convexes.
    voir post récent sur ce sujet :
    Découpage d'un N-gon concave en polygones convexes simples
    http://www.developpez.net/forums/sho...d.php?t=207003
    • 2) découper les polygones convexes en triangles
    • 3) calculer la surface et le centre de gravité de chaque triangle
    • 4) le barycentre s'obtient par la moyenne des centre de gravité des triangles pondéré par leur surface

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Voici mon implémentation C++.
    L'algo est d'ordre N, N étant le nombre de coté du polygone.
    Il existe des méthodes similaires pour calculer les surfaces, les moments...

    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
    template<class InIt>
    typename iterator_traits<InIt>::value_type::rebind<float>::other 
    polygon_centroid(InIt begin, InIt end)
    {
      typedef InIt iterator;
      typedef typename iterator_traits<iterator>::value_type value_type;
      typedef PROMOTE2(float,typename value_type::value_type) float_type;
      typedef typename value_type::rebind<float_type>::other float_value_type;
     
      float sum1=0;
      float_value_type sum2(0,0);
     
      for (iterator it0=--iterator(end), it1=begin; it1!=end; it0=it1, ++it1)
      {
        float_value_type p0=*it0, p1=*it1;
        float t = p0.x*p1.y - p0.y*p1.x;
        sum1+=t;
        sum2+=t*(p0+p1);
      }
     
      return sum2/(3*sum1);
    }
    PS: attention, la variable sum2 est un couple de valeurs

  14. #14
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Charlemagne
    Voici mon implémentation C++.
    L'algo est d'ordre N, N étant le nombre de coté du polygone.
    Il existe des méthodes similaires pour calculer les surfaces, les moments...

    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
    template<class InIt>
    typename iterator_traits<InIt>::value_type::rebind<float>::other 
    polygon_centroid(InIt begin, InIt end)
    {
      typedef InIt iterator;
      typedef typename iterator_traits<iterator>::value_type value_type;
      typedef PROMOTE2(float,typename value_type::value_type) float_type;
      typedef typename value_type::rebind<float_type>::other float_value_type;
     
      float sum1=0;
      float_value_type sum2(0,0);
     
      for (iterator it0=--iterator(end), it1=begin; it1!=end; it0=it1, ++it1)
      {
        float_value_type p0=*it0, p1=*it1;
        float t = p0.x*p1.y - p0.y*p1.x;
        sum1+=t;
        sum2+=t*(p0+p1);
      }
     
      return sum2/(3*sum1);
    }
    PS: attention, la variable sum2 est un couple de valeurs
    Heu, pour un code réponse, tu aurais pu faire simple et te contenter d'écrire une fonction de (R²)^N -> R² avec des float, vector, dans un premier temps, je crois pas qu'il y ait besoin de sortir un code aussi hardcore templatisé de la mort, ou alors tu le montres après la version simple

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    J'ai fait un copier-coller de mon code, pour gagner du temps, mais mon algo est une bête de course.
    Il suffit dans l'ensemble d'ignorer les templates et de garder la boucle.
    C'est pas bien difficile quand on considère le temps que j'avais pris à l'époque pour calculer les formules (je n'ai plus ma démonstration de l'époque), et les embryons de réponses qui précédaient.
    Un merci aurait également été le bien venu.

    PS: Ca me fait penser que dans mon code il faudrait plutôt écrire la déclaration suivante ;-)

  16. #16
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Citation Envoyé par Charlemagne
    J'ai fait un copier-coller de mon code, pour gagner du temps, mais mon algo est une bête de course.
    Il suffit dans l'ensemble d'ignorer les templates et de garder la boucle.
    C'est pas bien difficile quand on considère le temps que j'avais pris à l'époque pour calculer les formules (je n'ai plus ma démonstration de l'époque), et les embryons de réponses qui précédaient.
    Un merci aurait également été le bien venu.

    PS: Ca me fait penser que dans mon code il faudrait plutôt écrire la déclaration suivante ;-)
    Ok, et sinon le code il est pas pour moi, mais je te donne un merci quand même .

  17. #17
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Mais tu pourrais toujours mâcher le travail de l'intéressé
    -écrire l'algorithme
    -démontrer l'algo
    ...

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/09/2010, 02h35
  2. Réponses: 1
    Dernier message: 29/04/2007, 23h12
  3. centre de gravité d'un vecteur
    Par hanane78 dans le forum MATLAB
    Réponses: 4
    Dernier message: 17/04/2007, 15h43
  4. Centre de gravité d'un triangle
    Par anarchie_3000 dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/02/2007, 19h11
  5. Rotation d'un rectangle autour du centre de gravité
    Par bucheron dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 22/06/2004, 12h01

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