Ajout de QuartierTriTrapeze.

This commit is contained in:
Georges Dupéron 2012-01-08 22:54:34 +01:00
parent 0608b196ff
commit b9ef26c648
10 changed files with 65 additions and 20 deletions

View File

@ -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)

View File

@ -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"

View File

@ -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]);
}
*/

View File

@ -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();

View File

@ -11,9 +11,6 @@ class QuartierQuadAngle : public QuartierQuad {
public :
QuartierQuadAngle(Quad c);
virtual bool split();
private :
void cutAngle();
};
#endif

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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();