#include <iostream>
using namespace std;
// classe Point
#include "point.h"
// produit vectoriel
double prodvect(double x1,double y1,double x2,double y2)
{ return x1*y2-x2*y1; }
// classe element générique
class Polygone {
protected:
int np; // nbre de points
Point *pt; // liste des points
public:
Polygone(int n) { np=n; pt=new Point[n]; };
~Polygone() { delete pt; };
// fonctions devant etre redefinie
virtual double surface() { return 0;};
virtual char * type() { return "inconnue:"; };
// methode amie
friend ostream& operator<<(ostream &s,const Polygone P);
};
// fonction amie permettant l'acces aux donnees
ostream& operator<<(ostream &s,const Polygone P)
{ s<<"[";
for (int i=0; i<P.np; i++) s<<P.pt[i];
s<<"]"; return s;
}
// classe derivee triangle
class Triangle:public Polygone {
public:
Triangle(Point P0,Point P1,Point P2):Polygone(3)
{ pt[0]=P0; pt[1]=P1; pt[2]=P2;};
//
char * type() { return "Triangle: "; };
double surface()
{ return 0.5*prodvect(pt[1].X()-pt[0].X(),pt[1].Y()-pt[0].Y(),
pt[2].X()-pt[0].X(),pt[2].Y()-pt[0].Y());};
};
// et quadrangle regulier
class Quadrangle:public Polygone {
public:
Quadrangle(Point P0,Point P1,Point P2,Point P3):Polygone(4)
{ pt[0]=P0; pt[1]=P1; pt[2]=P2; pt[3]=P3;};
//
char * type() { return "Quadrangle: "; };
double surface()
{ return 0.5*prodvect(pt[1].X()-pt[0].X(),pt[1].Y()-pt[0].Y(),
pt[2].X()-pt[0].X(),pt[2].Y()-pt[0].Y())+
0.5*prodvect(pt[1].X()-pt[2].X(),pt[1].Y()-pt[2].Y(),
pt[3].X()-pt[2].X(),pt[3].Y()-pt[2].Y());};
};
// fonction generique: affichage des elts d'un maillage
void info(Polygone* M[],const int n)
{
for(int i=0; i<n; i++) {
cout<<M[i]->type()<<*M[i]<<endl;
cout<<"surface="<<M[i]->surface()<<endl;
}
}
//
int main()
{
Point P0(0,0),P1(1,0),P2(0,1),P3(1,1);
Triangle T1(P0,P1,P3),T2(P0,P3,P2);
Quadrangle Q(P0,P1,P2,P3);
// maillage =liste d'elements
const int ne=3;
Polygone * Mesh[ne]={&T1,&T2,&Q};
//
info(Mesh,ne);
return 0;
}
#include <iostream>
using namespace std;
// classe de Point
class Point {
// donnees privees
private:
double x,y;
// methodes public
public:
// constructeur
Point(double a=0,double b=0) { x=a; y=b;};
Point(const Point &P) { x=P.x; y=P.y; };
// acces aux donnees (en lecture uniquement)
double X() { return x; }
double Y() { return y; }
// position
void position(double a,double b)
{ x=a; y=b;};
// surcharge d'operateur: P=P1+P2
Point operator+(const Point P) const
{ return Point(x+P.x,y+P.y); };
// P=P1*a
Point operator*(double a) const
{ return Point(x*a,y*a); };
// affichage
friend ostream& operator<<(ostream &s,const Point P);
};
// fonction amie permettant l'acces aux donnees
ostream& operator<<(ostream &s,const Point P)
{ return s<<"("<<P.x<<","<<P.y<<")"; };
//