00001
00029 #ifndef INC_RVC_OPVECTORGRIDGENERATION_H
00030 #define INC_RVC_OPVECTORGRIDGENERATION_H
00031
00032 #ifndef INC_RVC_VECTTOOL_H
00033 #include <rvc/vecttool.h>
00034 #endif
00035
00036 #ifndef INC_MI32_UNITCONV_H
00037 #include <mi32/unitconv.h>
00038 #endif
00039
00040
00041 #ifndef GENERATING_DOXYGEN_OUTPUT
00042 class UNSIGNEDSET;
00043 class QUADTREE;
00044 struct GRIDENUMDEF2;
00045 #endif
00046
00047
00048 namespace RVC {
00049 namespace OP {
00050
00051 class VECTOR_GRID_GENERATION {
00052 public:
00053
00054 enum MODE {
00055 MODE_None = 0,
00056 MODE_Triangle,
00057 MODE_Square,
00058 MODE_Rectangle,
00059 MODE_Hexagon,
00060 MODE_Parallel,
00061 MODE_RandomRectangle,
00062 MODE_Count
00063 };
00064
00065 enum ENUMERATION {
00066 ENUMERATION_SymbolicColumn = 0,
00067 ENUMERATION_SymbolicRow,
00068 ENUMERATION_SymbolicColumnRow,
00069 ENUMERATION_NumericRow,
00070 ENUMERATION_NumericColumn,
00071 ENUMERATION_NumericRowColumn,
00072 ENUMERATION_NumericSequential,
00073 ENUMERATION_NumericSerpentine,
00074 ENUMERATION_Count
00075 };
00076
00077 class GRID_PARMS {
00078 public:
00079
00080 GRID_PARMS ();
00081 GRID_PARMS (VECTOR_GRID_GENERATION::MODE mode);
00082 ~GRID_PARMS () { }
00083
00084 void CopyOrientParmsFrom (
00085 const VECTOR_GRID_GENERATION::GRID_PARMS& OrientParms
00086 );
00087
00088 bool DoBuildTables (
00089 ) { return (m_BuildTables); }
00090
00091 VECTOR_GRID_GENERATION::MODE GetMode () const
00092 { return (m_mode); }
00093
00094 double GetOrientAngle (
00095 ) { return m_oangle; }
00096
00097 DPOINT2D& GetOrientEnd (
00098 ) { return m_oend; }
00099
00100 DPOINT2D& GetOrientRadius (
00101 ) { return m_oradius; }
00102
00103 DRECT2D& GetOrientRect (
00104 ) { return m_orect; }
00105
00106 DPOINT2D& GetOrientStart ()
00107 { return m_ostart; }
00108
00109 void SetBuildTables (
00110 bool build
00111 ) { m_BuildTables = build; }
00112
00113 void SetOrientAngle (
00114 double angle
00115 ) { m_oangle = angle; }
00116
00117 void SetOrientEnd (
00118 DPOINT2D& end
00119 ) { m_oend = end; }
00120
00121 void SetOrientStart (
00122 DPOINT2D& start
00123 ) { m_ostart = start; }
00124
00125 private:
00126 #ifndef GENERATING_DOXYGEN_OUTPUT
00127 VECTOR_GRID_GENERATION::MODE m_mode;
00128 DPOINT2D m_ostart;
00129 DPOINT2D m_oend;
00130 DPOINT2D m_oradius;
00131 double m_oangle;
00132 DRECT2D m_orect;
00133 bool m_BuildTables;
00134 #endif
00135 };
00136
00137 class TRIANGLE_PARMS : public GRID_PARMS {
00138 public:
00139 TRIANGLE_PARMS ();
00140
00141 double GetSideConv (
00142 ) { return (ConvertUnit(m_side, &m_ucSide)); }
00143
00144 double m_side;
00145 UNITCONV m_ucSide;
00146 };
00147
00148 class RECTANGLE_PARMS : public GRID_PARMS {
00149 public:
00150 RECTANGLE_PARMS ();
00151
00152 double GetWidthConv (
00153 ) { return (ConvertUnit(m_width, &m_ucWidth)); }
00154
00155 double GetHeightConv (
00156 ) { return (ConvertUnit(m_height, &m_ucHeight)); }
00157
00158 double m_height;
00159 UNITCONV m_ucHeight;
00160 double m_width;
00161 UNITCONV m_ucWidth;
00162 };
00163
00164 class HEXAGON_PARMS : public GRID_PARMS {
00165 public:
00166 HEXAGON_PARMS ();
00167
00168 double GetSideConv (
00169 ) { return (ConvertUnit(m_side, &m_ucSide)); }
00170
00171 double m_side;
00172 UNITCONV m_ucSide;
00173 };
00174
00175 class RANDOMRECTANGLE_PARMS : public GRID_PARMS {
00176 public:
00177 RANDOMRECTANGLE_PARMS ();
00178
00179 double GetMinWidthConv (
00180 ) { return (ConvertUnit(m_minWidth, &m_ucLength)); }
00181
00182 double GetMinHeightConv (
00183 ) { return (ConvertUnit(m_minHeight, &m_ucLength)); }
00184
00185 double GetMaxWidthConv (
00186 ) { return (ConvertUnit(m_maxWidth, &m_ucLength)); }
00187
00188 double GetMaxHeightConv (
00189 ) { return (ConvertUnit(m_maxHeight, &m_ucLength)); }
00190
00191 double m_minWidth;
00192 double m_maxWidth;
00193 double m_minHeight;
00194 double m_maxHeight;
00195 UNITCONV m_ucLength;
00196 };
00197
00198 class PARALLEL_PARMS : public GRID_PARMS {
00199 public:
00200 PARALLEL_PARMS ();
00201
00202 double GetWidthConv (
00203 ) { return (ConvertUnit(m_width, &m_ucWidth)); }
00204
00205 bool IgnoreOrigin (
00206 ) { return (m_ignoreO); }
00207
00208 void SetIgnoreOrigin (
00209 bool ignoreO
00210 ) {
00211 m_ignoreO = ignoreO;
00212 return;
00213 };
00214
00215 double m_width;
00216 UNITCONV m_ucWidth;
00217 bool m_ignoreO;
00218 };
00219
00221 VECTOR_GRID_GENERATION ();
00222
00224 ~VECTOR_GRID_GENERATION ();
00225
00226 ERRVALUE ComputeLRWidth (double *LWidth, double *RWidth, GRID_PARMS* GridParms);
00227
00228 ERRVALUE MakeQTreeOfBoundary (RVC::VECTOR& VectObj, const UNSIGNEDSET *pSelectedPolygonSet = 0);
00229
00230 ERRVALUE Process (
00231 RVC::VECTOR& VectObj,
00232 RVC::OBJITEM& GridObj,
00233 GRID_PARMS *GridParms,
00234 const UNSIGNEDSET *pSelectedPolygonSet = 0
00235 );
00236
00237 ERRVALUE SetGridScale ();
00238
00239 private:
00240 #ifndef GENERATING_DOXYGEN_OUTPUT
00241
00242 struct GRIDSHAPE {
00243 DPOINT2D origin;
00244 DPOINT2D vect1;
00245 INT32 num1;
00246 INT32 enum1;
00247 DPOINT2D vect2;
00248 INT32 num2;
00249 INT32 enum2;
00250 INT32 numSegm;
00251 INT32 ia[5];
00252 INT32 ja[5];
00253 int s[5];
00254 int asign;
00255 DPOINT2D va;
00256 INT32 im;
00257 INT32 jm;
00258 INT32 numPoints;
00259 DOUBLE_ARRAY<DPOINT2D> GPoints;
00260 DOUBLE_ARRAY<DPOINT2D> APoints;
00261 double minv1;
00262 double maxv1;
00263 double minv2;
00264 double maxv2;
00265 DOUBLE_ARRAY<double> randomv1;
00266 DOUBLE_ARRAY<double> randomv2;
00267 DRECT2D rect;
00268 double tol;
00269 QUADTREE* qth;
00270 INT32 numseg;
00271 INT32 maxseg;
00272 UINT8 *flagseg;
00273
00274 ERRVALUE GetSegment (INT32 num, DPOINT2D *vect);
00275 };
00276
00277 class EXTSTR {
00278 public:
00279
00280 EXTSTR ();
00281 ~EXTSTR ();
00282
00283 ERRVALUE ComputeConvexIn ();
00284 ERRVALUE GetRadiusIn (const DPOINT2D& Point, double theta, double beta, double *Radius);
00285 ERRVALUE InsertTo (const DPOINT2D& Point);
00286
00287 private:
00288 int m_InsFlag;
00289 DPOINT2D m_GPoint;
00290 DOUBLE_ARRAY<DPOINT2D> m_Points;
00291 };
00292
00293 struct TOPOLINE {
00294 INT32 num;
00295 INT32 left;
00296 INT32 right;
00297 UINT8 flag;
00298 };
00299
00300 RVC::VECTOR m_BorderObj;
00301 RVC::VECTOR m_GridObj;
00302 QUADTREE *m_qth;
00303 UINT8 *m_flagseg;
00304 GRID_PARMS* m_GridParms;
00305 double m_xscale;
00306 double m_yscale;
00307 GRIDSHAPE m_shape;
00308 INT32 m_numlines;
00309 SIMPLE_ARRAY<TOPOLINE> m_topoline;
00310 INT32 m_numpolys;
00311 INT32 m_numseg;
00312 INT32 m_numselseg;
00313 EXTSTR *m_pExtStr;
00314 bool m_gefields[ENUMERATION_Count];
00315
00316 ERRVALUE BuildGridCellDataTable ();
00317 ERRVALUE CopyQTreeOfBoundary ();
00318 ERRVALUE DivideSegment (DPOINT2D *Point, DRECT2D *ext, DOUBLE_ARRAY<DPOINT2D>&Points, INT32 *count);
00319 void FreeGridShapePoints ();
00320 void FreeGridShapeQTree ();
00321 void FreeQtreeOfBoundary ();
00322 ERRVALUE GenerateExtStr (const UNSIGNEDSET *pSelectedPolygonSet);
00323 ERRVALUE GenerateIntersectionPoints (DPOINT2D *Point, DPOINT2D **Points);
00324 ERRVALUE GenerateRowColumnRecord (DPOINT2D Point, INT32 *row, INT32 *col, GRIDENUMDEF2 *genum);
00325 void GenerateRowRecord (INT32 r, GRIDENUMDEF2 *genum);
00326 UINT8 GetFlagSegIndexed (INT32 index) const
00327 { return m_flagseg[index]; }
00328 void GetRowColumnCoor (DPOINT2D Point, INT32 *row, double *col);
00329 QUADTREE* GetQuadTreeHandle () const
00330 { return m_qth; }
00331 double GetXScale () const
00332 { return m_xscale; }
00333 double GetYScale () const
00334 { return m_yscale; }
00335 ERRVALUE InsideArea (double x, double y);
00336 ERRVALUE MakeGrid ();
00337 ERRVALUE MakeGridPoints ();
00338 ERRVALUE MakeGridShape ();
00339 ERRVALUE MakeGridVector (RVC::OBJITEM& GridObjItem);
00340 void MakeScaledVector (DPOINT2D *vect);
00341 ERRVALUE Segmentation (DPOINT2D *Point, DRECT2D *rect, INT32 *count);
00342 ERRVALUE SnapGridPointsToBoundary ();
00343 ERRVALUE WriteBoundary (INT32 *count);
00344 ERRVALUE WriteSegment (INT32 count, DPOINT2D *vect);
00345
00346 #endif // GENERATING_DOXYGEN_OUTPUT
00347 };
00348
00349 }
00350 }
00351
00352
00353 #endif // INC_RVC_OPVECTORGRIDGENERATION_H