Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4BSplineCurve.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // $Id$
28 //
29 // ----------------------------------------------------------------------
30 // GEANT 4 class source file
31 //
32 // G4BSplineCurve.cc
33 //
34 // ----------------------------------------------------------------------
35 
36 #include "G4BSplineCurve.hh"
37 #include "G4ControlPoints.hh"
38 #include "G4KnotVector.hh"
39 
41  : degree(0), controlPointsList(0), knots(0), weightsData(0)
42 {
43 }
44 
45 void G4BSplineCurve::Init(G4int degree0, G4Point3DVector* controlPointsList0,
46  std::vector<G4double>* knots0,
47  std::vector<G4double>* weightsData0)
48 {
49  degree= degree0;
50 
51  G4int nbpoints = controlPointsList0->size();
52  controlPointsList = new G4Point3DVector(nbpoints,G4Point3D(0,0,0));
53 
54  G4int a;
55  for(a = 0; a < nbpoints; a++)
56  {
57  (*controlPointsList)[a] = (*controlPointsList0)[a];
58  }
59 
60  G4int nbknots = knots0->size();
61  knots = new std::vector<G4double>(nbknots,0.);
62  for(a = 0; a < nbknots; a++)
63  {
64  (*knots)[a] = (*knots0)[a];
65  }
66 
67  G4int nbweights = weightsData0->size();
68  weightsData = new std::vector<G4double>(nbweights,0.);
69  for(a = 0; a < nbweights; a++)
70  {
71  (*weightsData)[a] = (*weightsData0)[a];
72  }
73 
74  SetBounds((*knots)[0], (*knots)[knots->size()-1]);
75 }
76 
77 
79 {
80  delete [] controlPointsList;
81  delete [] knots;
82  delete [] weightsData;
83 }
84 
85 
87  : G4Curve()
88 {
89  delete [] controlPointsList;
90  delete [] knots;
91  delete [] weightsData;
92  Init(right.degree, right.controlPointsList,
93  right.knots, right.weightsData);
94  bBox = right.bBox;
95  start = right.start;
96  end = right.end;
97  pStart = right.pStart;
98  pEnd = right.pEnd;
99  pRange = right.pRange;
100  bounded = right.bounded;
101  sameSense = right.sameSense;
102 }
103 
105 {
106  if (&right == this) { return *this; }
107  delete [] controlPointsList;
108  delete [] knots;
109  delete [] weightsData;
110  Init(right.degree, right.controlPointsList,
111  right.knots, right.weightsData);
112  bBox = right.bBox;
113  start = right.start;
114  end = right.end;
115  pStart = right.pStart;
116  pEnd = right.pEnd;
117  pRange = right.pRange;
118  bounded = right.bounded;
119  sameSense = right.sameSense;
120 
121  return *this;
122 }
123 
124 // add by L. Broglia to pass linkage
125 
127 {
128  return 0.0;
129 }
130 
132 {
133  return G4Point3D(0, 0, 0);
134 }
135 
137 {
138  return 0.0;
139 }
140 
141 /*
142 #include "G4CurveRayIntersection.hh"
143 
144 void G4BSplineCurve::IntersectRay2D(const G4Ray& ray,
145  G4CurveRayIntersection& is)
146 {
147 }
148 */
149 
151 {
152  // L. Broglia
153  G4Exception("G4BSplineCurve::IntersectRay2D()", "GeomSolids0001",
154  FatalException, "Sorry, not yet implemented.");
155  return 0;
156 }
157 
158 /*
159 void G4BSplineCurve::CalcCurvePlaneNormal()
160 {
161  //Calc Normal for surface which is used for the projection
162  G4ThreeVec norm;
163  G4Point3d Pt1 = ControlPointList->get(0,0);
164  G4Point3d Pt2 = ControlPointList->get(0,1);
165  G4Point3d Pt3 = ControlPointList->get(0,2);
166  G4Point3d a(Pt2.X()-Pt1.X(), Pt2.Y()-Pt1.Y(), Pt2.Z()-Pt1.Z());
167  G4Point3d b(Pt3.X()-Pt1.X(), Pt3.Y()-Pt1.Y(), Pt3.Z()-Pt1.Z());
168  norm.X((a.Y()*b.Z() - a.Z()*b.Y()));
169  norm.Y((a.X()*b.Z() - a.Z()*b.X()));
170  norm.Z((a.X()*b.Y() - a.Y()*b.X()));
171 
172 }
173 */
174 
175 
177 {
178  // just transform + project all control points
179  // what about self intersections?
180 
181  G4int n = controlPointsList->size();
182  G4Point3DVector* newControlPointsList = new G4Point3DVector(n);
183 
184  for (G4int i=0; i<n; i++)
185  {
186  G4Point3D& p= (*newControlPointsList)[i];
187  p= tr*(*controlPointsList)[i];
188  p.setZ(0);
189  }
190 
191  std::vector<G4double>* newKnots= new std::vector<G4double>(*knots);
192  std::vector<G4double>* newWeightsData=
193  weightsData ? new std::vector<G4double>(*weightsData)
194  : new std::vector<G4double>(0);
195 
197  r->Init(degree, newControlPointsList, newKnots, newWeightsData);
198 
199  delete newControlPointsList;
200  delete newKnots;
201  delete newWeightsData;
202 
203  if (IsBounded())
204  {
205  r->SetBounds(GetPStart(), GetPEnd());
206  }
207  return r;
208 }
209 
210 
211 /*
212 void G4BSplineCurve::ProjectCurve(const G4Plane& Pl1, const G4Plane& Pl2)
213 {
214  int rows = ControlPointList->GetRows();
215  int cols = ControlPointList->GetCols();
216  int NumberOfPoints = cols * rows;
217  ProjectedControlPoints = new G4Point2d*[NumberOfPoints];
218  // Loop through points and do projection
219  for(int a = 0; a<NumberOfPoints;a++)
220  {
221  // Create 2d-point
222  ProjectedControlPoints[a] = new G4Point2d;
223  // Project 3d points into 2d
224  Project((*ProjectedControlPoints[a]), ControlPointList->get(0,a), Pl1, Pl2);
225  }
226 }
227 
228 
229 int G4BSplineCurve::Inside( const G4Point3d& Hit, const G4Ray& rayref)
230 {
231  const G4Plane& Pl1 = rayref.GetPlane(0);
232  const G4Plane& Pl2 = rayref.GetPlane(1);
233  register G4double DistA1, DistA2, DistB1, DistB2;
234  // Calc distance from Start point to ray planes
235  DistA1 = Start.PlaneDistance(Pl1);
236  // Calc distance from End point to ray planes
237  DistB1 = End.PlaneDistance(Pl1);
238  if((DistA1<0 && DistB1>0)||(DistA1>0 && DistB1 <0))
239  {
240  DistA2 = Start.PlaneDistance(Pl2);
241  DistB2 = End.PlaneDistance(Pl2);
242  // This checks the line Start-End of the convex hull
243  if(DistA2<0&&DistB2<0)
244  return 1;
245  }
246  // Test for the other lines of the convex hull
247  // If one of them is on a different side than the
248  // previously checked line, the curve has to be evaluated
249  // against the G4Plane.
250  int Points = ControlPointList->GetCols();
251 
252  G4Point *CPoint1, *CPoint2;
253 
254  register G4double CDistA1,CDistA2, CDistB1, CDistB2;
255  int Flag=0;
256  for(int a=0;a<Points-1;a++)
257  {
258  CPoint1 = &ControlPointList->get(0,a);
259  CPoint2 = &ControlPointList->get(0,a+1);
260  CDistA1 = CPoint1->PlaneDistance(Pl1);
261  CDistB1 = CPoint2->PlaneDistance(Pl1);
262  if((CDistA1<0 && CDistB1>0)||(CDistA1>0 && CDistB1<0))
263  {
264  CDistA2 = CPoint1->PlaneDistance(Pl2);
265  CDistB2 = CPoint2->PlaneDistance(Pl2);
266  if (!(CDistA2<0&&CDistB2<0))
267  {
268  Flag=1;
269  break;
270  }
271  }
272  }
273 
274 
275  if(!Flag)
276  return 1;
277  else
278  {
279  // Evaluate curve & Pl1 intersection, Calc the intersections distance
280  // from Pl2 to check which side it lies on.
281  G4Point3d IntPoint;
282  // G4cout << "\nG4B_SplineCurve.cc:Inside - Evaluation not yet implemented!!!\n";
283  // IntPoint = ...
284  G4double IntDist = IntPoint.PlaneDistance(Pl2);
285  if(IntDist<0)
286  return 1;
287  }
288  return 0;
289 
290 }
291 */
292 
293 
295 {
296  // just like in the old functions
297  G4int pointCount = controlPointsList->size();
298  bBox.Init( (*controlPointsList)[0] );
299  for (G4int i=1; i<pointCount; i++)
300  {
301  bBox.Extend( (*controlPointsList)[i] );
302  }
303 }
304 
305 
306 /*
307 G4Point3d G4BSplineCurve::GetBoundMin()
308 {
309  G4Point3d Min = PINFINITY;
310  int PointCount = ControlPointList->GetCols();
311  G4Point3d Tmp;
312  for(int a=0;a<PointCount;a++)
313  {
314  Tmp = ControlPointList->get(0,a);
315  Min > Tmp;
316  }
317  return Min;
318 }
319 
320 G4Point3d G4BSplineCurve::GetBoundMax()
321 {
322  G4Point3d Max = -PINFINITY;
323  G4Point3d Tmp;
324  int PointCount = ControlPointList->GetCols();
325  for(int a=0;a<PointCount;a++)
326  {
327  Tmp = ControlPointList->get(0,a);
328  Max > Tmp;
329  }
330  return Max;
331 }
332 */
333 
334 
336 {
337  G4Exception("G4BSplineCurve::Tangent()", "GeomSolids0001",
338  FatalException, "Sorry, not implemented !");
339  return false;
340 }
341