2011-m2s3-city-builder/rules/quartier/quartierquadangle.cpp
2012-01-09 15:28:10 +01:00

53 lines
2.1 KiB
C++

#include "all_includes.hh"
QuartierQuadAngle::QuartierQuadAngle(Quad c) : QuartierQuad(c) {
}
bool QuartierQuadAngle::split() {
for (int i = 0; i < 4; i++) {
if (Triangle(c[NW+i], c[NE+i], c[SE+i]).angle() >= Angle::d2r(130)) {
// TODO : maintenant que Triangle::offset prend un paramètre side, on peut simplifier ce bazaar.
Triangle t1 = Triangle(c[NE+i], c[SE+i], c[SW+i]).inset(BASE, hrw);
Triangle t2 = Triangle(c[SW+i], c[NW+i], c[NE+i]).inset(BASE, hrw);
addChild(QuartierTri::factory(seed, 0, t1));
addChild(QuartierTri::factory(seed, 1, t2));
addChild(new RouteQuadChaussee(Quad(t1[LEFT], t1[RIGHT], t2[LEFT], t2[RIGHT])));
addChild(new RouteTriChaussee(Triangle(t2[RIGHT], c[NE+i], t1[LEFT])));
addChild(new RouteTriChaussee(Triangle(t1[RIGHT], c[SW+i], t2[LEFT])));
return true;
}
}
for (int i = 0; i < 4; i++) {
if (Triangle(c[NW+i], c[NE+i], c[SE+i]).angle() <= Angle::d2r(50)) {
// "couper ce coin".
Vertex n = Segment(c[NW+i], c[NE+i]).randomPos(seed, 0, 0.4f, 0.6f);
Vertex e = Segment(c[NE+i], c[SE+i]).randomPos(seed, 1, 0.4f, 0.6f);
Triangle tn = Triangle(n, c[NE+i], c[SE+i]);
Triangle te = Triangle(c[NW+i], c[NE+i], e);
Quad q;
if (tn.minAngle() > te.minAngle()) {
q = Quad(n, c[SE+i], c[SW+i], c[NW+i]).inset(E, hrw);
Vertex oldtnright = tn[RIGHT];
tn = tn.inset(BASE, hrw);
addChild(QuartierTri::factory(seed, 0, tn));
addChild(QuartierQuad::factory(seed, 1, q));
addChild(new RouteQuadChaussee(Quad(tn[LEFT], tn[RIGHT], q[SE], q[NE])));
addChild(new RouteTriChaussee(Triangle(tn[RIGHT], oldtnright, q[SE])));
} else {
q = Quad(c[NW+i], e, c[SE+i], c[SW+i]).inset(E, hrw);
Vertex oldteleft = te[LEFT];
te = te.inset(BASE, hrw);
addChild(QuartierTri::factory(seed, 0, te));
addChild(QuartierQuad::factory(seed, 1, q));
addChild(new RouteQuadChaussee(Quad(te[LEFT], te[RIGHT], q[SE], q[NE])));
addChild(new RouteTriChaussee(Triangle(q[NE], oldteleft, te[LEFT])));
}
return true;
}
}
// Ne devait jamais arriver ici !
addChild(new TerrainQuadHerbe(c));
return true;
}