www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 4740ce442defb36033546072314448eec2406192
parent 1bca125a1a71ccaa38805fd9b61a87754361a6b6
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Mon,  9 Jan 2012 13:08:52 +0100

Quelques corrections, nettoyage.

Diffstat:
Mgeometry/quad.cpp | 21+++++++++++----------
Mgeometry/quad.hh | 4++--
Mgeometry/triangle.cpp | 25++++++++++++++++---------
Mgeometry/triangle.hh | 3++-
Mrules/batiment/batimentquadmaisonpont.cpp | 5++---
5 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/geometry/quad.cpp b/geometry/quad.cpp @@ -27,31 +27,32 @@ Quad Quad::insetNESW(float offset) const { return insetNESW(offset, offset, offset, offset); } -Quad Quad::makeParallelogram() { +Quad Quad::makeParallelogram() const { int l1, l2; + Quad q(c[NE],c[SE],c[SW],c[NW]); if(length(N) < length(S)) { if((l1 = length(E)) < (l2 = length(W))) { - c[SW] = Segment(c[NW],c[SW]).reduce(l1).v; - c[SE] = c[SW] + (c[NE] - c[NW]); + q[SW] = Segment(q[NW],q[SW]).reduce(l1).v; + q[SE] = q[SW] + (q[NE] - q[NW]); } else if((l1 = length(E)) > (l2 = length(W))) { - c[SE] = Segment(c[NE],c[SE]).reduce(l2).v; - c[SW] = c[SE] + (c[NW] - c[NE]); + q[SE] = Segment(q[NE],q[SE]).reduce(l2).v; + q[SW] = q[SE] + (q[NW] - q[NE]); } } else { if((l1 = length(E)) < (l2 = length(W))) { - c[NW] = Segment(c[SW],c[NW]).reduce(l1).v; - c[NE] = c[NW] + (c[SE] - c[SW]); + q[NW] = Segment(q[SW],q[NW]).reduce(l1).v; + q[NE] = q[NW] + (q[SE] - q[SW]); } else if((l1 = length(E)) > (l2 = length(W))) { - c[NE] = Segment(c[SE],c[NE]).reduce(l2).v; - c[NW] = c[NE] + (c[SW] - c[SE]); + q[NE] = Segment(q[SE],q[NE]).reduce(l2).v; + q[NW] = q[NE] + (q[SW] - q[SE]); } } - return Quad(c[0],c[1],c[2],c[3]); + return q; } float Quad::length(Cardinal side) const { diff --git a/geometry/quad.hh b/geometry/quad.hh @@ -36,8 +36,8 @@ class Quad { float maxLength() const; float minAngle() const; float maxAngle() const; - void cutCornerCorner(Coin from) const; - Quad makeParallelogram(); + //void cutCornerCorner(Coin from) const; + Quad makeParallelogram() const; }; diff --git a/geometry/triangle.cpp b/geometry/triangle.cpp @@ -1,13 +1,13 @@ Triangle::Triangle() { } Triangle::Triangle(Vertex left, Vertex top, Vertex right) { - c[0] = left; - c[1] = top; - c[2] = right; + c[LEFT] = left; + c[TOP] = top; + c[RIGHT] = right; } float Triangle::cosAngle() const { - return (c[0]-c[1]).cosAngle(c[2]-c[1]); + return (c[LEFT]-c[TOP]).cosAngle(c[RIGHT]-c[TOP]); } float Triangle::angle() const { @@ -16,17 +16,24 @@ float Triangle::angle() const { float Triangle::minAngle() const { float at = angle(); - float a3 = Triangle(c[TOP],c[RIGHT],c[LEFT]).angle(); - float a1 = Angle::Pi - at - a3; - return std::min(std::min(a1, at), a3); + float ar = Triangle(c[TOP],c[RIGHT],c[LEFT]).angle(); + float al = Angle::Pi - at - ar; + return std::min(std::min(al, at), ar); +} + +float Triangle::maxAngle() const { + float at = angle(); + float ar = Triangle(c[TOP],c[RIGHT],c[LEFT]).angle(); + float al = Angle::Pi - at - ar; + return std::max(std::max(al, at), ar); } float Triangle::minLength() const { - return std::min(std::min((c[0] - c[1]).norm(), (c[1] - c[2]).norm()), (c[2] - c[0]).norm()); + return std::min(std::min((c[LEFT] - c[TOP]).norm(), (c[TOP] - c[RIGHT]).norm()), (c[RIGHT] - c[LEFT]).norm()); } float Triangle::maxLength() const { - return std::max(std::max((c[0] - c[1]).norm(), (c[1] - c[2]).norm()), (c[2] - c[0]).norm()); + return std::max(std::max((c[LEFT] - c[TOP]).norm(), (c[TOP] - c[RIGHT]).norm()), (c[RIGHT] - c[LEFT]).norm()); } Triangle Triangle::inset(CoteTriangle side, float offset) const { diff --git a/geometry/triangle.hh b/geometry/triangle.hh @@ -25,7 +25,8 @@ class Triangle { friend Triangle operator+(const Triangle& t, const Vertex& v); float cosAngle() const; // cosinus de l'angle en c[1]. float angle() const; // angle en c[1], en degrés. TODO : le calcul ne donne que des angles entre 0 et 180 ! - float minAngle() const; // angle minimum du triangle (en c[0], c[1] ou c[2]). + float minAngle() const; // angle minimum du triangle (en LEFT, TOP ou RIGHT). + float maxAngle() const; // angle maximum du triangle (en LEFT, TOP ou RIGHT). float minLength() const; float maxLength() const; Triangle inset(CoteTriangle side, float offset) const; diff --git a/rules/batiment/batimentquadmaisonpont.cpp b/rules/batiment/batimentquadmaisonpont.cpp @@ -10,8 +10,7 @@ void BatimentQuadMaisonPont::getBoundingBoxPoints() { } bool BatimentQuadMaisonPont::split() { - Quad q = c; - q.makeParallelogram(); + Quad q = c.makeParallelogram(); if(Segment(q[NE],q[NW]).length() < Segment(q[NE],q[SE]).length()) q = q << 1; float partLength = Segment(q[NE],q[NW]).length() / 3; @@ -33,7 +32,7 @@ bool BatimentQuadMaisonPont::split() { void BatimentQuadMaisonPont::triangulation() { float h = 2.5*height/3.; - Quad q = Quad(c[NE],c[SE],c[SW],c[NW]).makeParallelogram(); + Quad q = c.makeParallelogram(); Quad qh = q + Vertex(0,0,h); addGPUQuad(c,0x80,0x80,0x80);