From 18febfa792fd1bfe7f773437ab011618a38d95c9 Mon Sep 17 00:00:00 2001 From: Yoann Date: Thu, 19 Jan 2012 10:23:19 +0100 Subject: [PATCH] Ajout des fonction insetProportionnal pour Triangle et Quad, ainsi que de fonctions utilisateire dans Segment. --- geometry/quad.cpp | 13 +++++++++++++ geometry/quad.hh | 1 + geometry/segment.cpp | 8 ++++++++ geometry/segment.hh | 2 ++ geometry/triangle.cpp | 18 ++++++++++++++++++ geometry/triangle.hh | 1 + 6 files changed, 43 insertions(+) diff --git a/geometry/quad.cpp b/geometry/quad.cpp index a45bd3b..39088f5 100644 --- a/geometry/quad.cpp +++ b/geometry/quad.cpp @@ -223,6 +223,19 @@ float Quad::surface() const { return ne.surface() + sw.surface(); } +Quad Quad::insetProportionnal(float prop) { + Quad rQuad= *this; + + Vertex bc = Segment(Segment(c[NW],c[NE]).center(),Segment(c[SW],c[SE]).center()).center(); + prop = prop; + + rQuad[NW] = Segment(bc,c[NW]).at(prop); + rQuad[NE] = Segment(bc,c[NE]).at(prop); + rQuad[SE] = Segment(bc,c[SE]).at(prop); + rQuad[SW] = Segment(bc,c[SW]).at(prop); + return rQuad; +} + Quad Quad::offsetNormal(float offset) const { return ((*this) + Triangle(c[NE], c[SE], c[SW]).normal().setNorm(offset)); } diff --git a/geometry/quad.hh b/geometry/quad.hh index f0fd155..94b5993 100644 --- a/geometry/quad.hh +++ b/geometry/quad.hh @@ -48,6 +48,7 @@ class Quad { float surface() const; //void cutCornerCorner(Coin from) const; Quad makeParallelogram() const; + Quad insetProportionnal(float prop); Quad offsetNormal(float offset) const; Vertex normal() const; }; diff --git a/geometry/segment.cpp b/geometry/segment.cpp index 8531d51..5d9ee19 100644 --- a/geometry/segment.cpp +++ b/geometry/segment.cpp @@ -11,6 +11,14 @@ Segment Segment::reduce(float value) { return Segment(u,u+((v - u) / reduc)); } +Vertex Segment::at(float proportiannalDist) { + return Segment(u,u+((v-u)*proportiannalDist)).v; +} + +Vertex Segment::center() { + return at(1./2.); +} + float Segment::width() { return std::abs(u.x - v.x); } diff --git a/geometry/segment.hh b/geometry/segment.hh index 34728d6..9f7fe58 100644 --- a/geometry/segment.hh +++ b/geometry/segment.hh @@ -13,6 +13,8 @@ class Segment { float length(); float width(); float height(); + Vertex center(); + Vertex at(float); Segment reduce(float value); Vertex randomPos(int seed, int n, float a, float b); // Renvoie un vertex sur le segment [u,v], à une position entre a et b. }; diff --git a/geometry/triangle.cpp b/geometry/triangle.cpp index e18863c..d474e8b 100644 --- a/geometry/triangle.cpp +++ b/geometry/triangle.cpp @@ -99,3 +99,21 @@ Vertex Triangle::normalizedNormal() const { Triangle Triangle::offsetNormal(float offset) const { return ((*this) + this->normal().setNorm(offset)); } + +Triangle Triangle::insetProportionnal(float prop) { + Triangle rTriangle = *this; + //ibc : isobarycentre. + Vertex ibc = Segment(c[TOP],Segment(c[LEFT],c[RIGHT]).center()).at(2./3.); + prop = prop; + + rTriangle[TOP] = Segment(ibc,c[TOP]).at(prop); + rTriangle[LEFT] = Segment(ibc,c[LEFT]).at(prop); + rTriangle[RIGHT] = Segment(ibc,c[RIGHT]).at(prop); + return rTriangle; +} + + + + + + diff --git a/geometry/triangle.hh b/geometry/triangle.hh index dfe05d9..6c3c3bb 100644 --- a/geometry/triangle.hh +++ b/geometry/triangle.hh @@ -38,6 +38,7 @@ public : Vertex normal() const; Vertex normalizedNormal() const; Triangle offsetNormal(float offset) const; + Triangle insetProportionnal(float prop); }; #endif