00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 #ifndef __MMSFTCONTOUR__
00034 #define __MMSFTCONTOUR__
00035 
00036 #include "mmsgui/ft/mmsftvertex.h"
00037 
00038 
00039 class MMSFTContour {
00040     private:
00041         MMSFTVertexVector vertexList;
00042         MMSFTVertexVector outsetVertexList;
00043         MMSFTVertexVector frontVertexList;
00044         MMSFTVertexVector backVertexList;
00045 
00046         
00047         bool clockwise;
00048 
00049         inline void AddVertex(MMSFTVertex vertex);
00050         inline void AddOutsetVertex(MMSFTVertex vertex);
00051         inline void AddFrontVertex(MMSFTVertex vertex);
00052         inline void AddBackVertex(MMSFTVertex vertex);
00053         inline void evaluateQuadraticCurve(MMSFTVertex, MMSFTVertex, MMSFTVertex);
00054         inline void evaluateCubicCurve(MMSFTVertex, MMSFTVertex, MMSFTVertex, MMSFTVertex);
00055         inline double NormVector(const MMSFTVertex &v);
00056         inline void RotationMatrix(const MMSFTVertex &a, const MMSFTVertex &b, double *matRot, double *invRot);
00057         inline void MultMatrixVect(double *mat, MMSFTVertex &v);
00058         inline void ComputeBisec(MMSFTVertex &v);
00059         inline MMSFTVertex ComputeOutsetVertex(MMSFTVertex a, MMSFTVertex b, MMSFTVertex c);
00060 
00061     public:
00062         MMSFTContour(FT_Vector *outlineVertexList, char *outlineVertexTags, unsigned int outlineNumVertices);
00063         ~MMSFTContour();
00064 
00065         const MMSFTVertex &Vertex(unsigned int index) const { return vertexList[index]; }
00066 
00067         const MMSFTVertex &Outset(unsigned int index) const { return outsetVertexList[index]; }
00068 
00069         const MMSFTVertex &FrontVertex(unsigned int index) const {
00070             if(frontVertexList.size() == 0)
00071                 return Vertex(index);
00072             return frontVertexList[index];
00073         }
00074 
00075         const MMSFTVertex& BackVertex(unsigned int index) const {
00076             if(backVertexList.size() == 0)
00077                 return Vertex(index);
00078              return backVertexList[index];
00079         }
00080 
00081         unsigned int getVertexCount() const { return vertexList.size(); }
00082 
00083         void setParity(int parity);
00084 
00085         
00086         void buildFrontOutset(double outset);
00087         void buildBackOutset(double outset);
00088 
00089 };
00090 
00091 #endif