1 #ifndef FILE_SOLID
2 #define FILE_SOLID
3 
4 /**************************************************************************/
5 /* File:   solid.hh                                                       */
6 /* Author: Joachim Schoeberl                                              */
7 /* Date:   1. Dez. 95                                                     */
8 /**************************************************************************/
9 
10 /*
11 
12   Constructive Solid Model (csg)
13 
14 */
15 
16 
17 
18 
19 class Solid;
20 
21 class SolidIterator
22 {
23 public:
SolidIterator()24   SolidIterator () { ; }
~SolidIterator()25   virtual ~SolidIterator () { ; }
26   virtual void Do (Solid * sol) = 0;
27 };
28 
29 
30 
31 class Solid
32 {
33 public:
34 
35   typedef enum optyp1 { TERM, TERM_REF, SECTION, UNION, SUB, ROOT, DUMMY } optyp;
36 
37 private:
38   char * name;
39   Primitive * prim;
40   Solid * s1, * s2;
41 
42   optyp op;
43   bool visited;
44   double maxh;
45 
46   // static int cntnames;
47 
48 public:
49   Solid (Primitive * aprim);
50   Solid (optyp aop, Solid * as1, Solid * as2 = NULL);
51   ~Solid ();
52 
Name() const53   const char * Name () const { return name; }
54   void SetName (const char * aname);
55 
56   Solid * Copy (class CSGeometry & geom) const;
57   void Transform (Transformation<3> & trans);
58 
59 
60   void IterateSolid (SolidIterator & it, bool only_once = 0);
61 
62 
63   void Boundaries (const Point<3> & p, ARRAY<int> & bounds) const;
64   int NumPrimitives () const;
65   void GetSurfaceIndices (ARRAY<int> & surfind) const;
66   void GetSurfaceIndices (IndexSet & iset) const;
67 
68   void GetTangentialSurfaceIndices (const Point<3> & p, ARRAY<int> & surfids, double eps) const;
69   void GetTangentialSurfaceIndices2 (const Point<3> & p, const Vec<3> & v, ARRAY<int> & surfids, double eps) const;
70   void GetTangentialSurfaceIndices3 (const Point<3> & p, const Vec<3> & v, const Vec<3> & v2, ARRAY<int> & surfids, double eps) const;
71 
72 
GetPrimitive()73   Primitive * GetPrimitive ()
74     { return (op == TERM || op == TERM_REF) ? prim : NULL; }
GetPrimitive() const75   const Primitive * GetPrimitive () const
76     { return (op == TERM || op == TERM_REF) ? prim : NULL; }
77 
S1()78   Solid * S1() { return s1; }
S2()79   Solid * S2() { return s2; }
80 
81   // geometric tests
82 
83   bool IsIn (const Point<3> & p, double eps = 1e-6) const;
84   bool IsStrictIn (const Point<3> & p, double eps = 1e-6) const;
85   bool VectorIn (const Point<3> & p, const Vec<3> & v, double eps = 1e-6) const;
86   bool VectorStrictIn (const Point<3> & p, const Vec<3> & v, double eps = 1e-6) const;
87 
88   bool VectorIn2 (const Point<3> & p, const Vec<3> & v1, const Vec<3> & v2,
89 		  double eps) const;
90   bool VectorIn2Rec (const Point<3> & p, const Vec<3> & v1, const Vec<3> & v2,
91 		     double eps) const;
92 
93 
94   /// compute localization in point p
95   void TangentialSolid (const Point<3> & p, Solid *& tansol, ARRAY<int> & surfids, double eps) const;
96 
97   /// compute localization in point p tangential to vector t
98   void TangentialSolid2 (const Point<3> & p, const Vec<3> & t,
99 			 Solid *& tansol, ARRAY<int> & surfids, double eps) const;
100 
101   /** compute localization in point p, with second order approximation to edge
102       p + s t + s*s/2 t2 **/
103   void TangentialSolid3 (const Point<3> & p, const Vec<3> & t, const Vec<3> & t2,
104 			 Solid *& tansol, ARRAY<int> & surfids, double eps) const;
105 
106 
107 
108   /** tangential solid, which follows the edge
109       p + s t + s*s/2 t2
110       with second order, and the neighbouring face
111       p + s t + s*s/2 t2 + r m
112       with first order
113   **/
114   void TangentialEdgeSolid (const Point<3> & p, const Vec<3> & t, const Vec<3> & t2,
115 			    const Vec<3> & m,
116 			    Solid *& tansol, ARRAY<int> & surfids, double eps) const;
117 
118 
119   void CalcOnePrimitiveSpecialPoints (const Box<3> & box, ARRAY<Point<3> > & pts) const;
120 
121   ///
122   int Edge (const Point<3> & p, const Vec<3> & v, double eps) const;
123   ///
124   int OnFace (const Point<3> & p, const Vec<3> & v, double eps) const;
125   ///
126   void Print (ostream & str) const;
127   ///
128   void CalcSurfaceInverse ();
129   ///
130   Solid * GetReducedSolid (const BoxSphere<3> & box) const;
131 
132 
SetMaxH(double amaxh)133   void SetMaxH (double amaxh)
134     { maxh = amaxh; }
GetMaxH() const135   double GetMaxH () const
136     { return maxh; }
137 
138   void GetSolidData (ostream & ost, int first = 1) const;
139   static Solid * CreateSolid (istream & ist, const SYMBOLTABLE<Solid*> & solids);
140 
141 
142   static BlockAllocator ball;
operator new(size_t)143   void * operator new(size_t /* s */)
144   {
145     return ball.Alloc();
146   }
147 
operator delete(void * p)148   void operator delete (void * p)
149   {
150     ball.Free (p);
151   }
152 
153 
154 protected:
155   ///
156 
157   void RecBoundaries (const Point<3> & p, ARRAY<int> & bounds,
158 		      int & in, int & strin) const;
159   ///
160   void RecTangentialSolid (const Point<3> & p, Solid *& tansol, ARRAY<int> & surfids,
161 			   int & in, int & strin, double eps) const;
162 
163   void RecTangentialSolid2 (const Point<3> & p, const Vec<3> & vec,
164 			    Solid *& tansol, ARRAY<int> & surfids,
165 			    int & in, int & strin, double eps) const;
166   ///
167   void RecTangentialSolid3 (const Point<3> & p, const Vec<3> & vec,const Vec<3> & vec2,
168 			    Solid *& tansol, ARRAY<int> & surfids,
169 			    int & in, int & strin, double eps) const;
170   ///
171   void RecTangentialEdgeSolid (const Point<3> & p, const Vec<3> & t, const Vec<3> & t2,
172 			       const Vec<3> & m,
173 			       Solid *& tansol, ARRAY<int> & surfids,
174 			       int & in, int & strin, double eps) const;
175 
176   ///
177   void RecEdge (const Point<3> & p, const Vec<3> & v,
178                 int & in, int & strin, int & faces, double eps) const;
179   ///
180   void CalcSurfaceInverseRec (int inv);
181   ///
182   Solid * RecGetReducedSolid (const BoxSphere<3> & box, INSOLID_TYPE & in) const;
183   ///
184   void RecGetSurfaceIndices (ARRAY<int> & surfind) const;
185   void RecGetTangentialSurfaceIndices (const Point<3> & p, ARRAY<int> & surfids, double eps) const;
186   void RecGetTangentialSurfaceIndices2 (const Point<3> & p, const Vec<3> & v, ARRAY<int> & surfids, double eps) const;
187   void RecGetTangentialSurfaceIndices3 (const Point<3> & p, const Vec<3> & v, const Vec<3> & v2,
188 					ARRAY<int> & surfids, double eps) const;
189   void RecGetTangentialEdgeSurfaceIndices (const Point<3> & p, const Vec<3> & v, const Vec<3> & v2, const Vec<3> & m,
190 					   ARRAY<int> & surfids, double eps) const;
191   void RecGetSurfaceIndices (IndexSet & iset) const;
192 
193   void RecCalcOnePrimitiveSpecialPoints (ARRAY<Point<3> > & pts) const;
194 
195   friend class SolidIterator;
196   friend class ClearVisitedIt;
197   friend class RemoveDummyIterator;
198   friend class CSGeometry;
199 };
200 
201 
operator <<(ostream & ost,const Solid & sol)202 inline ostream & operator<< (ostream & ost, const Solid & sol)
203 {
204   sol.Print (ost);
205   return ost;
206 }
207 
208 
209 
210 
211 
212 
213 class ReducePrimitiveIterator : public SolidIterator
214 {
215   const BoxSphere<3> & box;
216 public:
ReducePrimitiveIterator(const BoxSphere<3> & abox)217   ReducePrimitiveIterator (const BoxSphere<3> & abox)
218     : SolidIterator(), box(abox) { ; }
~ReducePrimitiveIterator()219   virtual ~ReducePrimitiveIterator () { ; }
Do(Solid * sol)220   virtual void Do (Solid * sol)
221   {
222     if (sol -> GetPrimitive())
223       sol -> GetPrimitive() -> Reduce (box);
224   }
225 };
226 
227 
228 class UnReducePrimitiveIterator : public SolidIterator
229 {
230 public:
UnReducePrimitiveIterator()231   UnReducePrimitiveIterator () { ; }
~UnReducePrimitiveIterator()232   virtual ~UnReducePrimitiveIterator () { ; }
Do(Solid * sol)233   virtual void Do (Solid * sol)
234   {
235     if (sol -> GetPrimitive())
236       sol -> GetPrimitive() -> UnReduce ();
237   }
238 };
239 
240 
241 #endif
242