1 #ifndef LOCALH 2 #define LOCALH 3 4 /**************************************************************************/ 5 /* File: localh.hh */ 6 /* Author: Joachim Schoeberl */ 7 /* Date: 29. Jan. 97 */ 8 /**************************************************************************/ 9 10 11 12 13 /// box for grading 14 class GradingBox 15 { 16 /* 17 /// xmin 18 float x1[3]; 19 /// xmax 20 float x2[3]; 21 */ 22 /// xmid 23 float xmid[3]; 24 /// half edgelength 25 float h2; 26 /// 27 GradingBox * childs[8]; 28 /// 29 GradingBox * father; 30 /// 31 double hopt; 32 /// 33 struct 34 { 35 unsigned int cutboundary:1; 36 unsigned int isinner:1; 37 unsigned int oldcell:1; 38 unsigned int pinner:1; 39 } flags; 40 public: 41 /// 42 GradingBox (const double * ax1, const double * ax2); 43 /// 44 void DeleteChilds(); 45 /// 46 friend class LocalH; 47 48 49 static BlockAllocator ball; 50 void * operator new(size_t); 51 void operator delete (void *); 52 }; 53 54 55 56 /** 57 Control of 3D mesh grading 58 */ 59 class LocalH 60 { 61 /// 62 GradingBox * root; 63 /// 64 double grading; 65 /// 66 ARRAY<GradingBox*> boxes; 67 /// 68 Box3d boundingbox; 69 public: 70 /// 71 LocalH (const Point3d & pmin, const Point3d & pmax, double grading); 72 /// 73 ~LocalH(); 74 /// 75 void Delete(); 76 /// SetGrading(double agrading)77 void SetGrading (double agrading) { grading = agrading; } 78 /// 79 void SetH (const Point3d & x, double h); 80 /// 81 double GetH (const Point3d & x) const; 82 /// minimal h in box (pmin, pmax) 83 double GetMinH (const Point3d & pmin, const Point3d & pmax) const; 84 85 /// mark boxes intersecting with boundary-box CutBoundary(const Point3d & pmin,const Point3d & pmax)86 void CutBoundary (const Point3d & pmin, const Point3d & pmax) 87 { CutBoundaryRec (pmin, pmax, root); } 88 89 /// find inner boxes 90 void FindInnerBoxes ( // int (*sameside)(const Point3d & p1, const Point3d & p2), 91 class AdFront3 * adfront, 92 int (*testinner)(const Point3d & p1)); 93 94 /// clears all flags ClearFlags()95 void ClearFlags () 96 { ClearFlagsRec(root); } 97 98 /// widen refinement zone 99 void WidenRefinement (); 100 101 /// get points in inner elements 102 void GetInnerPoints (ARRAY<Point3d> & points); 103 104 /// get points in outer closure 105 void GetOuterPoints (ARRAY<Point3d> & points); 106 107 /// 108 void Convexify (); 109 /// GetNBoxes()110 int GetNBoxes () { return boxes.Size(); } GetBoundingBox() const111 const Box3d & GetBoundingBox () const 112 { return boundingbox; } 113 /// 114 void PrintMemInfo (ostream & ost) const; 115 private: 116 /// 117 double GetMinHRec (const Point3d & pmin, const Point3d & pmax, 118 const GradingBox * box) const; 119 /// 120 void CutBoundaryRec (const Point3d & pmin, const Point3d & pmax, 121 GradingBox * box); 122 123 /// 124 void FindInnerBoxesRec ( int (*inner)(const Point3d & p), 125 GradingBox * box); 126 127 /// 128 void FindInnerBoxesRec2 (GradingBox * box, 129 class AdFront3 * adfront, 130 ARRAY<Box3d> & faceboxes, 131 ARRAY<int> & finds, int nfinbox); 132 133 134 /// 135 void SetInnerBoxesRec (GradingBox * box); 136 137 /// 138 void ClearFlagsRec (GradingBox * box); 139 140 /// 141 void ConvexifyRec (GradingBox * box); 142 }; 143 144 145 #endif 146