2011-m2s3-city-builder/quad.cpp
Yoann 5092f6271d Ajout d'une fonction permettant de dessiner un objet à huit sommets
addOcto(...) fonctionne de la même manière que addTriangle et addQuad
(précédement ajoutée).

Dessin d'un pavé à la place de la maison, jardin etc lorsqu'il n'y a pas
de split().
2011-12-21 11:18:06 +01:00

103 lines
2.9 KiB
C++

#include "all_includes.hh"
Quad::Quad() {}
Quad::Quad(Vertex ne, Vertex se, Vertex sw, Vertex nw) {
corner[NE] = ne;
corner[SE] = se;
corner[SW] = sw;
corner[NW] = nw;
}
void Quad::offset(Cardinal side, int offset) {
Vertex voffset = (corner[NE + side]-corner[NW + side]).perpendicular().setNorm(offset);
corner[NE + side] = corner[NE + side] + voffset.projectOn(corner[NE + side]-corner[SE + side]);
corner[NW + side] = corner[NW + side] + voffset.projectOn(corner[NW + side]-corner[SW + side]);
}
void Quad::offsetNESW(int offsetN, int offsetE, int offsetS, int offsetW) {
this->offset(N,offsetN);
this->offset(E,offsetE);
this->offset(S,offsetS);
this->offset(W,offsetW);
}
Quad Quad::makeParallelogram() {
int l1, l2;
if(Segment(corner[NW],corner[NE]).length() < Segment(corner[SE],corner[SW]).length()) {
if((l1 = Segment(corner[NE],corner[SE]).length()) < (l2 = Segment(corner[SW],corner[NW]).length())) {
corner[SW] = Segment(corner[NW],corner[SW]).reduce(l1).v;
corner[SE] = corner[SW] + (corner[NE] - corner[NW]);
}
else if((l1 = Segment(corner[NE],corner[SE]).length()) > (l2 = Segment(corner[SW],corner[NW]).length())) {
corner[SE] = Segment(corner[NE],corner[SE]).reduce(l2).v;
corner[SW] = corner[SE] + (corner[NW] - corner[NE]);
}
}
else {
if((l1 = Segment(corner[NE],corner[SE]).length()) < (l2 = Segment(corner[SW],corner[NW]).length())) {
corner[NW] = Segment(corner[SW],corner[NW]).reduce(l1).v;
corner[NE] = corner[NW] + (corner[SE] - corner[SW]);
}
else if((l1 = Segment(corner[NE],corner[SE]).length()) > (l2 = Segment(corner[SW],corner[NW]).length())) {
corner[NE] = Segment(corner[SE],corner[NE]).reduce(l2).v;
corner[NW] = corner[NE] + (corner[SW] - corner[SE]);
}
}
return Quad(corner[0],corner[1],corner[2],corner[3]);
}
int Quad::minLengthNS() {
return std::min(
Segment(corner[NW],corner[NE]).length(),
Segment(corner[SE],corner[SW]).length()
);
}
int Quad::minLengthEW() {
return std::min(
Segment(corner[NE],corner[SE]).length(),
Segment(corner[SW],corner[NW]).length()
);
}
int Quad::maxLengthNS() {
return std::max(
Segment(corner[NW],corner[NE]).length(),
Segment(corner[SE],corner[SW]).length()
);
}
int Quad::maxLengthEW() {
return std::max(
Segment(corner[NE],corner[SE]).length(),
Segment(corner[SW],corner[NW]).length()
);
}
int Quad::minLength() {
return std::min(minLengthNS(), minLengthEW());
}
int Quad::maxLength() {
return std::max(maxLengthNS(), maxLengthEW());
}
float Quad::minAngle() {
float a = 370; // > 360.
for (int i = 0; i < 4; i++) {
a = std::min(a, Triangle(corner[NE+i], corner[SE+i], corner[SW+i]).angle());
}
return a;
}
float Quad::maxAngle() {
float a = 0;
for (int i = 0; i < 4; i++) {
a = std::max(a, Triangle(corner[NE+i], corner[SE+i], corner[SW+i]).angle());
}
return a;
}