From 14af354feaf8416db544d4495141c4a18e3d286f Mon Sep 17 00:00:00 2001 From: Yoann Date: Thu, 12 Jan 2012 18:48:18 +0100 Subject: [PATCH 1/4] =?UTF-8?q?Ajout=20du=20d=C3=A9but=20d'une=20fonction?= =?UTF-8?q?=20qui=20renvoi=20le=20sommet=20qui=20induit=20un=20Quad=20conc?= =?UTF-8?q?ave.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- geometry/quad.cpp | 14 ++++++++++++++ geometry/quad.hh | 1 + 2 files changed, 15 insertions(+) diff --git a/geometry/quad.cpp b/geometry/quad.cpp index a793f24..bacf7ed 100644 --- a/geometry/quad.cpp +++ b/geometry/quad.cpp @@ -157,6 +157,20 @@ Coin Quad::maxAngleCorner() const { else return NW; } +Coin Quad::concaveCorner() { + Vertex nne = Triangle(c[NW], c[NE], c[SE]).normal(); + Vertex nse = Triangle(c[NE], c[SE], c[SW]).normal(); + Vertex nsw = Triangle(c[SE], c[SW], c[NW]).normal(); + Vertex nnw = Triangle(c[SW], c[NW], c[NE]).normal(); + + nne = nne; + nnw = nnw; + nse = nse; + nsw = nsw; + + return NW; +} + Quad operator+(const Quad& q, const Vertex& v) { return Quad(q[NE] + v, q[SE] + v, q[SW] + v, q[NW] + v); } diff --git a/geometry/quad.hh b/geometry/quad.hh index 219443c..8a034ee 100644 --- a/geometry/quad.hh +++ b/geometry/quad.hh @@ -37,6 +37,7 @@ class Quad { float maxLength() const; Cardinal minLengthSide() const; Cardinal maxLengthSide() const; + Coin concaveCorner(); float angle(Coin corner) const; float minAngle() const; float maxAngle() const; From 4fb95b083b51c2cf334da5d207bd12085cbdc6e3 Mon Sep 17 00:00:00 2001 From: Yoann Date: Thu, 12 Jan 2012 20:57:27 +0100 Subject: [PATCH 2/4] Suite et fin de la fonction concaveCorner(). --- geometry/quad.cpp | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/geometry/quad.cpp b/geometry/quad.cpp index bacf7ed..8d55f10 100644 --- a/geometry/quad.cpp +++ b/geometry/quad.cpp @@ -158,17 +158,28 @@ Coin Quad::maxAngleCorner() const { } Coin Quad::concaveCorner() { - Vertex nne = Triangle(c[NW], c[NE], c[SE]).normal(); - Vertex nse = Triangle(c[NE], c[SE], c[SW]).normal(); - Vertex nsw = Triangle(c[SE], c[SW], c[NW]).normal(); - Vertex nnw = Triangle(c[SW], c[NW], c[NE]).normal(); + Vertex nne = Triangle(c[NW], c[NE], c[SE]).normalizedNormal(); + Vertex nse = Triangle(c[NE], c[SE], c[SW]).normalizedNormal(); + Vertex nsw = Triangle(c[SE], c[SW], c[NW]).normalizedNormal(); + Vertex nnw = Triangle(c[SW], c[NW], c[NE]).normalizedNormal(); - nne = nne; - nnw = nnw; - nse = nse; - nsw = nsw; + float dne1 = (nnw - nne).norm(); + float dne2 = (nse - nne).norm(); + float dse1 = (nne - nse).norm(); + float dse2 = (nsw - nse).norm(); + float dsw1 = (nse - nsw).norm(); + float dsw2 = (nnw - nsw).norm(); + //float dnw1 = (nsw - nnw).norm(); + //float dnw2 = (nne - nnw).norm(); - return NW; + if(dne1 >= 1.5 && dne2 >= 1.5) + return NE; + else if(dse1 >= 1.5 && dse2 >= 1.5) + return SE; + else if(dsw1 >= 1.5 && dsw2 >= 1.5) + return SW; + else + return NW; } Quad operator+(const Quad& q, const Vertex& v) { From 16841b35b15c2ffede21bf0285c4aa20f77d5006 Mon Sep 17 00:00:00 2001 From: Yoann Date: Thu, 12 Jan 2012 21:14:26 +0100 Subject: [PATCH 3/4] Fonction concaveCoroner() et isConcave() OK. --- geometry/quad.cpp | 17 +++++++++++++++++ geometry/quad.hh | 1 + 2 files changed, 18 insertions(+) diff --git a/geometry/quad.cpp b/geometry/quad.cpp index 8d55f10..8f886d9 100644 --- a/geometry/quad.cpp +++ b/geometry/quad.cpp @@ -182,6 +182,23 @@ Coin Quad::concaveCorner() { return NW; } +bool Quad::isConcave() { + Vertex nne = Triangle(c[NW], c[NE], c[SE]).normalizedNormal(); + Vertex nse = Triangle(c[NE], c[SE], c[SW]).normalizedNormal(); + Vertex nsw = Triangle(c[SE], c[SW], c[NW]).normalizedNormal(); + Vertex nnw = Triangle(c[SW], c[NW], c[NE]).normalizedNormal(); + + float dne1 = (nnw - nne).norm(); + float dse1 = (nne - nse).norm(); + float dsw1 = (nse - nsw).norm(); + float dnw1 = (nsw - nnw).norm(); + + if(dne1 >= 1.5 || dse1 >= 1.5 || dsw1 >= 1.5 || dnw1 >= 1.5) + return true; + + return false; +} + Quad operator+(const Quad& q, const Vertex& v) { return Quad(q[NE] + v, q[SE] + v, q[SW] + v, q[NW] + v); } diff --git a/geometry/quad.hh b/geometry/quad.hh index 8a034ee..f0fd155 100644 --- a/geometry/quad.hh +++ b/geometry/quad.hh @@ -38,6 +38,7 @@ class Quad { Cardinal minLengthSide() const; Cardinal maxLengthSide() const; Coin concaveCorner(); + bool isConcave(); float angle(Coin corner) const; float minAngle() const; float maxAngle() const; From b38b9bde55d19981bbf308e9183483d372ec97f2 Mon Sep 17 00:00:00 2001 From: Yoann Date: Thu, 12 Jan 2012 21:30:21 +0100 Subject: [PATCH 4/4] =?UTF-8?q?D=C3=A9coupage=20des=20quartier=20dits=20"c?= =?UTF-8?q?oncaves"=20en=20deux=20quartier=20triangulaires.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rules/architecture/quartier.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rules/architecture/quartier.cpp b/rules/architecture/quartier.cpp index eb65086..26333a1 100644 --- a/rules/architecture/quartier.cpp +++ b/rules/architecture/quartier.cpp @@ -10,7 +10,8 @@ void QuartierQuad_::getBoundingBoxPoints() { bool QuartierQuad_::split() { bool small = c.minLength() < 3500; - bool isConcave = c.maxAngle() > Angle::d2r(160); + bool isConcave = c.isConcave(); + //bool isConcave = c.maxAngle() > Angle::d2r(160); bool anglesOk = c.minAngle() > Angle::d2r(90-40) && c.maxAngle() < Angle::d2r(90+40); bool tooWideX = c.minLengthEW() * 2 < c.maxLengthNS(); // trop allongé (côté E ou W deux fois plus petit que le côté N ou S). bool tooWideY = c.minLengthNS() * 2 < c.maxLengthEW(); // trop allongé (côté N ou S deux fois plus petit que le côté E ou W). @@ -39,7 +40,12 @@ void QuartierQuad_::triangulation() { } void QuartierQuad_::concave() { - // TODO + // TODO À vérifier. + Triangle t1(c[c.concaveCorner()], c[c.concaveCorner()+1], c[c.concaveCorner()+2]); + Triangle t2(c[c.concaveCorner()+2], c[c.concaveCorner()+3], c[c.concaveCorner()]); + + addChild(new QuartierTri_(t1)); + addChild(new QuartierTri_(t2)); } void QuartierQuad_::angleCote() {