commit c543641a52dbc65cf61afcf96a4f5f6bf24551e8 parent e348a945d3fb0b9cbae49eab8562c1c8becd8443 Author: Georges Dupéron <jahvascriptmaniac+github@free.fr> Date: Thu, 12 Jan 2012 17:33:41 +0100 Suppression de l'ancienne version de quartier. Diffstat:
25 files changed, 37 insertions(+), 383 deletions(-)
diff --git a/all_includes.hh b/all_includes.hh @@ -49,16 +49,6 @@ class Chose; #include "rules/batiment/batimentquadmur.hh" #include "rules/batiment/batimentquadfenetre.hh" -#include "rules/quartier/quartierquad.hh" -#include "rules/quartier/quartierquadangle.hh" -#include "rules/quartier/quartierquadconcave.hh" -#include "rules/quartier/quartierquadcarre.hh" -#include "rules/quartier/quartierquadrect.hh" -#include "rules/quartier/quartiertri.hh" -#include "rules/quartier/quartiertrihauteur.hh" -#include "rules/quartier/quartiertritrapeze.hh" -#include "rules/quartier/quartiertricentre.hh" - #include "rules/route/routetrottoirquad.hh" #include "rules/route/routetrottoirtri.hh" #include "rules/route/routequadchaussee.hh" diff --git a/geometry/quad.cpp b/geometry/quad.cpp @@ -93,6 +93,28 @@ float Quad::maxLength() const { return std::max(maxLengthNS(), maxLengthEW()); } +Cardinal Quad::minLengthSide() const { + float ln = length(N); + float le = length(E); + float ls = length(S); + float lw = length(W); + if (ln < le && ln < ls && ln < lw) return N; + else if (le < ls && le < lw) return E; + else if (ls < lw) return S; + else return W; +} + +Cardinal Quad::maxLengthSide() const { + float ln = length(N); + float le = length(E); + float ls = length(S); + float lw = length(W); + if (ln > le && ln > ls && ln > lw) return N; + else if (le > ls && le > lw) return E; + else if (ls > lw) return S; + else return W; +} + float Quad::angle(Coin corner) const { return Triangle(c[NW+corner], c[NE+corner], c[SE+corner]).angle(); } diff --git a/geometry/quad.hh b/geometry/quad.hh @@ -35,6 +35,8 @@ class Quad { float maxLengthEW() const; float minLength() const; float maxLength() const; + Cardinal minLengthSide() const; + Cardinal maxLengthSide() const; float angle(Coin corner) const; float minAngle() const; float maxAngle() const; diff --git a/main.cpp b/main.cpp @@ -10,7 +10,7 @@ int main() { Vertex se(size, 0, 0); Vertex sw(0, 0, 0); Vertex nw(0, size, 0); - Chose* c = QuartierQuad::factory(Chose::initialSeed, 0, Quad(ne, se, sw, nw)); + Chose* c = new QuartierQuad_(Quad(ne, se, sw, nw)); c->triangulation(); c->updateAABB(); diff --git a/rules/architecture/arche.cpp b/rules/architecture/arche.cpp @@ -1,6 +1,6 @@ #include "all_includes.hh" -ArcheQuad::ArcheQuad(Quad _c, float _height, float _start, float _end) : c(_c), height(_height), start(_start), end(_end) { +ArcheQuad::ArcheQuad(Quad _c, float _height, float _start, float _end) : Chose(), c(_c), height(_height), start(_start), end(_end) { addEntropy(c); addEntropy(height); } diff --git a/rules/architecture/quartier.cpp b/rules/architecture/quartier.cpp @@ -1,6 +1,6 @@ #include "all_includes.hh" -QuartierQuad_::QuartierQuad_(Quad _c) : c(_c) { +QuartierQuad_::QuartierQuad_(Quad _c) : Chose(), c(_c) { addEntropy(c); } @@ -20,11 +20,9 @@ bool QuartierQuad_::split() { else if (!big && proba(seed, -1, 1, 20)) batiments(); else if (!small && !anglesOk) - angleAngle(); // TODO - else if (!small && tooWideY) - rect(); // TODO : Quad(c[NW], c[NE], c[SE], c[SW]) - else if (!small && tooWideX) - rect(); // TODO : fusion avec ci-dessus + angleAngle(); // TODO : mettre aussi angleCote + else if (!small && (tooWideX || tooWideY)) + rect(); else if (!small) carre(); else @@ -67,11 +65,12 @@ void QuartierQuad_::angleAngle() { } void QuartierQuad_::rect() { - Vertex n = Segment(c[NW], c[NE]).randomPos(seed, 0, 1.f/3.f, 2.f/3.f); - Vertex s = Segment(c[SE], c[SW]).randomPos(seed, 1, 1.f/3.f, 2.f/3.f); + Quad q = c << c.maxLengthSide(); + Vertex n = Segment(q[NW], q[NE]).randomPos(seed, 0, 1.f/3.f, 2.f/3.f); + Vertex s = Segment(q[SE], q[SW]).randomPos(seed, 1, 1.f/3.f, 2.f/3.f); - addChild(new QuartierQuad_(Quad(c[NE], c[SE], s, n))); - addChild(new QuartierQuad_(Quad(c[SW], c[NW], n, s))); + addChild(new QuartierQuad_(Quad(q[NE], q[SE], s, n))); + addChild(new QuartierQuad_(Quad(q[SW], q[NW], n, s))); } void QuartierQuad_::carre() { @@ -111,7 +110,7 @@ void QuartierQuad_::batiments() { } } -QuartierTri_::QuartierTri_(Triangle _c) : c(_c) { +QuartierTri_::QuartierTri_(Triangle _c) : Chose(), c(_c) { addEntropy(c); } diff --git a/rules/quartier/quartierquad.cpp b/rules/quartier/quartierquad.cpp @@ -1,46 +0,0 @@ -#include "all_includes.hh" - -QuartierQuad::QuartierQuad(Quad _c) : Chose(), c(_c) { - addEntropy(c); -} - -void QuartierQuad::getBoundingBoxPoints() { - addBBPoints(c); - addBBPoints(c + Vertex(0,0,1000)); -} - -Chose* QuartierQuad::factory(int seed, int n, Quad c) { - bool small = c.minLength() < 3500; - bool big = c.maxLength() >= 6000; - bool anglesAcceptable = c.minAngle() > Angle::d2r(90-60) && c.maxAngle() < Angle::d2r(90+60); - bool concave = c.maxAngle() > Angle::d2r(160); - bool anglesOk = c.minAngle() > Angle::d2r(90-40) && c.maxAngle() < Angle::d2r(90+40); - bool tooWideX = c.minLengthEW() * 2 < c.maxLengthNS(); // trop allongé (côté E ou W deux fois plus petit que le côté N ou S). - bool tooWideY = c.minLengthNS() * 2 < c.maxLengthEW(); // trop allongé (côté N ou S deux fois plus petit que le côté E ou W). - if (concave) { - return new QuartierQuadConcave(c); - } else if (!big && proba(seed, n, 1, 20)) { - return new RouteTrottoirQuad(c); - } else if (small && anglesAcceptable) { - return new RouteTrottoirQuad(c); - } else if (!small && !anglesOk) { - return new QuartierQuadAngle(c); - } else if (!small && tooWideY) { - return new QuartierQuadRect(Quad(c[NW], c[NE], c[SE], c[SW])); - } else if (!small && tooWideX) { - return new QuartierQuadRect(c); - } else if (!small) { - return new QuartierQuadCarre(c); - } else { - return new RouteTrottoirQuad(c); - } -} - -bool QuartierQuad::split() { - std::cout << "ERROR : QuartierQuad cannot be split." << std::endl; - return false; -} - -void QuartierQuad::triangulation() { - addGPUQuad(c, 0xc0, 0xc0, 0xc0); -} diff --git a/rules/quartier/quartierquad.hh b/rules/quartier/quartierquad.hh @@ -1,18 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERQUAD_HH_ -#define _RULES_QUARTIER_QUARTIERQUAD_HH_ - -#include "all_includes.hh" - - -class QuartierQuad : public Chose { -public: - Quad c; -public: - QuartierQuad(Quad c); - virtual bool split(); - virtual void triangulation(); - static Chose* factory(int seed, int n, Quad c); - virtual void getBoundingBoxPoints(); -}; - -#endif diff --git a/rules/quartier/quartierquadangle.cpp b/rules/quartier/quartierquadangle.cpp @@ -1,35 +0,0 @@ -#include "all_includes.hh" - -QuartierQuadAngle::QuartierQuadAngle(Quad _c) : QuartierQuad(_c) { -} - -bool QuartierQuadAngle::split() { - for (int i = 0; i < 4; i++) { - if (Triangle(c[NW+i], c[NE+i], c[SE+i]).angle() >= Angle::d2r(130)) { - addChild(QuartierTri::factory(seed, 0, Triangle(c[NE+i], c[SE+i], c[SW+i]))); - addChild(QuartierTri::factory(seed, 1, Triangle(c[SW+i], c[NW+i], c[NE+i]))); - return true; - } - } - - for (int i = 0; i < 4; i++) { - if (Triangle(c[NW+i], c[NE+i], c[SE+i]).angle() <= Angle::d2r(50)) { - // "couper ce coin". - Vertex n = Segment(c[NW+i], c[NE+i]).randomPos(seed, 0, 0.4f, 0.6f); - Vertex e = Segment(c[NE+i], c[SE+i]).randomPos(seed, 1, 0.4f, 0.6f); - Triangle tn = Triangle(n, c[NE+i], c[SE+i]); - Triangle te = Triangle(c[NW+i], c[NE+i], e); - if (tn.minAngle() > te.minAngle()) { - addChild(QuartierTri::factory(seed, 0, tn)); - addChild(QuartierQuad::factory(seed, 1, Quad(n, c[SE+i], c[SW+i], c[NW+i]))); - } else { - addChild(QuartierTri::factory(seed, 0, te)); - addChild(QuartierQuad::factory(seed, 1, Quad(c[NW+i], e, c[SE+i], c[SW+i]))); - } - return true; - } - } - // Ne devait jamais arriver ici ! - addChild(new BatimentQuad(c)); - return true; -} diff --git a/rules/quartier/quartierquadangle.hh b/rules/quartier/quartierquadangle.hh @@ -1,13 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERQUADANGLE_HH_ -#define _RULES_QUARTIER_QUARTIERQUADANGLE_HH_ - -#include "all_includes.hh" - -// QuadAngle est un quadrilatère avec des angles malfichus (< 90-40 ou > 90+40). -class QuartierQuadAngle : public QuartierQuad { - public : - QuartierQuadAngle(Quad c); - virtual bool split(); -}; - -#endif diff --git a/rules/quartier/quartierquadcarre.cpp b/rules/quartier/quartierquadcarre.cpp @@ -1,17 +0,0 @@ -#include "all_includes.hh" - -QuartierQuadCarre::QuartierQuadCarre(Quad _c) : QuartierQuad(_c) { -} - -bool QuartierQuadCarre::split() { - Vertex middle[4]; - Vertex center = c.insetNESW(c.minLength() / 4.f).randomPoint(seed, -1); - - for (int i = 0; i < 4; i++) - middle[N+i] = Segment(c[NW+i], c[NE+i]).randomPos(seed, i, 0.25, 0.75); - - for (int i = 0; i < 4; i++) - addChild(QuartierQuad::factory(seed, 4+i, Quad(c[NE+i], middle[E+i], center, middle[N+i]))); - - return true; -} diff --git a/rules/quartier/quartierquadcarre.hh b/rules/quartier/quartierquadcarre.hh @@ -1,16 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERQUADCARRE_HH_ -#define _RULES_QUARTIER_QUARTIERQUADCARRE_HH_ - -#include "all_includes.hh" - -// Quad est un quadrilatère -class QuartierQuadCarre : public QuartierQuad { - private : - static const int hrw = 250; // half road width : 2,50m. - - public : - QuartierQuadCarre(Quad c); - virtual bool split(); -}; - -#endif diff --git a/rules/quartier/quartierquadconcave.cpp b/rules/quartier/quartierquadconcave.cpp @@ -1,16 +0,0 @@ -#include "all_includes.hh" - -QuartierQuadConcave::QuartierQuadConcave(Quad _c) : QuartierQuad(_c) { -} - -bool QuartierQuadConcave::split() { - for (int i = 0; i < 4; i++) { - if (Triangle(c[NW+i], c[NE+i], c[SE+i]).angle() >= Angle::d2r(160)) { - addChild(QuartierTri::factory(seed, 0, Triangle(c[NE+i], c[SE+i], c[SW+i]))); - addChild(QuartierTri::factory(seed, 1, Triangle(c[SW+i], c[NW+i], c[NE+i]))); - return true; - } - } - std::cout << "ERREUR : Ne devait jamais arriver ici !" << std::endl; - return true; -} diff --git a/rules/quartier/quartierquadconcave.hh b/rules/quartier/quartierquadconcave.hh @@ -1,13 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERQUADCONCAVE_HH_ -#define _RULES_QUARTIER_QUARTIERQUADCONCAVE_HH_ - -#include "all_includes.hh" - -// QuadAngle est un quadrilatère avec un angle > 160. -class QuartierQuadConcave : public QuartierQuad { - public : - QuartierQuadConcave(Quad c); - virtual bool split(); -}; - -#endif diff --git a/rules/quartier/quartierquadrect.cpp b/rules/quartier/quartierquadrect.cpp @@ -1,13 +0,0 @@ -#include "all_includes.hh" - -QuartierQuadRect::QuartierQuadRect(Quad _c) : QuartierQuad(_c) { -} - -bool QuartierQuadRect::split() { - Vertex n = Segment(c[NW], c[NE]).randomPos(seed, 0, 1/3.f, 2/3.f); - Vertex s = Segment(c[SE], c[SW]).randomPos(seed, 1, 1/3.f, 2/3.f); - - addChild(QuartierQuad::factory(seed, 2, Quad(c[NE], c[SE], s, n))); - addChild(QuartierQuad::factory(seed, 3, Quad(c[SW], c[NW], n, s))); - return true; -} diff --git a/rules/quartier/quartierquadrect.hh b/rules/quartier/quartierquadrect.hh @@ -1,16 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERQUADRECT_HH_ -#define _RULES_QUARTIER_QUARTIERQUADRECT_HH_ - -#include "all_includes.hh" - -// Quad est un quadrilatère -class QuartierQuadRect : public QuartierQuad { - private : - static const int hrw = 250; // half road width : 2,50m. - - public : - QuartierQuadRect(Quad c); - virtual bool split(); -}; - -#endif diff --git a/rules/quartier/quartiertri.cpp b/rules/quartier/quartiertri.cpp @@ -1,46 +0,0 @@ -#include "all_includes.hh" - -QuartierTri::QuartierTri(Triangle _c) : Chose(), c(_c) { - addEntropy(c); -} - -void QuartierTri::getBoundingBoxPoints() { - addBBPoints(c); - addBBPoints(c + Vertex(0,0,1000)); // TODO -} - -Chose* QuartierTri::factory(int seed, int n, Triangle c) { - bool small = c.minLength() < 3500; - bool big = c.maxLength() >= 6000; - bool verybig = c.minLength() >= 10000; - bool anglesAcceptable = c.minAngle() > 30 && c.maxAngle() < 120; - if (small) { - return new RouteTrottoirTri(c); - } else if (verybig && anglesAcceptable) { - int choice = hash2(seed, n) % 3; - if (choice == 0) { - return new QuartierTriCentre(c); - } else if (choice == 1) { - return new QuartierTriHauteur(c); - } else { - return new QuartierTriTrapeze(c); - } - } else if (big && !small && c.maxAngle() < 60+15 && c.minAngle() > 60-15) { - return new QuartierTriCentre(c); - } else if (big && !small) { - return new QuartierTriHauteur(c); - } else if (big && !small) { - return new QuartierTriTrapeze(c); - } else { - return new RouteTrottoirTri(c); - } -} - -bool QuartierTri::split() { - return false; -} - -void QuartierTri::triangulation() { - triangles.reserve(1); - addGPUTriangle(c, 0xf0, 0xc0, 0xc0); -} diff --git a/rules/quartier/quartiertri.hh b/rules/quartier/quartiertri.hh @@ -1,19 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERTRI_HH_ -#define _RULES_QUARTIER_QUARTIERTRI_HH_ - -#include "all_includes.hh" - - -class QuartierTri : public Chose { - public : - Triangle c; - - public : - QuartierTri(Triangle c); - virtual bool split(); - virtual void triangulation(); - static Chose* factory(int seed, int n, Triangle c); - virtual void getBoundingBoxPoints(); -}; - -#endif diff --git a/rules/quartier/quartiertricentre.cpp b/rules/quartier/quartiertricentre.cpp @@ -1,18 +0,0 @@ -#include "all_includes.hh" - -QuartierTriCentre::QuartierTriCentre(Triangle _c) : QuartierTri(_c) { -} - -bool QuartierTriCentre::split() { - // TODO : maxLength / 6 au lieu de 1000 - Vertex center = c.insetLTR(1000).randomPoint(seed, 0); - Vertex edgePoint[3]; - for (int i = 0; i < 3; i++) - edgePoint[LEFTSIDE+i] = Segment(c[LEFT+i], c[TOP+i]).randomPos(seed, i+1, 1/3.f, 2/3.f); - - for (int i = 0; i < 3; i++) { - Quad q = Quad(c[TOP+i], edgePoint[RIGHTSIDE+i], center, edgePoint[LEFTSIDE+i]); - addChild(QuartierQuad::factory(seed, i+4, q)); - } - return true; -} diff --git a/rules/quartier/quartiertricentre.hh b/rules/quartier/quartiertricentre.hh @@ -1,15 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERTRIORTHOCENTRE_HH_ -#define _RULES_QUARTIER_QUARTIERTRIORTHOCENTRE_HH_ - -#include "all_includes.hh" - -class QuartierTriCentre : public QuartierTri { - private : - static const int hrw = 250; // half road width : 2,50m. - - public : - QuartierTriCentre(Triangle c); - virtual bool split(); -}; - -#endif diff --git a/rules/quartier/quartiertrihauteur.cpp b/rules/quartier/quartiertrihauteur.cpp @@ -1,13 +0,0 @@ -#include "all_includes.hh" - -QuartierTriHauteur::QuartierTriHauteur(Triangle _c) : QuartierTri(_c) { -} - -bool QuartierTriHauteur::split() { - // TODO : sélectionner le sommet TOP avec l'angle le plus grand. - Vertex baseCenter = Segment(c[LEFT], c[RIGHT]).randomPos(seed, 0, 1/3.f, 2/3.f); - - addChild(QuartierTri::factory(seed, 1, Triangle(c[TOP], baseCenter, c[LEFT]))); - addChild(QuartierTri::factory(seed, 2, Triangle(c[RIGHT], baseCenter, c[TOP]))); - return true; -} diff --git a/rules/quartier/quartiertrihauteur.hh b/rules/quartier/quartiertrihauteur.hh @@ -1,15 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERTRIHAUTEUR_HH_ -#define _RULES_QUARTIER_QUARTIERTRIHAUTEUR_HH_ - -#include "all_includes.hh" - -class QuartierTriHauteur : public QuartierTri { - private : - static const int hrw = 250; // half road width : 2,50m. - - public : - QuartierTriHauteur(Triangle c); - virtual bool split(); -}; - -#endif diff --git a/rules/quartier/quartiertritrapeze.cpp b/rules/quartier/quartiertritrapeze.cpp @@ -1,14 +0,0 @@ -#include "all_includes.hh" - -QuartierTriTrapeze::QuartierTriTrapeze(Triangle _c) : QuartierTri(_c) { -} - -bool QuartierTriTrapeze::split() { - // TODO : sélectionner le sommet TOP avec l'angle le plus petit. - Vertex left = Segment(c[LEFT], c[TOP]).randomPos(seed, 0, 1/3.f, 2/3.f); - Vertex right = Segment(c[RIGHT], c[TOP]).randomPos(seed, 0, 1/3.f, 2/3.f); - - addChild(QuartierTri::factory(seed, 1, Triangle(left, c[TOP], right))); - addChild(QuartierQuad::factory(seed, 2, Quad(right, c[RIGHT], c[LEFT], left))); - return true; -} diff --git a/rules/quartier/quartiertritrapeze.hh b/rules/quartier/quartiertritrapeze.hh @@ -1,15 +0,0 @@ -#ifndef _RULES_QUARTIER_QUARTIERTRITRAPEZE_HH_ -#define _RULES_QUARTIER_QUARTIERTRITRAPEZE_HH_ - -#include "all_includes.hh" - -class QuartierTriTrapeze : public QuartierTri { - private : - static const int hrw = 250; // half road width : 2,50m. - - public : - QuartierTriTrapeze(Triangle c); - virtual bool split(); -}; - -#endif diff --git a/tiles.md b/tiles.md @@ -5,8 +5,7 @@ Déjà fait * quad : point central, deux points, deux points verticalement au-dessus des murs, plat. * tri : point central, trois points, un points verticalement au-dessus des murs, deux points verticaux, plat. * arche - * en berceau - * d'ogive + * quad : en berceau, d'ogive * quartier * quad : concave, angleAngle angleCote, rectangle, carre, (contient route + trottoir) * tri : centre, hauteur, trapeze, batiments (contient route + trottoir)