2011-m2s3-city-builder/rules/rectangleroutes.cpp
2011-11-29 12:06:50 +01:00

69 lines
2.6 KiB
C++

#include "all_includes.hh"
RectangleRoutes::RectangleRoutes(Vertex ne, Vertex sw) : Chose(), ne(ne), sw(sw) {
addEntropy(ne, sw);
triangulation();
}
int RectangleRoutes::width() { return std::abs(this->ne.x - this->sw.x); }
int RectangleRoutes::height() { return std::abs(this->ne.y - this->sw.y); }
bool RectangleRoutes::subdivide() {
children.reserve(9);
Vertex split(
hashInRange(this->seed, 0, this->sw.x + this->width()*1/4, this->sw.x + this->width()*3/4),
hashInRange(this->seed, 1, this->sw.y + this->height()*1/4, this->sw.y + this->height()*3/4),
0 // TODO
);
// TODO : addChild(…);
addChild(new Carrefour(split + Vertex(1,1,0), split + Vertex(1,-1,0), split + Vertex(-1,-1,0), split + Vertex(-1,1,0)));
// routes au NESW du carrefour
// TODO : la plupart des zéros en z sont faux…
Vertex roadEndN(split.x, this->ne.y, 0);
Vertex roadEndE(this->ne.x, split.y, 0);
Vertex roadEndS(split.x, this->sw.y, 0);
Vertex roadEndW(this->sw.x, split.y, 0);
// TODO : addChild(…);
Route* rn = new Route(roadEndN + Vertex(-1,0,0), roadEndN + Vertex(+1,0,0), split + Vertex(+1,+1,0), split + Vertex(-1,+1,0)); // N
Route* re = new Route(roadEndE + Vertex(0,+1,0), roadEndE + Vertex(0,-1,0), split + Vertex(+1,-1,0), split + Vertex(+1,+1,0)); // E
Route* rs = new Route(roadEndS + Vertex(+1,0,0), roadEndS + Vertex(-1,0,0), split + Vertex(-1,-1,0), split + Vertex(+1,-1,0)); // S
Route* rw = new Route(roadEndW + Vertex(0,-1,0), roadEndW + Vertex(0,+1,0), split + Vertex(-1,+1,0), split + Vertex(-1,-1,0)); // W
addChild(rn);
addChild(re);
addChild(rs);
addChild(rw);
// Sous-quartiers
addChild(sub(rn->corners[NE], re->corners[NE])); // sous-quartier NE
addChild(sub(re->corners[SE], rs->corners[SE])); // sous-quartier SE
addChild(sub(rs->corners[SW], rw->corners[SW])); // sous-quartier SW
addChild(sub(rw->corners[NW], rn->corners[NW])); // sous-quartier NW
return true;
}
void RectangleRoutes::triangulation() {
triangles.reserve(2);
Vertex nw(this->sw.x, this->ne.y, 0);
Vertex se(this->ne.x, this->sw.y, 0);
addTriangle(new Triangle(this->sw, nw, this->ne, 0xc0, 0xc0, 0xc0));
addTriangle(new Triangle(this->sw, se, this->ne, 0xc0, 0xc0, 0xc0));
}
Chose* RectangleRoutes::sub(Vertex ne, Vertex sw) {
Segment rect = Segment(ne,sw);
std::cout << this << " ne=" << ne << " sw=" << sw << std::endl;
if (rect.width() < 10 || rect.height() < 10) {
return new Batiment(ne, sw);
} else {
return new RectangleRoutes(ne, sw);
}
}
std::ostream& operator<<(std::ostream& os, const RectangleRoutes* r) {
return os << *r;
}
std::ostream& operator<<(std::ostream& os, const RectangleRoutes& r) {
return os << "RectangleRoutes " << r.ne << "-" << r.sw;
}