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 :

Algo qui calcule une aire


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Algo qui calcule une aire
    Bjr, j'ai un petit pb a resoudre
    je voudrais calculer l'aire d'une surface de forme quelconque
    je connais les coordonnées (x,y) de chaques points du contour dans un repère
    y a t il un algo simple qui puisse me donner l'aire de la surface incluse dans la forme

    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Tu cherches un algorithme de remplissage , et au lieu de noircir des pixels, tu comptes le nombre de pixels à noircir.

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 370
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par Le Furet
    Tu cherches un algorithme de remplissage , et au lieu de noircir des pixels, tu comptes le nombre de pixels à noircir.
    tout dépend de ce que le_nardo cherche à faire. dans le cas d'une recherche d'aire géométrique, sans tenir compte de pixels, ça n'ira pas.

    il faut donc considérer la figure à étudier comme étant un assemblage de triangles rectangles et non de carrés (pixels)

    un aspect à prendre aussi en compte et qui pourrait poser des soucis si l'on n'y prend pas gare est la forme de la polyligne dont tu cherches l'aire, il faudra légèrement changer le calcul des triangles si elle est convexe ou concave.

    De plus, si elle est croisée (en forme de 8 par exemple), il faudra la décomposer en plusieurs sous polylignes plus simples à évaluer

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Citation Envoyé par khayyam90
    tout dépend de ce que le_nardo cherche à faire. dans le cas d'une recherche d'aire géométrique, sans tenir compte de pixels, ça n'ira pas.
    Je ne comprends pas ta remarque. Ou alors je n'ai pas saisi le problème.

    J'imagine l'image de base comme une discrétisation d'un contour. Déjà, dans tous les cas, l'aire ne pourra être qu'approchée, et il est nécessaire d'avoir un grand nombre de points pour considérer l'approximation comme correcte.

    Je veux bien qu'en utilisant des triangles rectangle, on ait une approximation légèrement meilleure, encore que, mais je ne vois pas comment le résultat pourrait être sensiblement différent.

    Je ne suis pas spécialiste de ce genre de problèmes mais ça m'intéresserait si tu pouvais développer un peu ta pensée.

  5. #5
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 370
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par Le Furet
    Déjà, dans tous les cas, l'aire ne pourra être qu'approchée, et il est nécessaire d'avoir un grand nombre de points pour considérer l'approximation comme correcte.
    [...]
    ça m'intéresserait si tu pouvais développer un peu ta pensée.
    il est tout à fait possible de calculer l'aire exacte. C'est pas forcément facile, mais c'est tout à fait possible.
    la liste des points connus permet de dessiner un polygone et il est possible de calculer l'aire exacte de n'importe quel polygone au nombre de sommets fini.

    par contre, si on cherche à connaître le nombre de pixels contenus dans un polygone, ta solution avec un algo de remplissage fonctionne.

    en réfléchissant un peu plus, il n'est pas utile de prendre des triangles rectangles, des simples triangles seront amplement suffisants.

    Ce que je propose :
    - découper le polygone en sous-polygones non croises
    - découper chaque nouveau polygone en sous polygones convexes
    - calculer l'aire de chaque nouveau polygone suivant le modèle suivant :

    calculer l'aide de chacun des triangles définis par [centre du polygone, sommet n, sommet n+1]

    on somme tout ça, et hop, on a l'aire totale

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Citation Envoyé par khayyam90
    la liste des points connus permet de dessiner un polygone et il est possible de calculer l'aire exacte de n'importe quel polygone au nombre de sommets fini.
    Mais on n'a jamais dit que la forme originelle était un polygone. Donc tu ne fais, dans tous les cas, qu'une approximation de l'aire. Ta méthode permettra d'avoir une plus grande précision sur la frontière de la forme, mais comme a priori sa contribution à l'aire totale est faible, je ne sais pas s'il est nécessaire de sortir un algorithme compliqué.

    Remarque bien, je ne sais pas si les algorithmes de coloriage sont simples, et se comportent bien si ta forme est croisée.

  7. #7
    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
    si les points forment le contour de la surface , l'aire s'exprime par


    A = 0.5 *| Somme ( x*dy - y*dx) | =

    | Somme ( x*dy) | =

    | Somme ( y*dx) |

    l'intégralle se fait le long du contour fermé

  8. #8
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Les algos de remplissage sont tout à fait adaptés... En plus le fait de connaître les points de contour est un avantage qui facilite le calcul de l'aire...

    J'ai essayé de faire un petit dessin mais c'est pas simple, et puis il est tard... Mais j'essairai demain de présenter une méthode simple que j'ai déjà vu...

    A+

  9. #9
    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
    Un calcul d'aire est TRES simple à implémenter
    Pour illuster Somme (Xdy-Ydx) proposé dans mon précedant mail, voici 1 petit code en C.
    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
     
    #include <math.h>
    // math.h pour fabs,    cos  sin  et M_PI ( 3.14...) de l'exemple
    //---------------------------------------------------------------------------
    float area( int Npts, float X[], float Y[])
       {
       float *DX  = new float[Npts];
       float *DY  = new float[Npts];
       float A       =       0;
       for ( int i=0; i < Npts; i++)
          {
          DX[i] = (X[(i+1)%Npts] - X[(i+Npts-1)%Npts])/2;
          DY[i] = (Y[(i+1)%Npts] - Y[(i+Npts-1)%Npts])/2;
          }
       for ( int i=0; i < Npts; i++)
          A = A + (X[i]*DY[i] - Y[i]*DX[i]);
       delete [] DX;
       delete [] DY;
       return ( fabs(A/2) );
       }
    // exemple : calcul de l'aire d'1 cercle
    float Surface_d_1_cercle(void)
    {
    //rayon 10
    #define Npts 200
    #define Ray 10
    float U = 2 * M_PI / Npts;
    float X[Npts], Y[Npts];
    for( short i=0; i < Npts ; i++)
       {
       X[i] =  Ray * cos( i * U );
       Y[i] =  Ray * sin(i * U );
       }
    return  area(Npts,X,Y);  // 314.107..     au lieu de    314.1592...
    }
    Bien entendu, l'erreur sur l'aire, hormis les erreurs liées au codage et au calcul, sont surtout du au nombre de points et leurs précisions.
    De façon générale il n'est pas possible "d'inventer" les points manquants, mais, si le contour est suffisamment lisse, des techniques de lissage, interpolations, ... permettent d'ajouter des points et ceci peut nettement participer à une bonne évaluation de l'aire.

    On note qu'il s'agit d'une aire ALGEBRIQUE ( d'où la || ). Si la courbe devait se croiser comme dans "8" ou certaines lemniscates, on pourrait alors trouver une aire nulle ou nettement inférieure à sa valeure géométrique. Cela refète que sur une partie de la courbe on tourne dans le sens trigonométrique alors que sur une autre partie on tourne dans son sens inverse.

    Cette relation d'aire n'est en fait qu'un cas particulier de la relation plus générale du théorème de Stokes ( somme Rot(A) dl = Somme A dS ) pour un champ vectoriel du type A(x,y,z) = ( 0,x,1) ou ( -y,0,1) ou bien d'autres encore

  10. #10
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bjr et merci de tout c'est petit calcul d'aire par les formules de STOKES et compagnie, mais je précise plusieurs points :
    * d'abord ma forme est vraiment quelconque (concave ou convexe) voire une forme de pomme de terre, jamais un "huit"
    * ensuite je cherche l'aire en comptant mon nombre de points inclus dans cette forme
    si je prends mon image ligne à ligne je peux avoir :
    * 0 points (pas de contour)
    * 1 point (sommet du contour)
    * 2 points (interieur du contour)
    * 2*n points (si partie convexe)

    En clair avez vous un algo de remplissage qui compte le nombre de points entre 2 points du contour.

    merci

  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
    1- La méthode décrite fonctionne pour TOUTE forme de contour
    2- Il est INNUTIL d'essayer de trouver ymax, ymin par des intersections par des droites verticales ( resp. Xmin, Xmax par des intersections par des droites horizontales).
    3- Il n'y a AUCUNE influence du fait que la forme soit concave ou convexe
    4- Il est seulement opportun de s'assurer que la courbe ne se "croise" pas
    5- Essayer de "pixeliser" la surface conduit à un temps de calcul variant comme n^2 alors que l'intégralle sur le contours varie comme n. - Sans compter le temps nécessaire à la "pixelisation"


    Il est SANS interet de compter un nombre de points ( ce qui par ailleur n'a pas de sens mathématique)

    Appliquez mon code et vous obtiendrez le résultat. Il n'est PAS possible de faire + simple si les points sont à prioris non localisés sur une forme connue comme ellipse, parabole, ....

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Il n'y a pas d'hypothèses sur la régularité de la courbe avec cette méthode ? Au cas où les hypothèses ne sont pas vérifiées, l'erreur reste minime ?

  13. #13
    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
    AUCUNE hypothèse. Le théorème de stokes s'applique sans problème. si la courbe est très irrégulière, il faut juste le nombre de points suffiants pour la définir. suivant le cas il est numériquement préférable d'intégrer X.dY OU Y.dX ou 0.5*(X.dY-Y.dX). J'aime bien la dernière formulation car elle symétrise le rôle de X et Y.

    Il faut faire attention au fait qu'il sagit d'une aire ALGEBRIQUE. Sur une lemniscate de bernouilli, par exemple le résultat sera = à 0 alors que la surface "Géométrique" est évidement non nulle!

    Si on regarde une intégralle de Rieman 'normale' on a en fait une surface définie par 1 droite verticale (X1,0), ->(X1,f(X1)) une courbe (X1,f(X1)->(X2,f(X2)) une droite (X2,f(X2)) -> (X2,0) une droite (X2,0)->(X1,0)
    sur les droites 1 et 3 Y*dx =0 car dx=0, sur la droite 4 y*dx=0 car Y=0 et on retouve
    Somme Y.dx comme on l'écrit de façon naturelle.

    Ces équations intégralles sont très utiles car on réduit de 1 la dimention ce qui recourcit singulièrement les calculs.

    Le passage de 3D à 2D (quand cela est possible) se fait via l'équation d'Ostrogradsky ( Somme surface fermée A. dS = Somme volume div(A) .dTau )

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Mais ta courbe, elle est quand même donnée par une équation là. le_nardo n'a pas précisé que sa surface était donnée par une équation.

  15. #15
    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 courbe n'a pas à être donnée par une équation. L'intégration des points est numérique: on a une somme de N elements du type X*dy-Y*dx. Pour le petit test j'ai mis les points Xi, Yi sur un cercle pour permettre au lecteur de verifier le résultat

    Rappel du code
    Code C++ : 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
    float area( int Npts, float X[], float Y[])
       {
       float *DX  = new float[Npts];
       float *DY  = new float[Npts];
       float A       =       0;
       for ( int i=0; i < Npts; i++)
          {
          DX[ i ] = (X[(i+1)%Npts] - X[(i+Npts-1)%Npts])/2;
          DY[ i ] = (Y[(i+1)%Npts] - Y[(i+Npts-1)%Npts])/2;
          }
       for ( int i=0; i < Npts; i++)
          A = A + (X[ i ]*DY[ i ] - Y[ i ]*DX[ i ]);
       delete [] DX;
       delete [] DY;
       return ( fabs(A/2) );
       }

    Le calcul de l'aire ne fait jamais appel à une équation.

    Si vous en avez une tant mieux : il sera possible d'accroître à discression le nombre de points si nécessaire.
    De plus il ne sera pas necessaire de calculer numériquement dY ou dX si on a les dérivées.
    si non on se contente des points donnés.
    Comme je l'ai dit precedemment, si on fait l'hypothèse d'1 courbe relativement lisse alors on peut, si necessaire, ajouter quelques points par des méthodes d'interpollation ( FFT 2D, splines, ... )

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Ah en effet, j'avais mal compris ton programme d'exemple. Désolé.

  17. #17
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Salut !!

    * d'abord ma forme est vraiment quelconque (concave ou convexe) voire une forme de pomme de terre, jamais un "huit"
    * ensuite je cherche l'aire en comptant mon nombre de points inclus dans cette forme
    si je prends mon image ligne à ligne je peux avoir :
    * 0 points (pas de contour)
    * 1 point (sommet du contour)
    * 2 points (interieur du contour)
    * 2*n points (si partie convexe)
    M... c'est ce que je voulais expliquer !!

    Mais l'algo de jp mignot me plaît bien !!! ça a l'air sympa !

    A+

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Ben comme il dit, l'avantage, c'est que sauf courbe complètement débile (avec beaucoup de circonvolutions), c'est plus en O(n) qu'en O(n²). C'est marrant, je ne m'étais jamais dit que la formule de Stokes pouvait EFFECTIVEMENT servir

  19. #19
    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
    je vous engage alors à revoir vos equations de maxwell et tout l'electromagnétisme, calcul de flux, ...!
    l'analyse vectorielle y est reine.

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Si je veux !

    Ce n'est pas exactement ce que j'entendais par "servir".

    Je sais très bien à quoi sert la formule de Stokes, c'est juste que je l'ai apprise dans un cadre beaucoup plus théorique (variétés différentielles, forme différentielle, et tout le bataclan, qui ne m'a jamais vraiment passionné) et c'est amusant de se rendre compte qu'elle sert, bien sûr sous sa forme la plus simple. J'ai étudié tellement de choses qui ont peu d'applications.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/10/2014, 22h09
  2. [Macro Excel] Fonction qui calcule une formule dans une cellule
    Par Enthau dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/07/2008, 16h31
  3. [Erreur] algorithme qui calcul une moyenne
    Par quaresma dans le forum Algorithmes et structures de données
    Réponses: 29
    Dernier message: 24/04/2008, 20h58
  4. algo qui manipule une matrice carré
    Par do_key_120 dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 21/10/2007, 01h42
  5. methode qui calcul une moyenne du traffic
    Par siry dans le forum Développement
    Réponses: 7
    Dernier message: 05/05/2005, 17h16

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