diff --git a/quad.cpp b/quad.cpp index b6fddd2..e53327f 100644 --- a/quad.cpp +++ b/quad.cpp @@ -22,7 +22,7 @@ void Quad::offsetNESW(int offsetN, int offsetE, int offsetS, int offsetW) { this->offset(W,offsetW); } -void Quad::makeParallelogram() { +Quad Quad::makeParallelogram() { int l1, l2; if(Segment(corner[NW],corner[NE]).length() < Segment(corner[SE],corner[SW]).length()) { @@ -45,6 +45,8 @@ void Quad::makeParallelogram() { corner[NW] = corner[NE] + (corner[SW] - corner[SE]); } } + + return Quad(corner[0],corner[1],corner[2],corner[3]); } int Quad::minLengthNS() { diff --git a/quad.hh b/quad.hh index 6382b87..5a1abd1 100644 --- a/quad.hh +++ b/quad.hh @@ -21,7 +21,7 @@ class Quad { int maxLength(); float minAngle(); float maxAngle(); - void makeParallelogram(); + Quad makeParallelogram(); }; diff --git a/rules/batiment/batimentquad.cpp b/rules/batiment/batimentquad.cpp index 3e2c233..69e9dc2 100644 --- a/rules/batiment/batimentquad.cpp +++ b/rules/batiment/batimentquad.cpp @@ -43,7 +43,7 @@ Chose* BatimentQuad::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, V int rand = this->seed % 20; if(rand <= 2) { - Quad q = Quad(ne,se,sw,nw); + Quad q = Quad(ne,se,sw,nw).makeParallelogram(); addChild(new BatimentQuadPont(lctr+q.corner[0],lctr+q.corner[1],lctr+q.corner[2],lctr+q.corner[3],300)); } else if(rand <= 15) { @@ -67,7 +67,6 @@ Chose* BatimentQuad::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, V q.corner[2] = q.corner[2] + Vertex(0,0,th); q.corner[3] = q.corner[3] + Vertex(0,0,th); - q.makeParallelogram(); addChild(new BatimentQuadJardin(lctr+q.corner[0],lctr+q.corner[1],lctr+q.corner[2],lctr+q.corner[3])); q.offset(this->entry,-400); @@ -81,14 +80,20 @@ Chose* BatimentQuad::factory(int seed, int n, Vertex ne, Vertex se, Vertex sw, V void BatimentQuad::triangulation() { triangles.reserve(12); + //addTriangle(new Triangle(lctr+ne,lctr+nw,lctr+sw,0xFF,0xFF,0x00)); + //addTriangle(new Triangle(lctr+sw,lctr+se,lctr+ne,0xFF,0xFF,0x00)); + int h = hashInRange(seed,0,minHeight,maxHeight); - int htoit = hashInRange(seed,0,minHeight/2,maxHeight/2); + //int htoit = hashInRange(seed,0,minHeight/2,maxHeight/2); Vertex neh = ne + Vertex(0,0,h); Vertex seh = se + Vertex(0,0,h); Vertex nwh = nw + Vertex(0,0,h); Vertex swh = sw + Vertex(0,0,h); - Vertex toit = (neh + seh + nwh + swh) / 4 + Vertex(0,0,htoit); + //Vertex toit = (neh + seh + nwh + swh) / 4 + Vertex(0,0,htoit); + addOcto(lctr+ne,lctr+se,lctr+sw,lctr+nw,lctr+neh,lctr+seh,lctr+swh,lctr+nwh,0xFF,0xFF,0x00); + +/* // 4 Murs addTriangle(new Triangle(neh,seh,ne,0xf1,0xe3,0xad)); addTriangle(new Triangle(seh,se,ne,0xf1,0xe3,0xad)); // ne-se-seh-neh addTriangle(new Triangle(seh,swh,se,0xf1,0xe3,0xad)); addTriangle(new Triangle(swh,sw,se,0xf1,0xe3,0xad)); // se-sw-swh-seh @@ -100,4 +105,5 @@ void BatimentQuad::triangulation() { addTriangle(new Triangle(seh,toit,swh,0x9a,0x48,0x3c)); addTriangle(new Triangle(swh,toit,nwh,0x9a,0x48,0x3c)); addTriangle(new Triangle(nwh,toit,neh,0x9a,0x48,0x3c)); +*/ } diff --git a/rules/chose.cpp b/rules/chose.cpp index 5d7e33a..980e500 100644 --- a/rules/chose.cpp +++ b/rules/chose.cpp @@ -26,6 +26,16 @@ void Chose::addQuad(Vertex u, Vertex v, Vertex w, Vertex x, char r, char g, char this->addTriangle(new Triangle(w,v,u,r,g,b)); } +void Chose::addOcto(Vertex a, Vertex b, Vertex c, Vertex d, + Vertex e, Vertex f, Vertex g, Vertex h, char red, char green, char blue) { + this->addQuad(d,c,b,a,red,green,blue); + this->addQuad(d,h,g,c,red,green,blue); + this->addQuad(c,g,f,b,red,green,blue); + this->addQuad(b,f,e,a,red,green,blue); + this->addQuad(a,e,h,d,red,green,blue); + this->addQuad(h,g,f,e,red,green,blue); +} + void Chose::display() { if (children.size() > 0) { std::vector::iterator it; diff --git a/rules/chose.hh b/rules/chose.hh index c0e71a4..06414c8 100644 --- a/rules/chose.hh +++ b/rules/chose.hh @@ -33,6 +33,7 @@ class Chose { void addChild(Chose* c); void addTriangle(Triangle* t); void addQuad(Vertex u, Vertex v, Vertex w, Vertex x, char r, char g, char b); + void addOcto(Vertex a,Vertex b,Vertex c,Vertex d,Vertex e,Vertex f,Vertex g,Vertex h,char red,char green,char blue); virtual void triangulation() = 0; virtual std::vector getBoundingBoxPoints() const = 0; diff --git a/segment.cpp b/segment.cpp index b3717ff..a7681a1 100644 --- a/segment.cpp +++ b/segment.cpp @@ -2,11 +2,11 @@ Segment::Segment(Vertex u, Vertex v): u(u), v(v) {} -int Segment::length() { +float Segment::length() { return (u-v).norm(); } -Segment Segment::reduce(int value) { +Segment Segment::reduce(float value) { float reduc = (float)length()/(float)value; return Segment(u,u+((v - u) / reduc)); } diff --git a/segment.hh b/segment.hh index 74cc8b4..ce4de8e 100644 --- a/segment.hh +++ b/segment.hh @@ -10,10 +10,10 @@ class Segment { public : Segment(Vertex u, Vertex v); - int length(); + float length(); int width(); int height(); - Segment reduce(int value); + Segment reduce(float value); Vertex randomPos(int seed, int n, int a, int b); // Renvoir un vertex sur le segment [u,v], à une position entre a% and b%. };