1 
2 OLD IMPLEMENTATION, NOT USED ANYMORE!
3 
4 
5 
6 /*
7 
8 2d Spline curve for Mesh generator
9 
10 */
11 
12 #include <mystdlib.h>
13 #include <csg.hpp>
14 #include <linalg.hpp>
15 #include <meshing.hpp>
16 
17 
18 namespace netgen
19 
20 {
21   using namespace netgen;
22 
23 #include "spline2d.hpp"
24 #include "splinegeometry2.hpp"
25 
26 
27 
~SplineGeometry2d()28   SplineGeometry2d :: ~SplineGeometry2d()
29   {
30     for(int i=0; i<splines.Size(); i++)
31       {
32 	delete splines[i];
33       }
34     splines.DeleteAll();
35     geompoints.DeleteAll();
36   }
37 
CSGLoad(CSGScanner & scan)38   void SplineGeometry2d :: CSGLoad (CSGScanner & scan)
39   {
40     double x,y,hd;
41     int nump, numseg;
42 
43     //scan.ReadNext();
44 
45     scan >> nump >> ';';
46 
47     hd = 1;
48     geompoints.SetSize(nump);
49     for(int i = 0; i<nump; i++)
50       {
51 	scan >> x >> ',' >> y >> ';';
52 	geompoints[i] = GeomPoint2d(x,y,hd);
53       }
54 
55     scan >> numseg;// >> ';';
56 
57     splines.SetSize(numseg);
58 
59     int pnums,pnum1,pnum2,pnum3;
60 
61 
62     for(int i = 0; i<numseg; i++)
63       {
64 	scan >> ';' >> pnums >> ',';
65 	if (pnums == 2)
66 	  {
67 	    scan >> pnum1 >> ',' >> pnum2;// >> ';';
68 	    splines[i] = new LineSegment(geompoints[pnum1-1],
69 					 geompoints[pnum2-1]);
70 	  }
71 	else if (pnums == 3)
72 	  {
73 	    scan >> pnum1 >> ',' >> pnum2 >> ','
74 		 >> pnum3;// >> ';';
75 	    splines[i] = new SplineSegment3(geompoints[pnum1-1],
76 					    geompoints[pnum2-1],
77 					    geompoints[pnum3-1]);
78 	  }
79 	else if (pnums == 4)
80 	  {
81 	    scan >> pnum1 >> ',' >> pnum2 >> ','
82 		 >> pnum3;// >> ';';
83 	    splines[i] = new CircleSegment(geompoints[pnum1-1],
84 					   geompoints[pnum2-1],
85 					   geompoints[pnum3-1]);
86 
87 	  }
88 
89       }
90 
91 
92 
93   }
94 
95 
Load(const char * filename)96   void SplineGeometry2d :: Load (const char * filename)
97   {
98     cout << "load 2d" << endl;
99     ifstream infile;
100     int nump, numseg, leftdom, rightdom;
101     double x, y;
102     int hi1, hi2, hi3;
103     double hd;
104     char buf[50], ch;
105 
106     infile.open (filename);
107 
108     if (! infile.good() )
109       throw NgException(string ("2D Input file '") +
110 			string (filename) +
111 			string ("' not available!"));
112 
113     infile >> buf;   // file recognition
114     infile >> elto0;
115 
116     infile >> nump;
117     for (int i = 0; i < nump; i++)
118       {
119 	infile >> x >> y >> hd;
120 
121 	Flags flags;
122 
123 	ch = 'a';
124 	// infile >> ch;
125 	do {
126 	  infile.get (ch);
127 	} while (isspace(ch) && ch != '\n');
128 	while (ch == '-')
129 	  {
130 	    char flag[100];
131 	    flag[0]='-';
132 	    infile >> (flag+1);
133 	    flags.SetCommandLineFlag (flag);
134 	    ch = 'a';
135 	    do {
136 	      infile.get (ch);
137 	    } while (isspace(ch) && ch != '\n');
138 	  }
139 
140 	if (infile.good())
141 	  infile.putback (ch);
142 
143 	geompoints.Append (GeomPoint2d(x, y, hd));
144 	geompoints.Last().hpref = flags.GetDefineFlag ("hpref");
145         cout << "point " << x << ", " << y << endl;
146       }
147 
148     infile >> numseg;
149     SplineSegment * spline = 0;
150     for (int i = 0; i < numseg; i++)
151       {
152 	infile >> leftdom >> rightdom;
153 
154 	// cout << "add spline " << i << ", left = " << leftdom << endl;
155 
156 	infile >> buf;
157 	// type of spline segement
158 	if (strcmp (buf, "2") == 0)
159 	  { // a line
160 	    infile >> hi1 >> hi2;
161 	    spline = new LineSegment(geompoints[hi1-1],
162 				     geompoints[hi2-1]);
163 	  }
164 	else if (strcmp (buf, "3") == 0)
165 	  { // a rational spline
166 	    infile >> hi1 >> hi2 >> hi3;
167 	    spline = new SplineSegment3 (geompoints[hi1-1],
168 					 geompoints[hi2-1],
169 					 geompoints[hi3-1]);
170 	  }
171 	else if (strcmp (buf, "4") == 0)
172 	  { // an arc
173 	    infile >> hi1 >> hi2 >> hi3;
174 	    spline = new CircleSegment (geompoints[hi1-1],
175 					geompoints[hi2-1],
176 					geompoints[hi3-1]);
177 	    break;
178 	  }
179 	else if (strcmp (buf, "discretepoints") == 0)
180 	  {
181 	    int npts;
182 	    infile >> npts;
183 	    ARRAY<Point<2> > pts(npts);
184 	    for (int j = 0; j < npts; j++)
185 	      infile >> pts[j](0) >> pts[j](1);
186 
187 	    spline = new DiscretePointsSegment (pts);
188 	    cout << "pts = " << pts << endl;
189 	  }
190 
191 	infile >> spline->reffak;
192 	spline -> leftdom = leftdom;
193 	spline -> rightdom = rightdom;
194 	splines.Append (spline);
195 
196 
197 	Flags flags;
198 	ch = 'a';
199 	infile >> ch;
200 	while (ch == '-')
201 	  {
202 	    char flag[100];
203 	    flag[0]='-';
204 	    infile >> (flag+1);
205 	    flags.SetCommandLineFlag (flag);
206 	    ch = 'a';
207 	    infile >> ch;
208 	  }
209 
210 	if (infile.good())
211 	  infile.putback (ch);
212 
213 	splines.Last()->bc = int (flags.GetNumFlag ("bc", i+1));
214 	splines.Last()->hpref_left = int (flags.GetDefineFlag ("hpref")) ||
215 	  int (flags.GetDefineFlag ("hprefleft"));
216 	splines.Last()->hpref_right = int (flags.GetDefineFlag ("hpref")) ||
217 	  int (flags.GetDefineFlag ("hprefright"));
218 	splines.Last()->copyfrom = int (flags.GetNumFlag ("copy", -1));
219       }
220 
221     cout << "load complete" << endl;
222 
223     infile.close();
224   }
225 
226 
227 
228   void SplineGeometry2d ::
PartitionBoundary(double h,Mesh & mesh2d)229   PartitionBoundary (double h, Mesh & mesh2d)
230   {
231     Box<2> bbox;
232     GetBoundingBox (bbox);
233     double dist = Dist (bbox.PMin(), bbox.PMax());
234     Point<3> pmin(bbox.PMin()(0), bbox.PMin()(1), -dist);
235     Point<3> pmax(bbox.PMax()(0), bbox.PMax()(1), dist);
236 
237     cout << "searchtree from " << pmin << " to " << pmax << endl;
238     Point3dTree searchtree (pmin, pmax);
239 
240     for (int i = 0; i < splines.Size(); i++)
241       if (splines[i]->copyfrom == -1)
242 	splines[i]->Partition(h, elto0, mesh2d, searchtree, i+1);
243       else
244 	CopyEdgeMesh (splines[i]->copyfrom, i+1, mesh2d, searchtree);
245   }
246 
247 
CopyEdgeMesh(int from,int to,Mesh & mesh,Point3dTree & searchtree)248   void SplineGeometry2d :: CopyEdgeMesh (int from, int to, Mesh & mesh, Point3dTree & searchtree)
249   {
250     int i, j, k;
251 
252     ARRAY<int, PointIndex::BASE> mappoints (mesh.GetNP());
253     ARRAY<double, PointIndex::BASE> param (mesh.GetNP());
254     mappoints = -1;
255     param = 0;
256 
257     Point3d pmin, pmax;
258     mesh.GetBox (pmin, pmax);
259     double diam2 = Dist2(pmin, pmax);
260 
261     cout << "copy edge, from = " << from << " to " << to << endl;
262 
263     for (i = 1; i <= mesh.GetNSeg(); i++)
264       {
265 	const Segment & seg = mesh.LineSegment(i);
266 	if (seg.edgenr == from)
267 	  {
268 	    mappoints.Elem(seg.p1) = 1;
269 	    param.Elem(seg.p1) = seg.epgeominfo[0].dist;
270 
271 	    mappoints.Elem(seg.p2) = 1;
272 	    param.Elem(seg.p2) = seg.epgeominfo[1].dist;
273 	  }
274       }
275 
276     bool mapped = false;
277     for (i = 1; i <= mappoints.Size(); i++)
278       {
279 	if (mappoints.Get(i) != -1)
280 	  {
281 	    Point<2> newp = splines.Get(to)->GetPoint (param.Get(i));
282 	    Point<3> newp3 (newp(0), newp(1), 0);
283 
284 	    int npi = -1;
285 
286 	    for (PointIndex pi = PointIndex::BASE;
287 		 pi < mesh.GetNP()+PointIndex::BASE; pi++)
288 	      if (Dist2 (mesh.Point(pi), newp3) < 1e-12 * diam2)
289 		npi = pi;
290 
291 	    if (npi == -1)
292 	      {
293 		npi = mesh.AddPoint (newp3);
294 		searchtree.Insert (newp3, npi);
295 	      }
296 
297 	    mappoints.Elem(i) = npi;
298 
299 	    mesh.GetIdentifications().Add (i, npi, to);
300 	    mapped = trueM
301 	  }
302       }
303     if(mapped)
304       mesh.GetIdentifications().SetType(to,Identifications::PERIODIC);
305 
306     // copy segments
307     int oldnseg = mesh.GetNSeg();
308     for (i = 1; i <= oldnseg; i++)
309       {
310 	const Segment & seg = mesh.LineSegment(i);
311 	if (seg.edgenr == from)
312 	  {
313 	    Segment nseg;
314 	    nseg.edgenr = to;
315 	    nseg.si = splines.Get(to)->bc;
316 	    nseg.p1 = mappoints.Get(seg.p1);
317 	    nseg.p2 = mappoints.Get(seg.p2);
318 	    nseg.domin = splines.Get(to)->leftdom;
319 	    nseg.domout = splines.Get(to)->rightdom;
320 
321 	    nseg.epgeominfo[0].edgenr = to;
322 	    nseg.epgeominfo[0].dist = param.Get(seg.p1);
323 	    nseg.epgeominfo[1].edgenr = to;
324 	    nseg.epgeominfo[1].dist = param.Get(seg.p2);
325 	    mesh.AddSegment (nseg);
326 	  }
327       }
328   }
329 
330 
331   void SplineGeometry2d ::
GetBoundingBox(Box<2> & box) const332   GetBoundingBox (Box<2> & box) const
333   {
334     if (!splines.Size())
335       {
336 	box.Set (Point<2> (0,0));
337 	return;
338       }
339 
340     ARRAY<Point<2> > points;
341     for (int i = 0; i < splines.Size(); i++)
342       {
343 	splines[i]->GetPoints (20, points);
344 
345 	if (i == 0) box.Set(points[0]);
346 	for (int j = 0; j < points.Size(); j++)
347 	  box.Add (points[j]);
348       }
349   }
350 
351   void SplineGeometry2d ::
SetGrading(const double grading)352   SetGrading (const double grading)
353   { elto0 = grading;}
354 
355   void SplineGeometry2d ::
AppendPoint(const double x,const double y,const double reffac,const bool hpref)356   AppendPoint (const double x, const double y, const double reffac, const bool hpref)
357   {
358     geompoints.Append (GeomPoint2d(x, y, reffac));
359     geompoints.Last().hpref = hpref;
360   }
361 
362 
363   void SplineGeometry2d ::
AppendSegment(SplineSegment * spline,const int leftdomain,const int rightdomain,const int bc,const double reffac,const bool hprefleft,const bool hprefright,const int copyfrom)364   AppendSegment(SplineSegment * spline, const int leftdomain, const int rightdomain,
365 		const int bc,
366 		const double reffac, const bool hprefleft, const bool hprefright,
367 		const int copyfrom)
368   {
369     spline -> leftdom = leftdomain;
370     spline -> rightdom = rightdomain;
371     spline -> bc = (bc >= 0) ? bc : (splines.Size()+1);
372     spline -> reffak = reffac;
373     spline -> hpref_left = hprefleft;
374     spline -> hpref_right = hprefright;
375     spline -> copyfrom = copyfrom;
376 
377     splines.Append(spline);
378   }
379 
380   void SplineGeometry2d ::
AppendLineSegment(const int n1,const int n2,const int leftdomain,const int rightdomain,const int bc,const double reffac,const bool hprefleft,const bool hprefright,const int copyfrom)381   AppendLineSegment (const int n1, const int n2, const int leftdomain, const int rightdomain,
382 		     const int bc,
383 		     const double reffac, const bool hprefleft, const bool hprefright,
384 		     const int copyfrom)
385   {
386     SplineSegment * spline = new LineSegment(geompoints[n1],geompoints[n2]);
387     AppendSegment(spline,leftdomain,rightdomain,bc,reffac,hprefleft,hprefright,copyfrom);
388   }
389   void SplineGeometry2d ::
AppendSplineSegment(const int n1,const int n2,const int n3,const int leftdomain,const int rightdomain,const int bc,const double reffac,const bool hprefleft,const bool hprefright,const int copyfrom)390   AppendSplineSegment (const int n1, const int n2, const int n3, const int leftdomain, const int rightdomain,
391 		       const int bc,
392 		       const double reffac, const bool hprefleft, const bool hprefright,
393 		       const int copyfrom)
394   {
395     SplineSegment * spline = new SplineSegment3(geompoints[n1],geompoints[n2],geompoints[n3]);
396     AppendSegment(spline,leftdomain,rightdomain,bc,reffac,hprefleft,hprefright,copyfrom);
397   }
398   void SplineGeometry2d ::
AppendCircleSegment(const int n1,const int n2,const int n3,const int leftdomain,const int rightdomain,const int bc,const double reffac,const bool hprefleft,const bool hprefright,const int copyfrom)399   AppendCircleSegment (const int n1, const int n2, const int n3, const int leftdomain, const int rightdomain,
400 		       const int bc,
401 		       const double reffac, const bool hprefleft, const bool hprefright,
402 		       const int copyfrom)
403   {
404     SplineSegment * spline = new CircleSegment(geompoints[n1],geompoints[n2],geompoints[n3]);
405     AppendSegment(spline,leftdomain,rightdomain,bc,reffac,hprefleft,hprefright,copyfrom);
406   }
407   void SplineGeometry2d ::
AppendDiscretePointsSegment(const ARRAY<Point<2>> & points,const int leftdomain,const int rightdomain,const int bc,const double reffac,const bool hprefleft,const bool hprefright,const int copyfrom)408   AppendDiscretePointsSegment (const ARRAY< Point<2> > & points, const int leftdomain, const int rightdomain,
409 			       const int bc,
410 			       const double reffac, const bool hprefleft, const bool hprefright,
411 			       const int copyfrom)
412   {
413     SplineSegment * spline = new DiscretePointsSegment(points);
414     AppendSegment(spline,leftdomain,rightdomain,bc,reffac,hprefleft,hprefright,copyfrom);
415   }
416 
417 }
418