commit b9ef26c6483bd5d961cba0263b80e3b142d8d03c
parent 0608b196ffc02493f4534214942e741cf2eaa11b
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Sun, 8 Jan 2012 22:54:34 +0100
Ajout de QuartierTriTrapeze.
Diffstat:
10 files changed, 66 insertions(+), 21 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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();