42 template <
typename TSpace>
48 template <
typename TSpace>
56 template <
typename TSpace>
85 template <
typename TSpace>
93 myFx= derivative<0>( poly );
94 myFy= derivative<1>( poly );
95 myFz= derivative<2>( poly );
97 myFxx= derivative<0>( myFx );
98 myFxy= derivative<1>( myFx );
99 myFxz= derivative<2>( myFx);
101 myFyx= derivative<0>( myFy );
102 myFyy= derivative<1>( myFy );
103 myFyz= derivative<2>( myFy );
105 myFzx= derivative<0>( myFz );
106 myFzy= derivative<1>( myFz );
107 myFzz= derivative<2>( myFz );
109 myUpPolynome = myFx*(myFx*myFxx+myFy*myFyx+myFz*myFzx)+
110 myFy*(myFx*myFxy+myFy*myFyy+myFz*myFzy)+
111 myFz*(myFx*myFxz+myFy*myFyz+myFz*myFzz)-
112 ( myFx*myFx +myFy*myFy+myFz*myFz )*(myFxx+myFyy+myFzz);
114 myLowPolynome = myFx*myFx +myFy*myFy+myFz*myFz;
117 template <
typename TSpace>
123 return myPolynomial( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
126 template <
typename TSpace>
132 return (this->
operator()(aPoint) > (
Ring)0);
135 template <
typename TSpace>
141 Ring v = this->operator()(aPoint);
144 else if ( v < (
Ring)0 )
150 template <
typename TSpace>
160 ( myFx ( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] ),
161 myFy ( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] ),
162 myFz ( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] ) );
178 template <
typename TSpace>
184 double temp= myLowPolynome( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
186 double downValue = 2*(temp*temp*temp);
187 double upValue = myUpPolynome( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
190 return -(upValue/downValue);
196 template <
typename TSpace>
203 double vFx= myFx( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
204 double vFy= myFy( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
205 double vFz= myFz( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
207 double vFxx= myFxx( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
208 double vFxy= myFxy( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
209 double vFxz= myFxz( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
212 double vFyy= myFyy( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
213 double vFyz= myFyz( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
219 double vFzz = myFzz( aPoint[ 0 ] )( aPoint[ 1 ] )( aPoint[ 2 ] );
222 double A = vFz*(vFxx*vFz-2.0*vFx*vFxz)+vFx*vFx*vFzz;
224 double B = vFz*(vFyy*vFz-2.0*vFy*vFyz)+vFy*vFy*vFzz;
226 double C = vFz*(-vFx*vFyz+vFxy*vFz-vFxz*vFy)+vFx*vFy*vFzz;
228 double D = vFz*(vFx*vFx+vFy*vFy+vFz*vFz);
230 double G= (A*B-C*C)/(D*D);
246 template <
typename TSpace>
250 const int maxIter,
const double gamma )
const
252 RealPoint agradient= (*this).gradient(aPoint);
255 while((fabs((*
this)(X))>=accuracy) && (numberIter<maxIter))
257 double norm=agradient.norm();
258 RealPoint normalizedGradient=
RealPoint(agradient[0]/norm,agradient[1]/norm,agradient[2]/norm);
269 X=X+normalizedGradient*alpha;
270 agradient= (*this).gradient(X);
283 template <
typename TSpace>
288 out <<
"[ImplicitPolynomial3Shape] P(x,y,z) = " << myPolynomial;
295 template <
typename TSpace>
308 template <
typename TSpace>
314 object.selfDisplay( out );