From 013857b8febca68b3e42c1b8e4d7c9b9de768984 Mon Sep 17 00:00:00 2001 From: cignoni Date: Mon, 25 Mar 2013 13:12:22 +0000 Subject: [PATCH] Refactored classes to dump a set of outlines onto a png or a svg. Cleared naming and parameters. At least partially... --- wrap/qt/PolyToQImage.cpp | 211 ++++++++++++++++++++------------------- wrap/qt/PolyToQImage.h | 138 ++++++++++++------------- 2 files changed, 178 insertions(+), 171 deletions(-) diff --git a/wrap/qt/PolyToQImage.cpp b/wrap/qt/PolyToQImage.cpp index 45485e6d..fa49cd17 100644 --- a/wrap/qt/PolyToQImage.cpp +++ b/wrap/qt/PolyToQImage.cpp @@ -5,42 +5,47 @@ using namespace vcg; using namespace std; -void PolyDumper::rectSetToPolySet(vector< Box2f > &rectVec, vector< vector > &polyVec) +void PolyDumper::rectSetToOutline2Vec(vector< Box2f > &rectVec, vector< vector > &outline2Vec) { - polyVec.clear(); + outline2Vec.clear(); for(size_t i=0;i &rectVec, vector &trVec, vector &indVec, - int ind, vector< vector > &polyVec, vector &trPolyVec) +void PolyDumper::multiRectSetToSingleOutline2Vec(vector< Box2f > &rectVec, + vector &trVec, vector &indVec, + int ind, vector< vector > &outline2Vec, + vector &trOutline2Vec) { - polyVec.clear(); - trPolyVec.clear(); + outline2Vec.clear(); + trOutline2Vec.clear(); for(size_t i=0;i > &multiPolyVec, std::vector &multiTrVec, std::vector &indVec, - int ind, std::vector< std::vector > &singlePolyVec, std::vector &singleTrVec) +void PolyDumper::multiOutline2VecToSingleOutline2Vec(std::vector< std::vector > &multiPolyVec, + std::vector &multiTrVec, + std::vector &indVec, int ind, + std::vector< std::vector > &singlePolyVec, + std::vector &singleTrVec) { singlePolyVec.clear(); singleTrVec.clear(); @@ -55,7 +60,7 @@ void PolyDumper::multiPolySetToSinglePolySet(std::vector< std::vector > } -void PolyDumper::dumpPolySetSVG(const char * imageName, vector< vector > &polyVec, vector &trVec, PolyDumperParam &pp) +void PolyDumper::dumpOutline2VecSVG(const char * imageName, vector< vector > &polyVec, vector &trVec, PolyDumper::Param &pp) { vector< vector< vector > > polyVecVec(polyVec.size()); for(size_t i=0;i polyVecVec[i].resize(1); polyVecVec[i][0]=polyVec[i]; } - dumpPolySetSVG(imageName,polyVecVec,trVec,pp); + dumpOutline2VecSVG(imageName,polyVecVec,trVec,pp); } -void PolyDumper::dumpPolySetPNG(const char * imageName, vector< vector > &polyVec, vector &trVec, PolyDumperParam &pp) +void PolyDumper::dumpOutline2VecPNG(const char * imageName, vector< vector > &polyVec, vector &trVec, PolyDumper::Param &pp) { vector< vector< vector > > polyVecVec(polyVec.size()); for(size_t i=0;i polyVecVec[i].resize(1); polyVecVec[i][0]=polyVec[i]; } - dumpPolySetPNG(imageName,polyVecVec,trVec,pp); + dumpOutline2VecPNG(imageName,polyVecVec,trVec,pp); } -void PolyDumper::dumpPolySetPNG(const char * imageName, vector< vector< vector > > &polyVecVec, vector &trVec, PolyDumperParam &pp) +void PolyDumper::dumpOutline2VecPNG(const char * imageName, vector< vector< vector > > &polyVecVec, vector &trVec, PolyDumper::Param &pp) +{ + vector labelVec; + dumpOutline2VecPNG(imageName,polyVecVec,trVec,labelVec,pp); +} + +void PolyDumper::dumpOutline2VecSVG(const char * imageName, vector< vector< vector > > &polyVecVec, vector &trVec, PolyDumper::Param &pp) { vector labelVec(polyVecVec.size()); - dumpPolySetPNG(imageName,polyVecVec,trVec,labelVec,pp); + dumpOutline2VecSVG(imageName,polyVecVec,trVec,labelVec,pp); } -void PolyDumper::dumpPolySetSVG(const char * imageName, vector< vector< vector > > &polyVecVec, vector &trVec, PolyDumperParam &pp) -{ - vector labelVec(polyVecVec.size()); - dumpPolySetSVG(imageName,polyVecVec,trVec,labelVec,pp); -} - -///this class draw a black mask fora given polygon, cenetered and scaled to fit with +///this class draw a black mask fora given polygon, cenetered and scaled to fit with ///the image size, it return the transformation to tranform back the polygon to 2D space void PolyDumper::DrawPolygonMask(const vector< vector > &polyVec, QImage &img, @@ -199,7 +204,7 @@ vcg::Point2f PolyDumper::GetIncenter(const vector< vector > &polyVec, { ///INITIALIZE THE IMAGE QImage img(resolution,resolution,QImage::Format_RGB32); - img.fill(vcg::ColorConverter::ToQColor(vcg::Color4b(255,255,255,255)).rgb()); + img.fill(vcg::ColorConverter::ToQColor(vcg::Color4b::White)); Similarity2f tra0; ///DRAW THE MASK DrawPolygonMask(polyVec,img,tra0,tra1); @@ -214,7 +219,7 @@ vcg::Point2f PolyDumper::GetIncenter(const vector< vector > &polyVec, for (int x=0;x > &polyVec, ///write a polygon on a PNG file, format of the polygon is vector of vector of contours...nested contours are holes -///takes the name of the image in input, the set of polygons, the set of per polygons transformation, +///takes the name of the image in input, the set of polygons, the set of per polygons transformation, ///the label to be written and the global parameter for drawing style -void PolyDumper::dumpPolySetPNG(const char * imageName, - vector< vector< vector > > &polyVecVec, - vector &trVec, - vector &labelVec, - PolyDumperParam &pp) +void PolyDumper::dumpOutline2VecPNG(const char * imageName, + vector< vector< vector > > &polyVecVec, + vector &trVec, + vector &labelVec, + Param &pp) { - ///SET THE FONT - assert(polyVecVec.size() == trVec.size()); - int fontSize=ceil(std::max(pp.width,pp.height)/100.0); - QFont qf("courier",fontSize); + ///SET THE FONT + assert(polyVecVec.size() == trVec.size()); + int fontSize=ceil(std::max(pp.width,pp.height)/100.0); + QFont qf("courier",fontSize); - ///SET THE DRAWING SIZE - QImage img(pp.width,pp.height,QImage::Format_RGB32); - img.fill(vcg::ColorConverter::ToQColor( pp.backgroundColor).rgb()); + ///SET THE DRAWING SIZE + QImage img(pp.width,pp.height,QImage::Format_RGB32); + img.fill(vcg::ColorConverter::ToQColor( pp.backgroundColor).rgb()); - ///SETUP OF DRAWING PROCEDURE - QPainter painter; - painter.begin(&img); - QBrush bb; - if (pp.fill) - bb.setStyle(Qt::SolidPattern); - QPen qp; - qp.setWidthF(0); + ///SETUP OF DRAWING PROCEDURE + QPainter painter; + painter.begin(&img); + QBrush bb; + if (pp.fill) + bb.setStyle(Qt::SolidPattern); + QPen qp; + qp.setWidthF(0); - for(size_t i=0;i ppQ; - for(size_t j=0;j ppQ; + for(size_t j=0;j > > &polyVecVec, - vector &trVec, +void PolyDumper::dumpOutline2VecSVG(const char * imageName, + vector< vector< vector > > &polyVecVec, + vector &trVec, vector< vector< string> > &labelVecVec, vector > &labelPosVecVec, vector >&labelRadVecVec, - PolyDumperParam &pp) + PolyDumper::Param &pp) { assert(polyVecVec.size() == trVec.size()); @@ -425,11 +430,11 @@ void PolyDumper::dumpPolySetSVG(const char * imageName, painter.end(); } -void PolyDumper::dumpPolySetSVG(const char * imageName, +void PolyDumper::dumpOutline2VecSVG(const char * imageName, vector< vector< vector > > &polyVecVec, vector &trVec, vector< string > &labelVec, - PolyDumperParam &pp) + PolyDumper::Param &pp) { vector< vector< string> > labelVecVec(labelVec.size()); vector< vector > labelPosVec; @@ -438,6 +443,6 @@ void PolyDumper::dumpPolySetSVG(const char * imageName, { labelVecVec[i].push_back(labelVec[i]); } - dumpPolySetSVG(imageName,polyVecVec,trVec,labelVecVec,labelPosVec,labelRadVec,pp); + dumpOutline2VecSVG(imageName,polyVecVec,trVec,labelVecVec,labelPosVec,labelRadVec,pp); } diff --git a/wrap/qt/PolyToQImage.h b/wrap/qt/PolyToQImage.h index bdf26797..a8d2da1b 100644 --- a/wrap/qt/PolyToQImage.h +++ b/wrap/qt/PolyToQImage.h @@ -8,101 +8,103 @@ #include #include -///this class is used to pass global +///this class is used to pass global ///parameters to the polygonal dumper -class PolyDumperParam -{ -public: - /// the backgrround color - vcg::Color4b backgroundColor; - /// true if the polygons must be filled with color - bool fill; - /// true if the filling color is random - bool randomColor; - /// the filling color of polygons, used only if randomColor==false - vcg::Color4b FillColor; - /// The size of the font. If zero (default) it is automatically chosen. - int fontSize; - /// dimension of the image (in PNG are pixels, while in SVG is the workspace in points) - int width; - int height; - - /// DPI resolution, used only for SVG - int dpi; - - ///Handy function for setting the size of the drawing - void SetSVGDimInMm(float widthMM,float heightMM,float _dpi=72) - { - dpi=_dpi; - float widthInch = float(widthMM / 25.4f); - float heightInch = float(heightMM / 25.4f); - width = widthInch * _dpi; - height = heightInch * _dpi; - } - - ///default constructor - PolyDumperParam() - { - backgroundColor = vcg::Color4b::Gray; - width=1024; - height=1024; - dpi=72; - fontSize=0; - fill=false; - randomColor=true; - FillColor=vcg::Color4b(0,0,0,255); - } -}; ///this class is used to draw polygons on an image could be vectorial or not class PolyDumper { - ///this class draw a black mask fora given polygon, cenetered and scaled to fit with +public: + class Param + { + public: + /// the backgrround color + vcg::Color4b backgroundColor; + /// true if the polygons must be filled with color + bool fill; + /// true if the filling color is random + bool randomColor; + /// the filling color of polygons, used only if randomColor==false + vcg::Color4b FillColor; + /// The size of the font. If zero (default) it is automatically chosen. + int fontSize; + /// dimension of the image (in PNG are pixels, while in SVG is the workspace in points) + int width; + int height; + + /// DPI resolution, used only for SVG + int dpi; + + ///Handy function for setting the size of the drawing + void SetSVGDimInMm(float widthMM,float heightMM,float _dpi=72) + { + dpi=_dpi; + float widthInch = float(widthMM / 25.4f); + float heightInch = float(heightMM / 25.4f); + width = widthInch * _dpi; + height = heightInch * _dpi; + } + + ///default constructor + Param() + { + backgroundColor = vcg::Color4b::Gray; + width=1024; + height=1024; + dpi=72; + fontSize=0; + fill=false; + randomColor=true; + FillColor=vcg::Color4b(0,0,0,255); + } + }; +private: + ///this class draw a black mask fora given polygon, cenetered and scaled to fit with ///the image size, it return the transformation to tranform back the polygon to 2D space static void DrawPolygonMask(const std::vector< std::vector > &polyVec,QImage &img, vcg::Similarity2f &ret,const vcg::Similarity2f &trans); - + ///return the max radius of a point inside a polygon ,given the mask image ///actually it evaluate the maximum bounding box static int getMaxMaskRadius(int x,int y,QImage &img); - + ///return the point inside the polygon with the bigger distance to the border, ///this is used to write labels within the polygon, it handle polygons with holes too static vcg::Point2f GetIncenter(const std::vector< std::vector > &polyVec, const vcg::Similarity2f &tra1,int &radius,int resolution=100); public: - static void rectSetToPolySet(std::vector< vcg::Box2f > &rectVec, std::vector< std::vector > &polyVec); - static void multiRectSetToSinglePolySet(std::vector< vcg::Box2f > &rectVec, std::vector &trVec, std::vector &indVec, + static void rectSetToOutline2Vec(std::vector< vcg::Box2f > &rectVec, std::vector< std::vector > &polyVec); + static void multiRectSetToSingleOutline2Vec(std::vector< vcg::Box2f > &rectVec, std::vector &trVec, std::vector &indVec, int ind, std::vector< std::vector > &polyVec, std::vector &trPolyVec); - static void multiPolySetToSinglePolySet(std::vector< std::vector< vcg::Point2f> > &multipolyVec, std::vector< vcg::Similarity2f> &trVec, std::vector &indVec, + static void multiOutline2VecToSingleOutline2Vec(std::vector< std::vector< vcg::Point2f> > &multipolyVec, std::vector< vcg::Similarity2f> &trVec, std::vector &indVec, int ind, std::vector< std::vector< vcg::Point2f> > &polyVec, std::vector< vcg::Similarity2f> &trPolyVec); ///write a polygon on a PNG file, format of the polygon is vector of vector of contours...nested contours are holes - ///takes the name of the image in input, the set of polygons, the set of per polygons transformation, + ///takes the name of the image in input, the set of polygons, the set of per polygons transformation, ///the label to be written and the global parameter for drawing style - static void dumpPolySetPNG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, - std::vector &trVec, std::vector > &labelVecVec, PolyDumperParam &pp); + static void dumpOutline2VecPNG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, + std::vector &trVec, std::vector > &labelVecVec, Param &pp); //write a polygon on a SVG file, format of the polygon is vector of vector of contours...nested contours are holes - ///takes the name of the image in input, the set of polygons, the set of per polygons transformation, + ///takes the name of the image in input, the set of polygons, the set of per polygons transformation, ///the label to be written and the global parameter for drawing style - static void dumpPolySetSVG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, + static void dumpOutline2VecSVG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, std::vector &trVec, std::vector< std::vector > &labelVecVec, - std::vector > &labelPosVec, std::vector > &labelRadVec, PolyDumperParam &pp); + std::vector > &labelPosVec, std::vector > &labelRadVec, Param &pp); - static void dumpPolySetPNG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, - std::vector &trVec, std::vector &labelVec, PolyDumperParam &pp); - static void dumpPolySetSVG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, - std::vector &trVec, std::vector &labelVec, PolyDumperParam &pp); + static void dumpOutline2VecPNG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, + std::vector &trVec, std::vector &labelVec, Param &pp); + static void dumpOutline2VecSVG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, + std::vector &trVec, std::vector &labelVec, Param &pp); - static void dumpPolySetPNG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, - std::vector &trVec, PolyDumperParam &pp); - static void dumpPolySetSVG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, - std::vector &trVec, PolyDumperParam &pp); + static void dumpOutline2VecPNG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, + std::vector &trVec, Param &pp); + static void dumpOutline2VecSVG(const char * imageName, std::vector< std::vector< std::vector > > &polyVecVec, + std::vector &trVec, Param &pp); - static void dumpPolySetPNG(const char * imageName, std::vector< std::vector > &polyVecVec, - std::vector &trVec, PolyDumperParam &pp); - static void dumpPolySetSVG(const char * imageName, std::vector< std::vector > &polyVecVec, - std::vector &trVec, PolyDumperParam &pp); + static void dumpOutline2VecPNG(const char * imageName, std::vector< std::vector > &polyVecVec, + std::vector &trVec, Param &pp); + static void dumpOutline2VecSVG(const char * imageName, std::vector< std::vector > &polyVecVec, + std::vector &trVec, Param &pp); }; #endif // POLYTOQIMAGE_H