From 556974a38da74e317925cbd7bdb44ed719590a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Thu, 19 Jan 2012 11:28:28 +0100 Subject: [PATCH 1/2] Utilisation des arbres dans les TerrainQuad. --- rules/architecture/arbre.cpp | 12 +++++++++++- rules/architecture/arbre.hh | 2 ++ rules/architecture/quartier.cpp | 12 ------------ rules/architecture/terrain.cpp | 28 +++++++++++++++++++++++++++- rules/architecture/terrain.hh | 4 +++- 5 files changed, 43 insertions(+), 15 deletions(-) diff --git a/rules/architecture/arbre.cpp b/rules/architecture/arbre.cpp index a1e9cc5..a1aea6c 100644 --- a/rules/architecture/arbre.cpp +++ b/rules/architecture/arbre.cpp @@ -1,6 +1,8 @@ #include "all_includes.hh" -Arbre::Arbre(Vertex _start, Triangle plane) : start(_start), type(ARBRE) { +void Arbre::initPlane(Vertex _start, Triangle plane) { + start = _start; + type = ARBRE; addEntropy(start); addEntropy(plane); @@ -14,6 +16,14 @@ Arbre::Arbre(Vertex _start, Triangle plane) : start(_start), type(ARBRE) { length = floatInRange(seed, -5, 3*100, 4*100); } +Arbre::Arbre(Vertex _start, Triangle plane) { + initPlane(_start, plane); +} + +Arbre::Arbre(Vertex _start, Quad plane) { + initPlane(_start, Triangle(plane[NE], plane[SE], plane[SW])); +} + Arbre::Arbre(Vertex _start, Angle3D _rotation, float _length, Type _type) : start(_start), rotation(_rotation), length(_length), type(_type) { addEntropy(start, rotation.h, rotation.l, rotation.u); addEntropy(length); diff --git a/rules/architecture/arbre.hh b/rules/architecture/arbre.hh index 8e074f1..7878040 100644 --- a/rules/architecture/arbre.hh +++ b/rules/architecture/arbre.hh @@ -19,8 +19,10 @@ private: static float tauxMax(); static float calcLimitLengthFactor(); static const float limitLengthFactor; + void initPlane(Vertex _start, Triangle plane); public: static float maxRadius(float length); + Arbre(Vertex _start, Quad plane); Arbre(Vertex _start, Triangle plane); Arbre(Vertex _start, Angle3D _rotation, float _length, Type _type = ARBRE); virtual bool split(); diff --git a/rules/architecture/quartier.cpp b/rules/architecture/quartier.cpp index 7afb614..d2243fc 100644 --- a/rules/architecture/quartier.cpp +++ b/rules/architecture/quartier.cpp @@ -135,18 +135,6 @@ void QuartierQuad::batiments() { addChild(new BatimentQuad_(qbatiments)); } else { addChild(new TerrainQuad(qbatiments)); - Vertex p1 = qbatiments.insetProportionnal(0.7).randomPoint(seed, 1); - Vertex p2 = qbatiments.insetProportionnal(0.7).randomPoint(seed, 2); - Vertex p3 = qbatiments.insetProportionnal(0.7).randomPoint(seed, 3); - if (proba(seed, 4, 3, 4)) { - addChild(new Arbre(p1, Triangle(qbatiments[NE], qbatiments[SE], qbatiments[SW]))); - if (proba(seed, 5, 3, 4) && Segment(p1,p2).length() > 3 * 100) { - addChild(new Arbre(p2, Triangle(qbatiments[NE], qbatiments[SE], qbatiments[SW]))); - if (proba(seed, 6, 3, 4) && Segment(p2,p3).length() > 3 * 100 && Segment(p1,p3).length() > 3 * 100) { - addChild(new Arbre(p3, Triangle(qbatiments[NE], qbatiments[SE], qbatiments[SW]))); - } - } - } } } diff --git a/rules/architecture/terrain.cpp b/rules/architecture/terrain.cpp index d3db682..932881d 100644 --- a/rules/architecture/terrain.cpp +++ b/rules/architecture/terrain.cpp @@ -1,9 +1,35 @@ #include "all_includes.hh" -TerrainQuad::TerrainQuad(Quad _c) : Chose(), c(_c) { +TerrainQuad::TerrainQuad(Quad _c, bool _addTrees) : Chose(), c(_c), addTrees(_addTrees) { addEntropy(c); } +bool TerrainQuad::split() { + if (!addTrees) return false; + + addChild(new TerrainQuad(c, false)); + + int maxNArbres = 10; + Vertex p[maxNArbres]; + int pi = 0; + int nArbres = hash2(seed, -1) % (maxNArbres + 1); + for (int essai = 0; essai < nArbres * 2 && pi < nArbres; essai++) { + p[pi] = c.insetProportionnal(0.7).randomPoint(seed, essai); + bool success = true; + for (int j = 0; j < pi; j++) { + if (Segment(p[j], p[pi]).length() < 3 * 100) { + success = false; + break; + } + } + if (success) pi++; + } + for (int i = 0; i < pi; i++) { + addChild(new Arbre(p[i], c)); + } + return true; +} + void TerrainQuad::getBoundingBoxPoints() { addBBPoints(c); } diff --git a/rules/architecture/terrain.hh b/rules/architecture/terrain.hh index 76e35c4..f9d9dbf 100644 --- a/rules/architecture/terrain.hh +++ b/rules/architecture/terrain.hh @@ -16,9 +16,11 @@ class TerrainTri : public Chose { class TerrainQuad : public Chose { private : Quad c; + bool addTrees; public : - TerrainQuad(Quad _c); + TerrainQuad(Quad _c, bool _addTrees = true); + virtual bool split(); virtual void triangulation(); virtual void getBoundingBoxPoints(); }; From ac3b0e39590fb50cebd9fd1885857ff9f17aabf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Thu, 19 Jan 2012 13:09:48 +0100 Subject: [PATCH 2/2] Correction sur offsetOpp. --- geometry/quad.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/geometry/quad.cpp b/geometry/quad.cpp index 6aed4b0..cee2abf 100644 --- a/geometry/quad.cpp +++ b/geometry/quad.cpp @@ -30,11 +30,9 @@ Quad Quad::insetNESW(float offset) const { } Quad Quad::insetOpp(Cardinal side, float offset) const { - Quad q = (*this) << int(side); - Quad qb = (*this) << int(side); - - qb = qb.inset(N,offset); - return Quad(q[NE],qb[NE],qb[NW],q[NW]); + Quad q = (*this) << side; + Quad qi = q.inset(N,offset); + return (Quad(q[NE],qi[NE],qi[NW],q[NW]) >> side); } Quad Quad::makeParallelogram() const {