Aire d'un polygone en C++
Fermé
Arya
-
6 janv. 2008 à 11:11
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 8 janv. 2008 à 15:39
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 8 janv. 2008 à 15:39
A voir également:
- Aire d'un polygone en C++
- Aire drop - Guide
- Figurine cheveux en l'air - Forum Loisirs / Divertissements
- Transformer image en polygone - Forum Photoshop
- Comment faire un dièse sur macbook air - Forum MacOS
- Aire sous la courbe excel - Forum Windows
3 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
6 janv. 2008 à 15:52
6 janv. 2008 à 15:52
Voici comment tu peux faire.
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
#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
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");
}
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");
}
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
8 janv. 2008 à 15:39
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
Bonne chance