Aire d'un polygone en C++

Fermé
Arya - 6 janv. 2008 à 11:11
mamiemando Messages postés 33268 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 septembre 2024 - 8 janv. 2008 à 15:39
Bonjour,
je dois effectuer un programme qui calcule laire d'un polygone. Voici ce programme :
int main(void)
{
double pts[100][3],
pvec[3],som[3],v1[3],v2[3];
int nbpts,i,k;
double aire;

printf("\nNombre de points du polygone ?");
scanf("%i",&nbpts);
i=0;
while (i<nbpts)
{
printf("\n Point No %d>",i);
scanf ("%lf%lf%lf",&pts[i][0],&pts[i][1],&pts[i][2]);
i=i+1;
}
som[0]=som[1]=som[2]=0.0;
i=1;
while (i<nbpts-1)
{
k=0;

while (k<3)
{
v1[k]=pts[i][k]-pts[0][k];
v2[k]=pts[i+1][k]-pts[0][k];
k=k+1;
}
pvec[0]=v1[1]*v2[2]-v1[2]*v2[1];
pvec[1]=-(v1[0]*v2[2]-v1[2]*v2[0]);
pvec[2]=v1[0]*v2[1]-v1[1]*v2[0];

k=0;
while (k<3)
{
som [k]=som[k]+pvec[k];
k=k+1;
}
i=i+1;
}
aire=o.5*sqrt(som[0]*som[0]+som[1]*som[1]+som[2]*som[2]);
printf("nL'aire de votre polygone est %g\n",aire);

return 0;
}

Maintenant je dois le rendre modulaire c'est a dire créer des fonctions que je reutiliserais dans le programme et je ne sais pas comment m'y prendre. Pourriez vous m'aidez s'il vous plait ?

3 réponses

mamiemando Messages postés 33268 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 septembre 2024 7 780
6 janv. 2008 à 15:52
Voici comment tu peux faire.
#include <iostream>
#include <set>
#include <vector>
#include <cmath>
#include <ostream>

// Pour stocker les points on va directement utiliser la classe vecteur
struct point_t : public std::vector<double>{
    point_t(
        const double & x = 0,
        const double & y = 0,
        const double & z = 0
    ):
        std::vector<double>()
    {
        push_back(x);
        push_back(y);
        push_back(z);
    }
};

// Cet opérateur permet d'écrire un point
std::ostream & operator << (std::ostream & out,const point_t & p){
    out << '(' << p[0] << ',' << p[1] << ',' << p[2] << ')' << std::endl;
    return out;
}

// Si l'utilisateur saisit deux fois le même sommet, il ne faut l'insérer
// qu'une fois dans la liste de point. La classe set va permettre de
// stocker les points de manière ordonnée en un seul exemplaire.
typedef std::set<point_t> points_t;

unsigned lire_points(points_t & pts){
    unsigned nbpts;
    std::cout << "Nombre de points du polygone ?" << std::endl;
    std::cin >> nbpts;
    for(unsigned i = 0; i < nbpts; ++i){
        point_t pi;
        std::cout << "Point No " << i << '>' << std::endl;
        std::cin >> pi[0];
        std::cin >> pi[1];
        std::cin >> pi[2];
        pts.insert(pi);
    }
    return nbpts;
}

void afficher_points(const points_t & pts){
    points_t::const_iterator
        points_it (pts.begin()),
        points_end(pts.end());
    for(;points_it != points_end;++points_it){
        const point_t & pcur = *points_it;
        std::cout << pcur << std::endl; // on écrit le point courant
    }
}

double calculer_aire(const points_t & pts){
    double aire;
    point_t pvec,som,v1,v2;
    const point_t pori = *(pts.begin());

    points_t::const_iterator
        points_it (pts.begin()),
        points_end(pts.end());
    for(;points_it != points_end;++points_it){
        const point_t & pcur = *points_it;
        // ....
    }
    aire = 0.5 * sqrt(som[0]*som[0] + som[1]*som[1] + som[2]*som[2]);
    return aire;
}

int main(){
    points_t pts;
    lire_points(pts);
    afficher_points(pts);
    std::cout << "calcul" << std::endl;
    double aire = calculer_aire(pts);
    std::cout << "L'aire de votre polygone est " << aire << std::endl;
    return 0;
}

A cause du changement de la structure points, il faut modifier un peu la fonction calculer aire mais normalement tu devrais y arriver. L'intérêt c'est qu'ici, on prend en compte les cas où l'utilisateur saisit plusieurs fois le même point, où si le polygone comporte plus de 100 points.

J'ai un peu changé ton programme pour que tu vois comment on peut faire en C++ (ici ton programme est plutôt écrit en C).

Bonne chance
0
en fait j ai commencé a le rendre modulaire, et voila ce ke j'ai fait car je trouve votre solution assez complexe, mais ce ke j'ai ne fonctionne pas, j'ai une erreur.

int saisie_coordonnees ( double pt[100][3] )
{
int nb,i;
printf("\nNombre de points du polygone ?");
scanf("%i",&nbpts);
i=0;
while (i<nbpts)
{
printf("\n Point No %d>",i);
scanf ("%lf%lf%lf",&pts[i][0],&pts[i][1],&pts[i][2]);
i=i+1;
}
return nb;
}


int main(void)
{
double pvec[3],som[3],v1[3],v2[3];
int nbpts,i,k;
double aire;

nbpts=saisie_coordonnees(pts);

}
som[0]=som[1]=som[2]=0.0;
i=1;
while (i<nbpts-1)
{
k=0;

while (k<3)
{
v1[k]=pts[i][k]-pts[0][k];
v2[k]=pts[i+1][k]-pts[0][k];
k=k+1;
}
pvec[0]=v1[1]*v2[2]-v1[2]*v2[1];
pvec[1]=-(v1[0]*v2[2]-v1[2]*v2[0]);
pvec[2]=v1[0]*v2[1]-v1[1]*v2[0];

k=0;
while (k<3)
{
som [k]=som[k]+pvec[k];
k=k+1;
}
i=i+1;
}
aire=0.5*sqrt(som[0]*som[0]+som[1]*som[1]+som[2]*som[2]);
printf("nL'aire de votre polygone est %g\n",aire);


system("pause");
}
0
mamiemando Messages postés 33268 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 septembre 2024 7 780
8 janv. 2008 à 15:39
Bah je t'ai proposé une solution après tu fais comme tu veux. Si les iterators te font peur je pense que le calcul doit marcher même si certains points de ton polygone apparaissent en plusieurs exemplaires. Ainsi tu peux utiliser un vector au lieu d'un set (méthode push_back pour ajouter un point et méthode size pour récupérer la taille).

Bonne chance
0