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 は渦巻きの半径)。私が望んでいた効果が得られません。

さらに、境界線の一部に細い白い線が表示されていることに気付きました (これは、そこにあるピクセルの値が 1 に等しいことを意味します)。その理由を正確に説明することはできません。

私が抱えている問題のいくつかは、atan2 C++ 標準関数に関連している可能性があります。

4

0 に答える 0