Renomage de la fonction subdivide en split et ajout de la fonction de

merge.
This commit is contained in:
Yoann 2011-12-18 14:35:49 +01:00
parent d171be9892
commit 80aad0bd14
26 changed files with 232 additions and 27 deletions

View File

@ -10,7 +10,7 @@
// -> bâtiment dans le "bout" le plus "étroit", et lignes dans une seule direction dans le reste.
void recursiveSubdivide(Chose* c) {
if (c->subdivide()) {
if (c->split()) {
std::vector<Chose*>::iterator it;
for (it = c->children.begin(); it != c->children.end(); ++it) {
recursiveSubdivide(*it);
@ -27,7 +27,7 @@ int main() {
Vertex sw(0, 0, 0);
Vertex nw(0, size, 0);
Chose* c = QuartierQuad::factory(Chose::initialSeed, 0, ne, se, sw, nw);
// c->subdivide();
// c->split();
recursiveSubdivide(c);
View *v = new View(c);

View File

@ -10,6 +10,13 @@ BatimentQuad::BatimentQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw, Cardinal
triangulation();
}
BatimentQuad::~BatimentQuad() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
int BatimentQuad::width() { return this->ne.x - this->sw.x; }
int BatimentQuad::height() { return this->ne.y - this->sw.y; }
@ -18,11 +25,19 @@ std::vector<Vertex*> BatimentQuad::getBoundingBoxPoints() const {
return list;
}
bool BatimentQuad::subdivide() {
bool BatimentQuad::split() {
factory(1,1,ne,se,sw,nw);
return true;
}
bool BatimentQuad::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
Chose* BatimentQuad::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw) {
int th = 20; // Terrain height.
Quad q = Quad(ne,se,sw,nw);

View File

@ -17,9 +17,11 @@ class BatimentQuad : public Chose {
static const int maxHeight = 800;
BatimentQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw, Cardinal door);
virtual ~BatimentQuad();
int width();
int height();
virtual bool subdivide();
virtual bool split();
virtual bool merge();
virtual void triangulation();
Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual std::vector<Vertex*> getBoundingBoxPoints() const;

View File

@ -5,6 +5,13 @@ BatimentQuadJardin::BatimentQuadJardin(Vertex ne, Vertex se, Vertex sw, Vertex n
triangulation();
}
BatimentQuadJardin::~BatimentQuadJardin() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
int BatimentQuadJardin::width() { return this->ne.x - this->sw.x; }
int BatimentQuadJardin::height() { return this->ne.y - this->sw.y; }
@ -14,11 +21,19 @@ std::vector<Vertex*> BatimentQuadJardin::getBoundingBoxPoints() const {
return list;
}
bool BatimentQuadJardin::subdivide() {
bool BatimentQuadJardin::split() {
return true;
}
bool BatimentQuadJardin::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
void BatimentQuadJardin::triangulation() {
triangles.reserve(2);

View File

@ -16,9 +16,11 @@ class BatimentQuadJardin : public Chose {
static const int maxHeight = 800;
BatimentQuadJardin(Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual ~BatimentQuadJardin();
int width();
int height();
virtual bool subdivide();
virtual bool split();
virtual bool merge();
virtual void triangulation();
Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual std::vector<Vertex*> getBoundingBoxPoints() const;

View File

@ -5,6 +5,13 @@ BatimentQuadMaison::BatimentQuadMaison(Vertex ne, Vertex se, Vertex sw, Vertex n
triangulation();
}
BatimentQuadMaison::~BatimentQuadMaison() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
int BatimentQuadMaison::width() { return this->ne.x - this->sw.x; }
int BatimentQuadMaison::height() { return this->ne.y - this->sw.y; }
@ -14,11 +21,19 @@ std::vector<Vertex*> BatimentQuadMaison::getBoundingBoxPoints() const {
return list;
}
bool BatimentQuadMaison::subdivide() {
bool BatimentQuadMaison::split() {
return true;
}
bool BatimentQuadMaison::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
void BatimentQuadMaison::triangulation() {
triangles.reserve(12);

View File

@ -16,9 +16,11 @@ class BatimentQuadMaison : public Chose {
static const int maxHeight = 800;
BatimentQuadMaison(Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual ~BatimentQuadMaison();
int width();
int height();
virtual bool subdivide();
virtual bool split();
virtual bool merge();
virtual void triangulation();
Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual std::vector<Vertex*> getBoundingBoxPoints() const;

View File

@ -16,7 +16,8 @@ class Chose {
public :
void display();
virtual bool subdivide() = 0;
virtual bool split() = 0;
virtual bool merge() = 0;
protected :
Chose();

View File

@ -8,6 +8,13 @@ QuartierQuad::QuartierQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose()
corner[NW] = nw;
}
QuartierQuad::~QuartierQuad() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> QuartierQuad::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
@ -38,10 +45,18 @@ Chose* QuartierQuad::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, V
}
}
bool QuartierQuad::subdivide() {
bool QuartierQuad::split() {
return false;
}
bool QuartierQuad::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
void QuartierQuad::triangulation() {
triangles.reserve(2);
addTriangle(new Triangle(corner[NE], corner[NW], corner[SW], 0xc0, 0xc0, 0xc0));

View File

@ -9,7 +9,9 @@ public:
Vertex corner[4];
public:
QuartierQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual bool subdivide();
virtual ~QuartierQuad();
virtual bool split();
virtual bool merge();
virtual void triangulation();
static Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual std::vector<Vertex*> getBoundingBoxPoints() const;

View File

@ -4,12 +4,19 @@ QuartierQuadAngle::QuartierQuadAngle(Vertex ne, Vertex se, Vertex sw, Vertex nw)
triangulation();
}
QuartierQuadAngle::~QuartierQuadAngle() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> QuartierQuadAngle::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
}
bool QuartierQuadAngle::subdivide() {
bool QuartierQuadAngle::split() {
for (int i = 0; i < 4; i++) {
if (Triangle(corner[NW+i], corner[NE+i], corner[SE+i]).angle() >= Angle::d2r(130)) {
Triangle t1(corner[NE+i], corner[SE+i], corner[SW+i]);
@ -59,3 +66,11 @@ bool QuartierQuadAngle::subdivide() {
addChild(new TerrainQuadHerbe(corner[NE], corner[SE], corner[SW], corner[NW]));
return true;
}
bool QuartierQuadAngle::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}

View File

@ -10,7 +10,9 @@ class QuartierQuadAngle : public QuartierQuad {
public :
QuartierQuadAngle(Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual bool subdivide();
virtual ~QuartierQuadAngle();
virtual bool split();
virtual bool merge();
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
private :

View File

@ -3,12 +3,19 @@
QuartierQuadCarre::QuartierQuadCarre(Vertex ne, Vertex se, Vertex sw, Vertex nw) : QuartierQuad(ne, se, sw, nw) {
}
QuartierQuadCarre::~QuartierQuadCarre() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> QuartierQuadCarre::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
}
bool QuartierQuadCarre::subdivide() {
bool QuartierQuadCarre::split() {
Vertex middle[4];
Quad q[4];
@ -30,3 +37,11 @@ bool QuartierQuadCarre::subdivide() {
}
return true;
}
bool QuartierQuadCarre::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}

View File

@ -10,7 +10,9 @@ class QuartierQuadCarre : public QuartierQuad {
public :
QuartierQuadCarre(Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual bool subdivide();
virtual ~QuartierQuadCarre();
virtual bool split();
virtual bool merge();
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
};

View File

@ -3,12 +3,19 @@
QuartierQuadRect::QuartierQuadRect(Vertex ne, Vertex se, Vertex sw, Vertex nw) : QuartierQuad(ne, se, sw, nw) {
}
QuartierQuadRect::~QuartierQuadRect() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> QuartierQuadRect::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
}
bool QuartierQuadRect::subdivide() {
bool QuartierQuadRect::split() {
Vertex n = Segment(corner[NW], corner[NE]).randomPos(seed, 0, 33, 67);
Vertex s = Segment(corner[SE], corner[SW]).randomPos(seed, 1, 33, 67);
@ -22,3 +29,11 @@ bool QuartierQuadRect::subdivide() {
addChild(QuartierQuad::factory(seed, 3, qw.corner[0], qw.corner[1], qw.corner[2], qw.corner[3]));
return true;
}
bool QuartierQuadRect::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}

View File

@ -10,7 +10,9 @@ class QuartierQuadRect : public QuartierQuad {
public :
QuartierQuadRect(Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual bool subdivide();
virtual ~QuartierQuadRect();
virtual bool split();
virtual bool merge();
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
};

View File

@ -8,6 +8,13 @@ QuartierTri::QuartierTri(Vertex left, Vertex top, Vertex right) : Chose() {
triangulation();
}
QuartierTri::~QuartierTri() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> QuartierTri::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
@ -20,10 +27,18 @@ Chose* QuartierTri::factory(int seed, int n, Vertex left, Vertex top, Vertex rig
return new QuartierTri(left, top, right);
}
bool QuartierTri::subdivide() {
bool QuartierTri::split() {
return false;
}
bool QuartierTri::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
void QuartierTri::triangulation() {
triangles.reserve(1);
addTriangle(new Triangle(corner[0], corner[1], corner[2], 0xf0, 0xc0, 0xc0));

View File

@ -10,7 +10,9 @@ class QuartierTri : public Chose {
public :
QuartierTri(Vertex left, Vertex top, Vertex right);
virtual bool subdivide();
virtual ~QuartierTri();
virtual bool split();
virtual bool merge();
virtual void triangulation();
static Chose* factory(int seed, int n, Vertex left, Vertex top, Vertex right);
virtual std::vector<Vertex*> getBoundingBoxPoints() const;

View File

@ -5,16 +5,31 @@ RouteQuadCarrefour::RouteQuadCarrefour(Vertex ne, Vertex se, Vertex sw, Vertex n
triangulation();
}
RouteQuadCarrefour::~RouteQuadCarrefour() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> RouteQuadCarrefour::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
}
bool RouteQuadCarrefour::subdivide() {
bool RouteQuadCarrefour::split() {
// TODO
return false;
}
bool RouteQuadCarrefour::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
void RouteQuadCarrefour::triangulation() {
triangles.reserve(2);
addTriangle(new Triangle(ne, nw, sw, 0x36, 0x36, 0x36));

View File

@ -12,7 +12,9 @@ class RouteQuadCarrefour : public Chose {
public :
RouteQuadCarrefour(Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual bool subdivide();
virtual ~RouteQuadCarrefour();
virtual bool split();
virtual bool merge();
virtual void triangulation();
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
};

View File

@ -4,16 +4,31 @@ RouteQuadChaussee::RouteQuadChaussee(Vertex ne, Vertex se, Vertex sw, Vertex nw)
triangulation();
}
RouteQuadChaussee::~RouteQuadChaussee() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> RouteQuadChaussee::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
}
bool RouteQuadChaussee::subdivide() {
bool RouteQuadChaussee::split() {
// TODO
return false;
}
bool RouteQuadChaussee::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
void RouteQuadChaussee::triangulation() {
triangles.reserve(2);
addTriangle(new Triangle(ne, nw, sw, 0x36, 0x36, 0x36));

View File

@ -12,7 +12,9 @@ class RouteQuadChaussee : public Chose {
public :
RouteQuadChaussee(Vertex ne, Vertex se, Vertex sw, Vertex nw);
virtual bool subdivide();
virtual ~RouteQuadChaussee();
virtual bool split();
virtual bool merge();
virtual void triangulation();
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
};

View File

@ -10,16 +10,31 @@ TrottoirQuadNormal::TrottoirQuadNormal(Vertex ne, Vertex se, Vertex sw, Vertex n
triangulation();
}
TrottoirQuadNormal::~TrottoirQuadNormal() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> TrottoirQuadNormal::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
}
bool TrottoirQuadNormal::subdivide() {
bool TrottoirQuadNormal::split() {
// TODO
return false;
}
bool TrottoirQuadNormal::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
void TrottoirQuadNormal::triangulation() {
Vertex h = Vertex(0,0,height);
Quad q = Quad(ne,se,sw,nw);

View File

@ -14,7 +14,9 @@ class TrottoirQuadNormal : public Chose {
public :
TrottoirQuadNormal(Vertex ne, Vertex se, Vertex sw, Vertex nw, int height, Cardinal border);
virtual bool subdivide();
virtual ~TrottoirQuadNormal();
virtual bool split();
virtual bool merge();
virtual void triangulation();
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
};

View File

@ -9,6 +9,13 @@ TerrainQuadHerbe::TerrainQuadHerbe(Vertex ne, Vertex se, Vertex sw, Vertex nw) :
triangulation();
}
TerrainQuadHerbe::~TerrainQuadHerbe() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
}
std::vector<Vertex*> TerrainQuadHerbe::getBoundingBoxPoints() const {
std::vector<Vertex*> list;
return list;
@ -23,10 +30,18 @@ TerrainQuadHerbe::TerrainQuadHerbe(int red, Vertex ne, Vertex se, Vertex sw, Ver
triangulation();
}
bool TerrainQuadHerbe::subdivide() {
bool TerrainQuadHerbe::split() {
return false;
}
bool TerrainQuadHerbe::merge() {
for(unsigned int i = 0; i < children.size(); i++)
delete(children[i]);
children.clear();
triangles.clear();
return true;
}
void TerrainQuadHerbe::triangulation() {
triangles.reserve(2);
addTriangle(new Triangle(corner[NE], corner[NW], corner[SW], red, 0xaa, 0x22));

View File

@ -12,7 +12,9 @@ class TerrainQuadHerbe : public Chose {
public :
TerrainQuadHerbe(Vertex ne, Vertex se, Vertex sw, Vertex nw);
TerrainQuadHerbe(int red, Vertex ne, Vertex se, Vertex sw, Vertex nw); // DEBUG
virtual bool subdivide();
virtual ~TerrainQuadHerbe();
virtual bool split();
virtual bool merge();
virtual void triangulation();
virtual std::vector<Vertex*> getBoundingBoxPoints() const;
};