Sphere distortion / barrel grid algorithm?
The below image is an example of sphere distortion in Photo Shop. Pleasesee below image.
When I changed the parameter 0 to 50 to 100, the 2D grids are changing. So basically this is what I want to achieve.
Below is my current code:
private static CvPoint GetShiftedPoint( CvPoint center, CvPoint point, double p = 1.5 )
{
// p == 1 it draws perfect sphere. As it grows, it should look like flat surface
// the bigger p, the longer radius
double a = Math.Max( center.X, center.Y );
double r = a * p;
double distance = center.DistanceTo( point );
// calculate height of sphere
double theta = Math.Asin( a / r );
double h = Math.Cos( theta ) * r;
double hTop = r - h;
// calculate shift amount
double y = r - ( hTop * distance / a );
double rho = Math.Acos( y / r );
double newDistance = Math.Sin( rho ) * r;
double dx = point.X - center.X;
double dy = point.Y - center.Y;
double radian = Math.Atan2( dy, dx );
double newDx = Math.Cos( radian ) * newDistance;
double newDy = Math.Sin( radian ) * newDistance;
int newX = ( int )Math.Round( center.X + newDx );
int newY = ( int )Math.Round( center.Y + newDy );
return new CvPoint( newX, newY );
}
The theory of my code is that I draw virtual semi-sphere over my image and calculate distance shift amount based on the first distance from the center. Hope you can understand my function.
But the result from this method looks like this:
Mine does not look like a sphere :(
Does anyone knows how to draw sphere grids with a strength parameter?
@Papercut have a look also to my answers here and here. The second one is based on the link that @Tetragramm has posted in his answer but ported to the new API. I have also this thread that lacks an answer since I couldn't understand really how he makes the shift of the pixels. So if you or someone else have some time to work on it I would be glad to hear your answers.