1
    imageData = new double*[imageHeight];
    
    for(int i = 0; i < imageHeight; i++) {
        imageData[i] = new double[imageWidth];
        for(int j = 0; j < imageWidth; j++) {
            
            // compute the distance and angle from the swirl center:
            
            double pixelX = (double)i - swirlCenterX;
            double pixelY = (double)j - swirlCenterY;
            
            double pixelDistance = pow(pow(pixelX, 2) + pow(pixelY, 2), 0.5);
                        
            double pixelAngle = atan2(pixelX, pixelY);
            
            
            // double  swirlAmount = 1.0 - (pixelDistance/swirlRadius);
            
            
            // if(swirlAmount > 0.0) {
                
                // double twistAngle = swirlTwists * swirlAmount * PI * 2.0;
                
                double twistAngle = swirlTwists * pixelDistance * PI * 2.0;

              
                // adjust the pixel angle and compute the adjusted pixel co-ordinates:
                
                pixelAngle += twistAngle;
                pixelX = cos(pixelAngle) * pixelDistance;
                pixelY = sin(pixelAngle) * pixelDistance;
                
           // }    
    

            (this)->setPixel(i, j, tempMatrix[(int)(swirlCenterX + pixelX)][(int)(swirlCenterY + pixelY)]);
    
        }
    }

I am trying to implement a c++ function (code above) based on the following pseudo-code which is supposed to create a swirl on an image, but I have some continuity problems on the borders.

The function I have for the moment is able to apply the swirl on a disk of a given size and to deform it almost as I whished but its influence doesn't decrease as we get close to the borders. I tried to multiply the angle of rotation by a 1 - (r/R) factor (with r the distance between the current pixel in the function and the center of the swirl, and R the radius of the swirl), but this doesn't give the effect I hoped for.

Moreover, I noticed that at some parts of the border, a thin white line appears (which means that the values of the pixels there is equal to 1) and I can't exactly explain why.

Maybe some of the problems I have are linked to the atan2 C++ standard function.

I.conic
  • 51
  • 5

0 Answers0