diff --git a/Makefile b/Makefile index 59dfc1c..b7a812c 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ CCWARN=-Wall -Wextra -Werror # -flto (nécessite GCC 4.5) -m32 ou -m64 CFLAGS=-O0 -I. $(CCWARN) -SOURCES = main.cpp view.cpp hash.cpp vertex.cpp segment.cpp triangle.cpp quad.cpp $(shell echo rules/*/*.cpp) +SOURCES = main.cpp view.cpp hash.cpp vertex.cpp segment.cpp triangle.cpp quad.cpp rules/chose.cpp $(shell echo rules/*/*.cpp) LIBS = -lm -lGL -lGLU -lSDL -lGLEW EXECUTABLE = city diff --git a/all_includes.hh b/all_includes.hh index e06b464..e113ca6 100644 --- a/all_includes.hh +++ b/all_includes.hh @@ -26,15 +26,15 @@ class Chose; #include "view.hh" #include "rules/chose.hh" -#include "rules/batiment/batiment.hh" -#include "rules/route/carrefour.hh" -#include "rules/route/route.hh" -#include "rules/route/trottoir.hh" -#include "rules/quartier/quadrilatere.hh" -#include "rules/quartier/quadcroix.hh" -#include "rules/quartier/quadrect.hh" -#include "rules/quartier/quadangle.hh" -#include "rules/terrain/quadherbe.hh" -#include "rules/tiletri.hh" +#include "rules/batiment/batimentquad.hh" +#include "rules/quartier/quartierquad.hh" +#include "rules/quartier/quartierquadangle.hh" +#include "rules/quartier/quartierquadcarre.hh" +#include "rules/quartier/quartierquadrect.hh" +#include "rules/quartier/quartiertri.hh" +#include "rules/route/routequadcarrefour.hh" +#include "rules/route/routequadchaussee.hh" +#include "rules/route/trottoirquadnormal.hh" +#include "rules/terrain/terrainquadherbe.hh" #endif diff --git a/bugs/open/2011-12-12-2019-todo b/bugs/open/2011-12-12-2019-todo new file mode 100644 index 0000000..fa12cc5 --- /dev/null +++ b/bugs/open/2011-12-12-2019-todo @@ -0,0 +1,42 @@ +Rules +===== + +* chose +* batiment + * batimentquad (sorte de factory interne, fait un addChild : trottoirs (chosit le bon type), jardin (choisir le bon type, batimentquadmaison ou batimentquadimmeuble ou …) + * batimentquadmaison + * batimentquadimmeuble + * etagequad (factory, représente un étage d'une maison ou d'un immeuble par ex). + * piecequad (factory, représente une pièce d'un étage) + * ouverturequad (factory, paramètre décide si porte ou fenêtre, génère 2 ou 3 modèles de portes ou fenêtre) + * pareil pour les tri et penta +* mobilier (intérieur et extérieur) + * escalier + * table + * statue + * banc +* quartier + * quartierquad (factory) + * quartierquadangle + * quartierquadcarre + * quartierquadrect + * quartiertri (factory) + * quartiertrihauteur (coupe le triangle selon sa hauteur) + * quartiertriverscarre (coupe un coin du triangle pour en faire un carré) + * quartiertriverspenta (coupe un coin du triangle pour en faire un pentagone) + * quartierpenta (factory) + * quelques motifs quartierpenta* +* route + * routequad (factory, paramètre indique si l'on veut un carrefour ou une chaussee ou …) + * routequadcarrefour + * routequadchaussee + * routequadparking + * trottoirquad (factory, paramètre indique s'il faut un bateau, …) + * trottoirquadnormal + * trottoirquadbas (la partie basse du bateau) + * trottoirquadpente (la pente du bateau) + * trottoirquadbateau (se subdivise en 3 trottoirquad* : pente + bas + pente) + * un motif pour faire une place +* terrain + * terrainquadherbe + * d'autres terrains… diff --git a/main.cpp b/main.cpp index e506720..2f1221b 100644 --- a/main.cpp +++ b/main.cpp @@ -26,7 +26,7 @@ int main() { Vertex se(size, 0, 0); Vertex sw(0, 0, 0); Vertex nw(0, size, 0); - Chose* c = Quadrilatere::factory(Chose::initialSeed, 0, ne, se, sw, nw); + Chose* c = QuartierQuad::factory(Chose::initialSeed, 0, ne, se, sw, nw); // c->subdivide(); recursiveSubdivide(c); diff --git a/rules/batiment/batiment.cpp b/rules/batiment/batimentquad.cpp similarity index 79% rename from rules/batiment/batiment.cpp rename to rules/batiment/batimentquad.cpp index 7e2dc7e..e25d598 100644 --- a/rules/batiment/batiment.cpp +++ b/rules/batiment/batimentquad.cpp @@ -1,20 +1,20 @@ #include "all_includes.hh" -Batiment::Batiment(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), ne(ne), se(se), sw(sw), nw(nw) { +BatimentQuad::BatimentQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), ne(ne), se(se), sw(sw), nw(nw) { addEntropy(ne, se, sw, nw); triangulation(); } -int Batiment::width() { return this->ne.x - this->sw.x; } +int BatimentQuad::width() { return this->ne.x - this->sw.x; } -int Batiment::height() { return this->ne.y - this->sw.y; } +int BatimentQuad::height() { return this->ne.y - this->sw.y; } -bool Batiment::subdivide() { +bool BatimentQuad::subdivide() { // TODO : rien ? return false; } -void Batiment::triangulation() { +void BatimentQuad::triangulation() { triangles.reserve(12); int h = hashInRange(seed,0,minHeight,maxHeight); diff --git a/rules/batiment/batiment.hh b/rules/batiment/batimentquad.hh similarity index 81% rename from rules/batiment/batiment.hh rename to rules/batiment/batimentquad.hh index 5a9560b..e5955ac 100644 --- a/rules/batiment/batiment.hh +++ b/rules/batiment/batimentquad.hh @@ -4,7 +4,7 @@ #include "all_includes.hh" // RectangleRoutes est un quadrilatère de routes avec des angles aux coins égaux à 90°. -class Batiment : public Chose { +class BatimentQuad : public Chose { public: Vertex ne; Vertex se; @@ -14,7 +14,7 @@ public: static const int minHeight = 400; static const int maxHeight = 800; public: - Batiment(Vertex ne, Vertex se, Vertex sw, Vertex nw); + BatimentQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw); int width(); int height(); virtual bool subdivide(); diff --git a/rules/quartier/quadrilatere.cpp b/rules/quartier/quartierquad.cpp similarity index 57% rename from rules/quartier/quadrilatere.cpp rename to rules/quartier/quartierquad.cpp index ef80c2f..99dc274 100644 --- a/rules/quartier/quadrilatere.cpp +++ b/rules/quartier/quartierquad.cpp @@ -1,6 +1,6 @@ #include "all_includes.hh" -Quadrilatere::Quadrilatere(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose() { +QuartierQuad::QuartierQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose() { addEntropy(ne, se, sw, nw); corner[NE] = ne; corner[SE] = se; @@ -8,36 +8,36 @@ Quadrilatere::Quadrilatere(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose() corner[NW] = nw; } -Chose* Quadrilatere::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw) { +Chose* QuartierQuad::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw) { Quad q = Quad(ne,se,sw,nw); bool small = q.minLength() < 2500; bool big = q.maxLength() >= 5000; - bool anglesAcceptable = q.minAngle() > Angle::d2r(30) && q.maxAngle() < Angle::d2r(150); - bool anglesOk = q.minAngle() > Angle::d2r(50) && q.maxAngle() < Angle::d2r(130); + bool anglesAcceptable = q.minAngle() > Angle::d2r(90-60) && q.maxAngle() < Angle::d2r(90+60); + bool anglesOk = q.minAngle() > Angle::d2r(90-40) && q.maxAngle() < Angle::d2r(90+40); bool tooWideX = q.minLengthEW() * 2 < q.maxLengthNS(); // trop allongé (côté E ou W deux fois plus petit que le côté N ou S). bool tooWideY = q.minLengthNS() * 2 < q.maxLengthEW(); // trop allongé (côté N ou S deux fois plus petit que le côté E ou W). if (!big && proba(seed, n, 1, 20)) { - return new QuadHerbe(ne, se, sw, nw); + return new TerrainQuadHerbe(ne, se, sw, nw); } else if (small && anglesAcceptable) { - return new Batiment(ne, se, sw, nw); + return new BatimentQuad(ne, se, sw, nw); } else if (!small && !anglesOk) { - return new QuadAngle(ne, se, sw, nw); + return new QuartierQuadAngle(ne, se, sw, nw); } else if (!small && tooWideY) { - return new QuadRect(nw, ne, se, sw); + return new QuartierQuadRect(nw, ne, se, sw); } else if (!small && tooWideX) { - return new QuadRect(ne, se, sw, nw); + return new QuartierQuadRect(ne, se, sw, nw); } else if (!small) { - return new QuadCroix(ne, se, sw, nw); + return new QuartierQuadCarre(ne, se, sw, nw); } else { - return new QuadHerbe(ne, se, sw, nw); + return new TerrainQuadHerbe(ne, se, sw, nw); } } -bool Quadrilatere::subdivide() { +bool QuartierQuad::subdivide() { return false; } -void Quadrilatere::triangulation() { +void QuartierQuad::triangulation() { triangles.reserve(2); addTriangle(new Triangle(corner[NE], corner[NW], corner[SW], 0xc0, 0xc0, 0xc0)); addTriangle(new Triangle(corner[SW], corner[SE], corner[NE], 0xc0, 0xc0, 0xc0)); diff --git a/rules/quartier/quadrilatere.hh b/rules/quartier/quartierquad.hh similarity index 79% rename from rules/quartier/quadrilatere.hh rename to rules/quartier/quartierquad.hh index 61417f7..cd25cb5 100644 --- a/rules/quartier/quadrilatere.hh +++ b/rules/quartier/quartierquad.hh @@ -4,11 +4,11 @@ #include "all_includes.hh" // RectangleRoutes est un quadrilatère de routes avec des angles aux coins égaux à 90°. -class Quadrilatere : public Chose { +class QuartierQuad : public Chose { public: Vertex corner[4]; public: - Quadrilatere(Vertex ne, Vertex se, Vertex sw, Vertex nw); + QuartierQuad(Vertex ne, Vertex se, Vertex sw, Vertex nw); virtual bool subdivide(); virtual void triangulation(); static Chose* factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, Vertex nw); diff --git a/rules/quartier/quadangle.cpp b/rules/quartier/quartierquadangle.cpp similarity index 51% rename from rules/quartier/quadangle.cpp rename to rules/quartier/quartierquadangle.cpp index 88f589f..b371ba3 100644 --- a/rules/quartier/quadangle.cpp +++ b/rules/quartier/quartierquadangle.cpp @@ -1,21 +1,21 @@ #include "all_includes.hh" -QuadAngle::QuadAngle(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Quadrilatere(ne, se, sw, nw) { +QuartierQuadAngle::QuartierQuadAngle(Vertex ne, Vertex se, Vertex sw, Vertex nw) : QuartierQuad(ne, se, sw, nw) { triangulation(); } -bool QuadAngle::subdivide() { +bool QuartierQuadAngle::subdivide() { 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]); t1.offsetBase(-hrw); Triangle t2(corner[SW+i], corner[NW+i], corner[NE+i]); t2.offsetBase(-hrw); - addChild(TileTri::factory(seed, 0, t1.v1, t1.v2, t1.v3)); - addChild(TileTri::factory(seed, 1, t2.v1, t2.v2, t2.v3)); - addChild(new Route(t1.v1, t1.v3, t2.v1, t2.v3)); - addChild(new TileTri(t2.v3, corner[NE+i], t1.v1)); // TODO : new RouteTri - addChild(new TileTri(t1.v3, corner[SW+i], t2.v1)); // TODO : new RouteTri + addChild(QuartierTri::factory(seed, 0, t1.v1, t1.v2, t1.v3)); + addChild(QuartierTri::factory(seed, 1, t2.v1, t2.v2, t2.v3)); + addChild(new RouteQuadChaussee(t1.v1, t1.v3, t2.v1, t2.v3)); + addChild(new QuartierTri(t2.v3, corner[NE+i], t1.v1)); // TODO : new RouteTri + addChild(new QuartierTri(t1.v3, corner[SW+i], t2.v1)); // TODO : new RouteTri return true; } } @@ -33,24 +33,24 @@ bool QuadAngle::subdivide() { Vertex oldv3 = tn.v3; tn.offsetBase(-hrw); q.offset(E, -hrw); - addChild(TileTri::factory(seed, 0, tn.v1, tn.v2, tn.v3)); - addChild(Quadrilatere::factory(seed, 1, q.corner[0], q.corner[1], q.corner[2], q.corner[3])); - addChild(new Route(tn.v1, tn.v3, q.corner[1], q.corner[0])); - addChild(new TileTri(tn.v3, oldv3, q.corner[1])); // TODO : new RouteTri + addChild(QuartierTri::factory(seed, 0, tn.v1, tn.v2, tn.v3)); + addChild(QuartierQuad::factory(seed, 1, q.corner[0], q.corner[1], q.corner[2], q.corner[3])); + addChild(new RouteQuadChaussee(tn.v1, tn.v3, q.corner[1], q.corner[0])); + addChild(new QuartierTri(tn.v3, oldv3, q.corner[1])); // TODO : new RouteTri } else { q = Quad(corner[NW+i], e, corner[SE+i], corner[SW+i]); Vertex oldv1 = te.v1; te.offsetBase(-hrw); q.offset(E, -hrw); - addChild(TileTri::factory(seed, 0, te.v1, te.v2, te.v3)); - addChild(Quadrilatere::factory(seed, 1, q.corner[0], q.corner[1], q.corner[2], q.corner[3])); - addChild(new Route(te.v1, te.v3, q.corner[1], q.corner[0])); - addChild(new TileTri(q.corner[0], oldv1, te.v1)); // TODO : new RouteTri + addChild(QuartierTri::factory(seed, 0, te.v1, te.v2, te.v3)); + addChild(QuartierQuad::factory(seed, 1, q.corner[0], q.corner[1], q.corner[2], q.corner[3])); + addChild(new RouteQuadChaussee(te.v1, te.v3, q.corner[1], q.corner[0])); + addChild(new QuartierTri(q.corner[0], oldv1, te.v1)); // TODO : new RouteTri } return true; } } // Ne devait jamais arriver ici ! - addChild(new QuadHerbe(corner[NE], corner[SE], corner[SW], corner[NW])); + addChild(new TerrainQuadHerbe(corner[NE], corner[SE], corner[SW], corner[NW])); return true; } diff --git a/rules/quartier/quadangle.hh b/rules/quartier/quartierquadangle.hh similarity index 73% rename from rules/quartier/quadangle.hh rename to rules/quartier/quartierquadangle.hh index 5ab47f2..f5a50cf 100644 --- a/rules/quartier/quadangle.hh +++ b/rules/quartier/quartierquadangle.hh @@ -4,11 +4,11 @@ #include "all_includes.hh" // QuadAngle est un quadrilatère avec des angles malfichus (< 90-40 ou > 90+40). -class QuadAngle : public Quadrilatere { +class QuartierQuadAngle : public QuartierQuad { private: static const int hrw = 150; // half road width : 2,50m. public: - QuadAngle(Vertex ne, Vertex se, Vertex sw, Vertex nw); + QuartierQuadAngle(Vertex ne, Vertex se, Vertex sw, Vertex nw); virtual bool subdivide(); private: void cutAngle(); diff --git a/rules/quartier/quadcroix.cpp b/rules/quartier/quartierquadcarre.cpp similarity index 58% rename from rules/quartier/quadcroix.cpp rename to rules/quartier/quartierquadcarre.cpp index 3f9dbee..0aae1ea 100644 --- a/rules/quartier/quadcroix.cpp +++ b/rules/quartier/quartierquadcarre.cpp @@ -1,9 +1,9 @@ #include "all_includes.hh" -QuadCroix::QuadCroix(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Quadrilatere(ne, se, sw, nw) { +QuartierQuadCarre::QuartierQuadCarre(Vertex ne, Vertex se, Vertex sw, Vertex nw) : QuartierQuad(ne, se, sw, nw) { } -bool QuadCroix::subdivide() { +bool QuartierQuadCarre::subdivide() { Vertex middle[4]; Quad q[4]; @@ -18,10 +18,10 @@ bool QuadCroix::subdivide() { q[i] = Quad(corner[NE+i], middle[E+i], c, middle[N+i]); q[i].offset(W,-hrw); q[i].offset(S,-hrw); } - addChild(new Carrefour(q[0].corner[SW], q[1].corner[SW], q[2].corner[SW], q[3].corner[SW])); + addChild(new RouteQuadCarrefour(q[0].corner[SW], q[1].corner[SW], q[2].corner[SW], q[3].corner[SW])); for (int i = 0; i < 4; i++) { - addChild(new Route(q[NE+i].corner[NW], q[NE+i].corner[SW], q[NW+i].corner[SW], q[NW+i].corner[SE])); - addChild(Quadrilatere::factory(seed, 4+i, q[i].corner[0], q[i].corner[1], q[i].corner[2], q[i].corner[3])); + addChild(new RouteQuadChaussee(q[NE+i].corner[NW], q[NE+i].corner[SW], q[NW+i].corner[SW], q[NW+i].corner[SE])); + addChild(QuartierQuad::factory(seed, 4+i, q[i].corner[0], q[i].corner[1], q[i].corner[2], q[i].corner[3])); } return true; } diff --git a/rules/quartier/quadcroix.hh b/rules/quartier/quartierquadcarre.hh similarity index 67% rename from rules/quartier/quadcroix.hh rename to rules/quartier/quartierquadcarre.hh index d9cc07d..66ebc25 100644 --- a/rules/quartier/quadcroix.hh +++ b/rules/quartier/quartierquadcarre.hh @@ -4,11 +4,11 @@ #include "all_includes.hh" // Quad est un quadrilatère -class QuadCroix : public Quadrilatere { +class QuartierQuadCarre : public QuartierQuad { private: static const int hrw = 250; // half road width : 2,50m. public: - QuadCroix(Vertex ne, Vertex se, Vertex sw, Vertex nw); + QuartierQuadCarre(Vertex ne, Vertex se, Vertex sw, Vertex nw); virtual bool subdivide(); }; diff --git a/rules/quartier/quadrect.cpp b/rules/quartier/quartierquadrect.cpp similarity index 51% rename from rules/quartier/quadrect.cpp rename to rules/quartier/quartierquadrect.cpp index 20ab6c7..c6e56bd 100644 --- a/rules/quartier/quadrect.cpp +++ b/rules/quartier/quartierquadrect.cpp @@ -1,9 +1,9 @@ #include "all_includes.hh" -QuadRect::QuadRect(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Quadrilatere(ne, se, sw, nw) { +QuartierQuadRect::QuartierQuadRect(Vertex ne, Vertex se, Vertex sw, Vertex nw) : QuartierQuad(ne, se, sw, nw) { } -bool QuadRect::subdivide() { +bool QuartierQuadRect::subdivide() { Vertex n = Segment(corner[NW], corner[NE]).randomPos(seed, 0, 33, 67); Vertex s = Segment(corner[SE], corner[SW]).randomPos(seed, 1, 33, 67); @@ -12,8 +12,8 @@ bool QuadRect::subdivide() { qe.offset(W,-hrw); qw.offset(W,-hrw); - addChild(new Route(qe.corner[NW], qe.corner[SW], qw.corner[NW], qw.corner[SW])); - addChild(Quadrilatere::factory(seed, 2, qe.corner[0], qe.corner[1], qe.corner[2], qe.corner[3])); - addChild(Quadrilatere::factory(seed, 3, qw.corner[0], qw.corner[1], qw.corner[2], qw.corner[3])); + addChild(new RouteQuadChaussee(qe.corner[NW], qe.corner[SW], qw.corner[NW], qw.corner[SW])); + addChild(QuartierQuad::factory(seed, 2, qe.corner[0], qe.corner[1], qe.corner[2], qe.corner[3])); + addChild(QuartierQuad::factory(seed, 3, qw.corner[0], qw.corner[1], qw.corner[2], qw.corner[3])); return true; } diff --git a/rules/quartier/quadrect.hh b/rules/quartier/quartierquadrect.hh similarity index 67% rename from rules/quartier/quadrect.hh rename to rules/quartier/quartierquadrect.hh index 2f6c9be..feff741 100644 --- a/rules/quartier/quadrect.hh +++ b/rules/quartier/quartierquadrect.hh @@ -4,11 +4,11 @@ #include "all_includes.hh" // Quad est un quadrilatère -class QuadRect : public Quadrilatere { +class QuartierQuadRect : public QuartierQuad { private: static const int hrw = 250; // half road width : 2,50m. public: - QuadRect(Vertex ne, Vertex se, Vertex sw, Vertex nw); + QuartierQuadRect(Vertex ne, Vertex se, Vertex sw, Vertex nw); virtual bool subdivide(); }; diff --git a/rules/quartier/quartiertri.cpp b/rules/quartier/quartiertri.cpp new file mode 100644 index 0000000..af5d0ac --- /dev/null +++ b/rules/quartier/quartiertri.cpp @@ -0,0 +1,25 @@ +#include "all_includes.hh" + +QuartierTri::QuartierTri(Vertex left, Vertex top, Vertex right) : Chose() { + addEntropy(left, top, right); + corner[0] = left; + corner[1] = top; + corner[2] = right; + triangulation(); +} + +Chose* QuartierTri::factory(int seed, int n, Vertex left, Vertex top, Vertex right) { + (void)seed; + (void)n; + // TODO + return new QuartierTri(left, top, right); +} + +bool QuartierTri::subdivide() { + return false; +} + +void QuartierTri::triangulation() { + triangles.reserve(1); + addTriangle(new Triangle(corner[0], corner[1], corner[2], 0xf0, 0xc0, 0xc0)); +} diff --git a/rules/quartier/tiletri.hh b/rules/quartier/quartiertri.hh similarity index 80% rename from rules/quartier/tiletri.hh rename to rules/quartier/quartiertri.hh index 8844660..a6dd863 100644 --- a/rules/quartier/tiletri.hh +++ b/rules/quartier/quartiertri.hh @@ -4,11 +4,11 @@ #include "all_includes.hh" // RectangleRoutes est un quadrilatère de routes avec des angles aux coins égaux à 90°. -class TileTri : public Chose { +class QuartierTri : public Chose { public: Vertex corner[3]; public: - TileTri(Vertex left, Vertex top, Vertex right); + QuartierTri(Vertex left, Vertex top, Vertex right); virtual bool subdivide(); virtual void triangulation(); static Chose* factory(int seed, int n, Vertex left, Vertex top, Vertex right); diff --git a/rules/quartier/tiletri.cpp b/rules/quartier/tiletri.cpp deleted file mode 100644 index 2720a7f..0000000 --- a/rules/quartier/tiletri.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "all_includes.hh" - -TileTri::TileTri(Vertex left, Vertex top, Vertex right) : Chose() { - addEntropy(left, top, right); - corner[0] = left; - corner[1] = top; - corner[2] = right; - triangulation(); -} - -Chose* TileTri::factory(int seed, int n, Vertex left, Vertex top, Vertex right) { - (void)seed; - (void)n; - return new TileTri(left, top, right); - // Quad q = Quad(ne,se,sw,nw); - // bool small = q.minLength() < 2500; - // bool big = q.maxLength() >= 5000; - // bool anglesOk = q.minAngle() > Angle::d2r(50) && q.maxAngle() < Angle::d2r(130); - // bool tooWideX = q.minLengthEW() * 2 < q.maxLengthNS(); // trop allongé (côté E ou W deux fois plus petit que le côté N ou S). - // bool tooWideY = q.minLengthNS() * 2 < q.maxLengthEW(); // trop allongé (côté N ou S deux fois plus petit que le côté E ou W). - // if (!big && proba(seed, n, 1, 20)) { - // return new QuadHerbe(ne, se, sw, nw); - // } else if (small && anglesOk) { - // return new Batiment(ne, se, sw, nw); - // } else if (!anglesOk) { - // return new QuadAngle(ne, se, sw, nw); - // } else if (!small && tooWideY) { - // return new QuadRect(nw, ne, se, sw); - // } else if (!small && tooWideX) { - // return new QuadRect(ne, se, sw, nw); - // } else if (!small) { - // return new QuadCroix(ne, se, sw, nw); - // } else { - // return new QuadHerbe(ne, se, sw, nw); - // } -} - -bool TileTri::subdivide() { - return false; -} - -void TileTri::triangulation() { - triangles.reserve(1); - addTriangle(new Triangle(corner[0], corner[1], corner[2], 0xf0, 0xc0, 0xc0)); -} diff --git a/rules/route/carrefour.cpp b/rules/route/carrefour.cpp deleted file mode 100644 index 8ecb987..0000000 --- a/rules/route/carrefour.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "all_includes.hh" - -Carrefour::Carrefour(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), ne(ne), se(se), sw(sw), nw(nw) { - addEntropy(ne,se,sw,nw); - triangulation(); -} - -bool Carrefour::subdivide() { - // TODO - return false; -} - -std::ostream& operator<<(std::ostream& os, const Carrefour* c) { - return os << *c; -} - -std::ostream& operator<<(std::ostream& os, const Carrefour& c) { - return os << "Carrefour " << c.ne << "-" << c.se << "-" << c.sw << "-" << c.nw; -} - -void Carrefour::triangulation() { - triangles.reserve(2); - addTriangle(new Triangle(ne, nw, sw, 0x36, 0x36, 0x36)); - addTriangle(new Triangle(sw, se, ne, 0x36, 0x36, 0x36)); -} diff --git a/rules/route/carrefour.hh b/rules/route/carrefour.hh deleted file mode 100644 index 1aed848..0000000 --- a/rules/route/carrefour.hh +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _CARREFOUR_ROUTE_HH_ -#define _CARREFOUR_ROUTE_HH_ - -#include "all_includes.hh" - -class Carrefour : public Chose { -public: - Vertex ne; - Vertex se; - Vertex sw; - Vertex nw; -public: - Carrefour(Vertex ne, Vertex se, Vertex sw, Vertex nw); - virtual bool subdivide(); - virtual void triangulation(); - // TODO : Carrefour::replacePoint (pour pouvoir transformer un carrefour 4 en carrefour 5 et +). -public: - friend std::ostream& operator<<(std::ostream& os, const Carrefour& c); - friend std::ostream& operator<<(std::ostream& os, const Carrefour* c); -}; - -#endif diff --git a/rules/route/route.hh b/rules/route/route.hh deleted file mode 100644 index dcc17aa..0000000 --- a/rules/route/route.hh +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _RULES_ROUTE_HH_ -#define _RULES_ROUTE_HH_ - -#include "all_includes.hh" - -class Route : public Chose { -public: - Vertex ne; - Vertex se; - Vertex sw; - Vertex nw; -public: - Route(Vertex ne, Vertex se, Vertex sw, Vertex nw); - virtual bool subdivide(); - virtual void triangulation(); -public: - friend std::ostream& operator<<(std::ostream& os, const Route& r); - friend std::ostream& operator<<(std::ostream& os, const Route* r); -}; - -#endif diff --git a/rules/route/routequadcarrefour.cpp b/rules/route/routequadcarrefour.cpp new file mode 100644 index 0000000..f18fa71 --- /dev/null +++ b/rules/route/routequadcarrefour.cpp @@ -0,0 +1,17 @@ +#include "all_includes.hh" + +RouteQuadCarrefour::RouteQuadCarrefour(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), ne(ne), se(se), sw(sw), nw(nw) { + addEntropy(ne,se,sw,nw); + triangulation(); +} + +bool RouteQuadCarrefour::subdivide() { + // TODO + return false; +} + +void RouteQuadCarrefour::triangulation() { + triangles.reserve(2); + addTriangle(new Triangle(ne, nw, sw, 0x36, 0x36, 0x36)); + addTriangle(new Triangle(sw, se, ne, 0x36, 0x36, 0x36)); +} diff --git a/rules/route/routequadcarrefour.hh b/rules/route/routequadcarrefour.hh new file mode 100644 index 0000000..a5c4c84 --- /dev/null +++ b/rules/route/routequadcarrefour.hh @@ -0,0 +1,18 @@ +#ifndef _CARREFOUR_ROUTE_HH_ +#define _CARREFOUR_ROUTE_HH_ + +#include "all_includes.hh" + +class RouteQuadCarrefour : public Chose { +public: + Vertex ne; + Vertex se; + Vertex sw; + Vertex nw; +public: + RouteQuadCarrefour(Vertex ne, Vertex se, Vertex sw, Vertex nw); + virtual bool subdivide(); + virtual void triangulation(); +}; + +#endif diff --git a/rules/route/route.cpp b/rules/route/routequadchaussee.cpp similarity index 57% rename from rules/route/route.cpp rename to rules/route/routequadchaussee.cpp index c153552..4efd24f 100644 --- a/rules/route/route.cpp +++ b/rules/route/routequadchaussee.cpp @@ -1,30 +1,22 @@ #include "all_includes.hh" -Route::Route(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), ne(ne), se(se), sw(sw), nw(nw) { +RouteQuadChaussee::RouteQuadChaussee(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), ne(ne), se(se), sw(sw), nw(nw) { triangulation(); } -bool Route::subdivide() { +bool RouteQuadChaussee::subdivide() { // TODO return false; } -std::ostream& operator<<(std::ostream& os, const Route* r) { - return os << *r; -} - -std::ostream& operator<<(std::ostream& os, const Route& r) { - return os << "Route " << r.ne << "-" << r.se << "-" << r.sw << "-" << r.nw; -} - -void Route::triangulation() { +void RouteQuadChaussee::triangulation() { triangles.reserve(2); addTriangle(new Triangle(ne, nw, sw, 0x36, 0x36, 0x36)); addTriangle(new Triangle(sw, se, ne, 0x36, 0x36, 0x36)); } // Version avec trottoirs. -/*void Route::triangulation() { +/*void RouteQuadChaussee::triangulation() { triangles.reserve(2); Vertex nne, nnw, nse, nsw; // Nouvel emplacement de la route. diff --git a/rules/route/routequadchaussee.hh b/rules/route/routequadchaussee.hh new file mode 100644 index 0000000..2216da8 --- /dev/null +++ b/rules/route/routequadchaussee.hh @@ -0,0 +1,18 @@ +#ifndef _RULES_ROUTE_HH_ +#define _RULES_ROUTE_HH_ + +#include "all_includes.hh" + +class RouteQuadChaussee : public Chose { +public: + Vertex ne; + Vertex se; + Vertex sw; + Vertex nw; +public: + RouteQuadChaussee(Vertex ne, Vertex se, Vertex sw, Vertex nw); + virtual bool subdivide(); + virtual void triangulation(); +}; + +#endif diff --git a/rules/route/trottoir.cpp b/rules/route/trottoirquadnormal.cpp similarity index 84% rename from rules/route/trottoir.cpp rename to rules/route/trottoirquadnormal.cpp index 46b6971..e1b4c45 100644 --- a/rules/route/trottoir.cpp +++ b/rules/route/trottoirquadnormal.cpp @@ -1,6 +1,6 @@ #include "all_includes.hh" -TrottoirRoute::TrottoirRoute(Vertex ne, Vertex se, Vertex sw, Vertex nw, int height) { +TrottoirQuadNormal::TrottoirQuadNormal(Vertex ne, Vertex se, Vertex sw, Vertex nw, int height) { this->ne = ne; this->nw = nw; this->se = se; @@ -9,12 +9,12 @@ TrottoirRoute::TrottoirRoute(Vertex ne, Vertex se, Vertex sw, Vertex nw, int hei triangulation(); } -bool TrottoirRoute::subdivide() { +bool TrottoirQuadNormal::subdivide() { // TODO return false; } -void TrottoirRoute::triangulation() { +void TrottoirQuadNormal::triangulation() { addTriangle(new Triangle(ne + Vertex(0,0,height), nw + Vertex(0,0,height) , sw + Vertex(0,0,height), 0x66, 0x66, 0x66)); addTriangle(new Triangle(sw + Vertex(0,0,height), se + Vertex(0,0,height), ne + Vertex(0,0,height), 0x66, 0x66, 0x66)); addTriangle(new Triangle(ne + Vertex(0,0,height), nw + Vertex(0,0,height), sw + Vertex(0,0,height), 0x66, 0x66, 0x66)); diff --git a/rules/route/trottoir.hh b/rules/route/trottoirquadnormal.hh similarity index 67% rename from rules/route/trottoir.hh rename to rules/route/trottoirquadnormal.hh index 740b2e2..79ebdef 100644 --- a/rules/route/trottoir.hh +++ b/rules/route/trottoirquadnormal.hh @@ -3,7 +3,7 @@ #include "all_includes.hh" -class TrottoirRoute : public Chose { +class TrottoirQuadNormal : public Chose { private : Vertex ne; Vertex se; @@ -12,7 +12,7 @@ class TrottoirRoute : public Chose { int height; public : - TrottoirRoute(Vertex ne, Vertex se, Vertex sw, Vertex nw, int height); + TrottoirQuadNormal(Vertex ne, Vertex se, Vertex sw, Vertex nw, int height); virtual bool subdivide(); virtual void triangulation(); }; diff --git a/rules/terrain/quadherbe.cpp b/rules/terrain/quadherbe.cpp deleted file mode 100644 index 511a307..0000000 --- a/rules/terrain/quadherbe.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "all_includes.hh" - -QuadHerbe::QuadHerbe(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Quadrilatere(ne, se, sw, nw), red(0x11) { - triangulation(); -} - -QuadHerbe::QuadHerbe(int red, Vertex ne, Vertex se, Vertex sw, Vertex nw) : Quadrilatere(ne, se, sw, nw), red(red) { - triangulation(); -} - -void QuadHerbe::triangulation() { - triangles.reserve(2); - addTriangle(new Triangle(corner[NE], corner[NW], corner[SW], red, 0xaa, 0x22)); - addTriangle(new Triangle(corner[SW], corner[SE], corner[NE], red, 0xaa, 0x22)); -} diff --git a/rules/terrain/quadherbe.hh b/rules/terrain/quadherbe.hh deleted file mode 100644 index 6ddd78a..0000000 --- a/rules/terrain/quadherbe.hh +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _RULES_QUAD_HERBE_HH_ -#define _RULES_QUAD_HERBE_HH_ - -#include "all_includes.hh" - -// Quad est un quadrilatère -class QuadHerbe : public Quadrilatere { -private: - int red; -public: - QuadHerbe(Vertex ne, Vertex se, Vertex sw, Vertex nw); - QuadHerbe(int red, Vertex ne, Vertex se, Vertex sw, Vertex nw); - virtual void triangulation(); -}; - - -#endif diff --git a/rules/terrain/terrainquadherbe.cpp b/rules/terrain/terrainquadherbe.cpp new file mode 100644 index 0000000..1a92446 --- /dev/null +++ b/rules/terrain/terrainquadherbe.cpp @@ -0,0 +1,29 @@ +#include "all_includes.hh" + +TerrainQuadHerbe::TerrainQuadHerbe(Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), red(0x11) { + addEntropy(ne, se, sw, nw); + corner[NE] = ne; + corner[SE] = se; + corner[SW] = sw; + corner[NW] = nw; + triangulation(); +} + +TerrainQuadHerbe::TerrainQuadHerbe(int red, Vertex ne, Vertex se, Vertex sw, Vertex nw) : Chose(), red(red) { + addEntropy(ne, se, sw, nw); + corner[NE] = ne; + corner[SE] = se; + corner[SW] = sw; + corner[NW] = nw; + triangulation(); +} + +bool TerrainQuadHerbe::subdivide() { + return false; +} + +void TerrainQuadHerbe::triangulation() { + triangles.reserve(2); + addTriangle(new Triangle(corner[NE], corner[NW], corner[SW], red, 0xaa, 0x22)); + addTriangle(new Triangle(corner[SW], corner[SE], corner[NE], red, 0xaa, 0x22)); +} diff --git a/rules/terrain/terrainquadherbe.hh b/rules/terrain/terrainquadherbe.hh new file mode 100644 index 0000000..f75fb53 --- /dev/null +++ b/rules/terrain/terrainquadherbe.hh @@ -0,0 +1,19 @@ +#ifndef _RULES_QUAD_HERBE_HH_ +#define _RULES_QUAD_HERBE_HH_ + +#include "all_includes.hh" + +// Quad est un quadrilatère +class TerrainQuadHerbe : public Chose { +private: + Vertex corner[4]; + int red; // DEBUG +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 void triangulation(); +}; + + +#endif