00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "G4ControlPoints.hh"
00037
00038
00039 G4ControlPoints::G4ControlPoints()
00040 {
00041 nr=nc=0;
00042 data=(G4PointRat**)0;
00043 }
00044
00045
00046 G4ControlPoints::G4ControlPoints( G4int rows, G4int columns)
00047 {
00048 nr=rows;
00049 nc=columns;
00050 data = (G4PointRat**) new G4PointRat *[nr*nc];
00051
00052 for(G4int a =0; a<nr*nc;a++)
00053 data[a]=new G4PointRat;
00054 }
00055
00056
00057 G4ControlPoints::G4ControlPoints( G4int, G4int rows, G4int columns)
00058 {
00059
00060
00061
00062
00063 nr=rows;
00064 nc=columns;
00065 data = (G4PointRat**)new G4PointRat *[nr*nc];
00066
00067 for(G4int a = 0; a < nr*nc ; a++ )
00068 data[a]=new G4PointRat;
00069 }
00070
00071
00072 G4ControlPoints::G4ControlPoints(const G4ControlPoints& old_points)
00073 {
00074
00075
00076 for( G4int i = 0; i < nr*nc; i++)
00077 delete data[i];
00078 delete[] data;
00079
00080 nr = old_points.nr;
00081 nc = old_points.nc;
00082 data = (G4PointRat**)new G4PointRat *[nr*nc];
00083
00084 G4int a, b;
00085
00086 for (a = 0; a < nr*nc ; a++ )
00087 data[a] = new G4PointRat;
00088
00089 for ( a = 0; a < nr ; a++ )
00090 for ( b = 0; b < nc ; b++ )
00091 put( a, b, old_points.GetRat(a,b));
00092 }
00093
00094
00095 G4ControlPoints::~G4ControlPoints()
00096 {
00097 for( G4int a = 0; a < nr*nc; a++)
00098 delete data[a];
00099
00100 delete[] data;
00101 }
00102
00103
00104 G4ControlPoints& G4ControlPoints::operator=(const G4ControlPoints& c)
00105 {
00106
00107
00108 if (&c == this) return *this;
00109
00110 for( G4int i = 0; i < nr*nc; i++)
00111 delete data[i];
00112 delete[] data;
00113
00114 nr = c.nr;
00115 nc = c.nc;
00116 data = (G4PointRat**)new G4PointRat *[nr*nc];
00117
00118 G4int a, b;
00119
00120 for (a = 0; a < nr*nc ; a++ )
00121 data[a] = new G4PointRat;
00122
00123 for ( a = 0; a < nr ; a++ )
00124 for ( b = 0; b < nc ; b++ )
00125 put( a, b, c.GetRat(a,b));
00126
00127 return *this;
00128 }
00129
00130
00131 void G4ControlPoints::SetWeights(G4double* weights)
00132 {
00133 for ( G4int a = 0; a < nr*nc; a++ )
00134 (data[a])->setW(weights[a]);
00135 }
00136
00137
00138 void G4ControlPoints::CalcValues ( G4double k1, G4double param,
00139 G4PointRat& pts1, G4double k2,
00140 G4PointRat& pts2 )
00141 {
00142 pts2.setX(Calc(k1,param,pts1.x(),k2,pts2.x()));
00143 pts2.setY(Calc(k1,param,pts1.y(),k2,pts2.y()));
00144 pts2.setZ(Calc(k1,param,pts1.z(),k2,pts2.z()));
00145 pts2.setW(Calc(k1,param,pts1.w(),k2,pts2.w()));
00146 }
00147
00148
00149 void G4ControlPoints::CalcValues(G4double k1, G4double param, G4Point3D& pts1,
00150 G4double k2, G4Point3D& pts2)
00151 {
00152 pts2.setX(Calc(k1,param,pts1.x(),k2,pts2.x()));
00153 pts2.setY(Calc(k1,param,pts1.y(),k2,pts2.y()));
00154 pts2.setZ(Calc(k1,param,pts1.z(),k2,pts2.z()));
00155 }
00156
00157
00158 G4double G4ControlPoints::ClosestDistanceToPoint( const G4Point3D& Pt)
00159 {
00160
00161
00162 G4double PointDist=1.e20;
00163 G4double TmpDist;
00164 G4Point3D Pt2;
00165
00166 for(G4int a=0;a<nr;a++)
00167 for(G4int b=0;b<nc;b++)
00168 {
00169 Pt2 = Get3D(a,b);
00170 TmpDist = Pt.distance2(Pt2);
00171 PointDist = ( PointDist > TmpDist ) ? TmpDist : PointDist;
00172 }
00173
00174 return PointDist;
00175 }