//--- Vertex.h
#ifndef VERTEX_H
#define VERTEX_H
class Vertex {
private:
int x,y;
public:
Vertex():x(0),y(0){};
Vertex(int px,int py):x(px),y(py){};
~Vertex();
int Xvrd(){return x;};
int Yvrd(){return y;};
friend class Polygon;
};
#endif
//--- Shape.h
#ifndef SHAPE_H
#define SHAPE_H
#include <iostream>
#include "Vertex.h"
using namespace std;
class Shape {
protected:
Vertex PosSh;
int AntPlg, AntRec, AntCir, AntPoi;
public:
Shape(const Shape &s) : AntPlg(0), AntRec(0), AntCir(0), AntPoi(0) {};
virtual ~Shape();
virtual double area() = 0;
virtual void printShape();
};
#endif
//--- Polygon.h
#ifndef POLYGON_H
#define POLYGON_H
#include <iostream>
#include "Vertex.h"
#include "Shape.h"
using namespace std;
class Polygon : public Shape{
private:
Vertex *Pol;
int pX,pY,size;
public:
Polygon();
Polygon(int x, int y, Vertex *varr, int num);
~Polygon();
void add(Shape &s);
double area();
void printPol();
};
#endif
//--- Polygon.cpp
#include <iostream>
#include <cmath>
using namespace std;
#include "polygon.h"
#include "Vertex.h"
class Shape;
Polygon::Polygon(int x, int y, Vertex *varr, int num) : pX(x), pY(y), size(num) {
if (size > 0) {
Shape::PosSh = Vertex(pX, pY);
Pol = new Vertex[size];
for(int ix=0; ix<size; ix++)
Pol[ix] = varr[ix];
} else {
Pol = 0; }
}
Polygon::~Polygon(){}
double Polygon::area(){
double s = 0.0;
double r = 0.0;
for (int ix=1; ix<size; ix++)
s += (Pol[ix-1].x * Pol[ix].y) - (Pol[ix].x * Pol[ix-1].y);
r = s / 2;
return abs(r);
}
void Polygon::printPol(){
for(int ix=0; ix<size; ix++)
cout << "(" << Pol[ix].x << "," << Pol[ix].y << ")";
}
//--- Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
#include <iostream>
#include "Vertex.h"
#include "Shape.h"
using namespace std;
class Circle : public Shape {
private:
Vertex *CircPos;
int pX, pY;
double radius;
public:
Circle();
Circle(int x, int y, int radie);
~Circle();
void add(Shape &s);
virtual double area();
virtual void printCir();
};
#endif
//--- Circle.cpp
#include <iostream>
#include "Circle.h"
#include "Vertex.h"
using namespace std;
class Shape;
Circle::Circle(int x, int y, int radie) : pX(x), pY(y), radius(radie) {
Shape::AntCir++;
if (radius>0){
CircPos = new Vertex[Shape::AntCir];
CircPos[Shape::AntCir] = Vertex(pX, pY);
} else {
CircPos = 0;
}
}
Circle::~Circle() {}
double Circle::area() { return M_PI * radius * radius; }
void Circle::printCir() {}
//--- ShapeList.h
#ifndef SHAPELIST_H
#define SHAPELIST_H
#include "vertex.h"
#include "Shape.h"
using namespace std;
class ShapeNode;
class [b]ShapeList[/b] {
protected:
ShapeNode *first;
public:
ShapeList();
ShapeList(const ShapeList &shapes);
~ShapeList();
void add(const Shape &s); // una COPIA de la figura se guarda en la lista
void remove(const Vertex &v);
double area(); // retorna la suma TOTAL del area de TODAS las figuras
void print(); // escribe TODA la lista
};
#endif
//--- ShapeList.cpp
#include <iostream>
#include "ShapeList.h"
#include "vertex.h"
using namespace std;
class Shape;
class ShapeNode {
protected:
Shape *s;
ShapeNode *prev, *next;
ShapeNode(Shape *_s, _ShapeNode *_prev, ShapeNode *_next);
};
ShapeList::ShapeList() { first = 0;}
ShapeList::ShapeList(const ShapeList &shapes) {}
ShapeList::~ShapeList() {}
void ShapeList::add(const Shape &s){
ShapeNode *tmp = first;
first = new ShapeNode(&s, tmp, 0);
tmp->prev = first;
}
void ShapeList::remove(const Vertex &v) {}
double ShapeList::area() {}
void ShapeList::print() {}
// El MAIN para probar es:
//--- Test.cpp
#include <iostream>
#include "vertex.h"
#include "Polygon.h"
#include "Circle.h"
#include "ShapeList.h"
using namespace std;
int main()
{
ShapeList list;
Vertex varr[] = { Vertex(0, 0), Vertex(10, 0), Vertex(5, 2), Vertex(5, 5) };
list.add(Polygon(1, 4, varr, 4));
list.add(Rectangle(4, 10, 2, 4));
list.add(Circle(5, 5, 3));
list.add(Point(6, 7, 1));
Vertex nyarr[] = { Vertex(1, 1), Vertex(9, 2) };
list.add(Polygon(6, 8, nyarr, 2));
list.add(Rectangle(10, 4, 4, 2));
list.add(Circle(3, 3, 5));
list.add(Point(9, 6, 1));
list.print();
cout <<"Total Area: " << list.area() << endl;
ShapeList list2(list);
list2.print();
cout <<"Total Area: " << list2.area() << endl;
list.remove(Vertex(5, 5));
list.print();
cout <<"Total Area: " << list.area() << endl;
list2.print();
cout <<"Total Area: " << list2.area() << endl;
return 0;
}