diff --git a/Makefile b/Makefile index 0f5b8ee..f9cafc7 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CXX=g++ CCWARN=-Wall -Wextra -Werror # TODO : -O3 -m32 ou -m64 # -g -rdynamic uniquement pour le debug. -CFLAGS=-O0 -I. $(CCWARN) -g -rdynamic +CFLAGS=-O0 -g -rdynamic -m32 -I. $(CCWARN) SOURCES = $(shell echo *.cpp geometry/*.cpp rules/*.cpp rules/*/*.cpp) HEADERS = $(shell echo *.hh geometry/*.hh rules/*.hh rules/*/*.hh) diff --git a/all_includes.hh b/all_includes.hh index 32e0db1..794451f 100644 --- a/all_includes.hh +++ b/all_includes.hh @@ -53,6 +53,7 @@ class Chose; #include "rules/quartier/quartierquadrect.hh" #include "rules/quartier/quartiertri.hh" #include "rules/quartier/quartiertrihauteur.hh" +#include "rules/quartier/quartiertritrapeze.hh" #include "rules/route/routequadcarrefour.hh" #include "rules/route/routequadchaussee.hh" diff --git a/geometry/quad.cpp b/geometry/quad.cpp index 3fe977c..aea9f00 100644 --- a/geometry/quad.cpp +++ b/geometry/quad.cpp @@ -102,8 +102,12 @@ Quad operator+(const Quad& q, const Vertex& v) { return Quad(q[NE] + v, q[SE] + v, q[SW] + v, q[NW] + v); } -void Quad::cutCornerCorner(Coin from) const { - Triangle t1(c[from-1], c[from], c[from+1]); - Triangle t2(c[from+1], c[from+2], c[from-1]); - // TODO +/* +void Quad::cutCornerCorner(Coin from, float cutwidth) const { + Triangle left = Triangle(c[from-2], c[from-1], c[from]).offset(BASE, cutwidth); + Triangle right = Triangle(c[from], c[from+1], c[from+2]).offset(BASE, cutwidth); + Quad cut(right[LEFT], right[RIGHT], left[LEFT], left[RIGHT]); // + c[from+2] avant le 1er sommet, et c[from] après le 2e. + Triangle cutFrom(left[RIGHT], c[from], right[LEFT]); + Triangle cutTo(right[LEFT], c[from+2], left[RIGHT]); } +*/ diff --git a/rules/chose.cpp b/rules/chose.cpp index fa6b74b..2964d0f 100644 --- a/rules/chose.cpp +++ b/rules/chose.cpp @@ -3,7 +3,8 @@ Chose::Chose() : seed(initialSeed), children() { } -// TODO : Est-ce vraiment nécessaire ? +// TODO : Le destructeur est-il vraiment nécessaire ? +// TODO : Vu que children et triangles contiennent des pointeurs, le .clear() risque de ne pas les désallouer ! Chose::~Chose() { children.clear(); triangles.clear(); diff --git a/rules/quartier/quartierquadangle.hh b/rules/quartier/quartierquadangle.hh index 4979189..00764e8 100644 --- a/rules/quartier/quartierquadangle.hh +++ b/rules/quartier/quartierquadangle.hh @@ -11,9 +11,6 @@ class QuartierQuadAngle : public QuartierQuad { public : QuartierQuadAngle(Quad c); virtual bool split(); - - private : - void cutAngle(); }; #endif diff --git a/rules/quartier/quartiertri.cpp b/rules/quartier/quartiertri.cpp index d6eaf34..0f7e30a 100644 --- a/rules/quartier/quartiertri.cpp +++ b/rules/quartier/quartiertri.cpp @@ -10,14 +10,14 @@ void QuartierTri::getBoundingBoxPoints() { } Chose* QuartierTri::factory(int seed, int n, Triangle c) { - (void)seed; - (void)n; bool small = c.minLength() < 2500; bool big = c.maxLength() >= 5000; if (small && !big) { return new BatimentTri(c); - } else if (!small) { + } else if (!small && proba(seed, n, 1, 2)) { return new QuartierTriHauteur(c); + } else if (!small) { + return new QuartierTriTrapeze(c); } else { return new TerrainTriHerbe(c); } diff --git a/rules/quartier/quartiertrihauteur.cpp b/rules/quartier/quartiertrihauteur.cpp index 197ad5c..e99b309 100644 --- a/rules/quartier/quartiertrihauteur.cpp +++ b/rules/quartier/quartiertrihauteur.cpp @@ -4,14 +4,22 @@ QuartierTriHauteur::QuartierTriHauteur(Triangle c) : QuartierTri(c) { } bool QuartierTriHauteur::split() { + // TODO : sélectionner le sommet avec l'angle le plus grand. + // Triangle::cutCornerSideResult r = c.cutCornerSide(TOP, random(seed,0,0.33, 0.67); + // addChild(new RouteQuadChaussee(r.cut)); + // addChild(new RouteTriChaussee(r.cutFrom)); + // addChild(QuartierTri::factory(seed, 1, r.left); + // addChild(QuartierTri::factory(seed, 1, r.right); Vertex baseCenter = Segment(c[LEFT], c[RIGHT]).randomPos(seed, 0, 33, 67); - Triangle tl = Triangle(baseCenter, c[LEFT], c[TOP]).inset(BASE, hrw); - Triangle tr = Triangle(c[TOP], c[RIGHT], baseCenter).inset(BASE, hrw); + Triangle tl(c[TOP], baseCenter, c[LEFT]); + Triangle tr(c[RIGHT], baseCenter, c[TOP]); + tl = tl.inset(LEFTSIDE, hrw); + tr = tr.inset(RIGHTSIDE, hrw); - addChild(new RouteQuadChaussee(Quad(tr[LEFT], tr[RIGHT], tl[LEFT], tl[RIGHT]))); - addChild(new RouteTriChaussee(Triangle(tl[RIGHT], c[TOP], tr[LEFT]))); - addChild(QuartierTri::factory(seed, 1, tl >> 1)); - addChild(QuartierTri::factory(seed, 2, tr << 1)); + addChild(new RouteQuadChaussee(Quad(tr[RIGHT], tr[TOP], tl[TOP], tl[LEFT]))); + addChild(new RouteTriChaussee(Triangle(tl[LEFT], c[TOP], tr[RIGHT]))); + addChild(QuartierTri::factory(seed, 1, tl)); + addChild(QuartierTri::factory(seed, 2, tr)); return true; } diff --git a/rules/quartier/quartiertritrapeze.cpp b/rules/quartier/quartiertritrapeze.cpp new file mode 100644 index 0000000..600654e --- /dev/null +++ b/rules/quartier/quartiertritrapeze.cpp @@ -0,0 +1,20 @@ +#include "all_includes.hh" + +QuartierTriTrapeze::QuartierTriTrapeze(Triangle c) : QuartierTri(c) { +} + +bool QuartierTriTrapeze::split() { + // TODO : sélectionner le sommet avec l'angle le plus petit. + Vertex left = Segment(c[LEFT], c[TOP]).randomPos(seed, 0, 33, 67); + Vertex right = Segment(c[RIGHT], c[TOP]).randomPos(seed, 0, 33, 67); + + Triangle ttop(left, c[TOP], right); + Quad trapeze(right, c[RIGHT], c[LEFT], left); + ttop = ttop.inset(BASE, hrw); + trapeze = trapeze.inset(N, hrw); + + addChild(new RouteQuadChaussee(Quad(ttop[RIGHT], trapeze[NE], trapeze[NW], ttop[LEFT]))); + addChild(QuartierTri::factory(seed, 1, ttop)); + addChild(QuartierQuad::factory(seed, 2, trapeze)); + return true; +} diff --git a/rules/quartier/quartiertritrapeze.hh b/rules/quartier/quartiertritrapeze.hh new file mode 100644 index 0000000..8b47a63 --- /dev/null +++ b/rules/quartier/quartiertritrapeze.hh @@ -0,0 +1,15 @@ +#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/view.cpp b/view.cpp index ad8257d..a54969a 100644 --- a/view.cpp +++ b/view.cpp @@ -1,9 +1,8 @@ #include "all_includes.hh" -// camera(Camera(Vertex(9600,10000,15300),0,179,1000,0.6) View::View(Chose* root) : root(root), - camera(Camera(Vertex(-9000,-15000,3000),45,90,1000,0.6)), + camera(Camera(Vertex(9600,10000,15300),0,179,1000,0.6)), lod(camera.cameraCenter, root) { initWindow(); mainLoop();