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)]);
    
        }
    }

我正在尝试基于以下伪代码实现一个 c++ 函数(上面的代码),该伪代码 应该在图像上创建一个漩涡,但我在边界上有一些连续性问题。

我目前拥有的功能是能够在给定大小的磁盘上应用漩涡,并几乎按照我的意愿使其变形,但随着我们接近边界,它的影响并没有减少。我试图将旋转角度乘以 1 - (r/R) 因子(其中 r 是函数中当前像素与漩涡中心之间的距离,而 R 是漩涡的半径),但这并不t给出我希望的效果。

此外,我注意到在边界的某些部分,出现了一条细白线(这意味着那里的像素值等于 1),我无法准确解释原因。

也许我遇到的一些问题与 atan2 C++ 标准函数有关。

4

0 回答 0