template <class P1, class P2> static void Convolve_2( const GenericImage<P1>& image, GenericImage<P2>& sharp, pcl_enum interpolation, float dR, float angleD, DPoint center, int c ) { PixelInterpolation* P = 0; PixelInterpolation::Interpolator<P1>* interpolator = 0; try { switch ( interpolation ) { case LSInterpolation::Bilinear: P = new BilinearPixelInterpolation(); break; default: case LSInterpolation::Bicubic: P = new BicubicPixelInterpolation(); break; case LSInterpolation::BicubicSpline: P = new BicubicSplinePixelInterpolation(); break; case LSInterpolation::BicubicBSpline: P = new BicubicBSplinePixelInterpolation(); break; } interpolator = P->NewInterpolator<P1>( image[c], image.Width(), image.Height() ); int w = image.Width() - 1; int h = image.Height() - 1; double fimg, fsharp; StatusMonitor monitor; monitor.Initialize( "<end><cbr>High-pass Larson-Sekanina filter", image.NumberOfPixels() ); sharp.Zero(); float dAlpha = Rad( angleD ); for ( int x = 0; x < image.Width(); ++x ) for ( int y = 0; y < image.Height(); ++y, ++monitor ) { // Get the central value P1::FromSample( fimg, image.Pixel( x, y, c ) ); fsharp = fimg+fimg; double r, theta; ToPolar( x, y, center, r, theta); DPoint delta; // Positive differential ToCartesian( r-dR, theta+dAlpha, center, delta ); if ( delta.x < 0 ) delta.x = Abs( delta.x ); else if ( delta.x > w ) delta.x = 2*w - delta.x; if ( delta.y < 0 ) delta.y = Abs( delta.y ); else if ( delta.y > h ) delta.y = 2*h - delta.y; P1::FromSample( fimg, (*interpolator)( delta ) ); fsharp -= fimg; //Negative differential ToCartesian( r-dR, theta-dAlpha, center, delta ); if ( delta.x < 0 ) delta.x = Abs( delta.x ); else if ( delta.x > w ) delta.x = 2*w - delta.x; if ( delta.y < 0 ) delta.y = Abs( delta.y ); else if ( delta.y > h ) delta.y = 2*h - delta.y; P1::FromSample( fimg, (*interpolator)( delta ) ); fsharp -= fimg; sharp.Pixel( x, y ) = P2::ToSample( fsharp ); } delete interpolator; delete P; } catch ( ... ) { if ( interpolator != 0 ) delete interpolator; if ( P != 0 ) delete P; throw; } }
void CFpoint::Rotate( const CFfloat angle ) { ToPolar(); m_x += angle; ToCartesian(); }