2011-03-07 46 views
1

我與2D傅立葉變換的工作,我有一種方法將輸出以下結果: Original Image繪製旋轉正弦圖像

的代碼看起來是這樣的:

private Bitmap PaintSin(int s, int n) 
    { 
     Data = new int[Width, Height]; 
     Bitmap buffer = new Bitmap(Width, Height); 

     double inner = (2 * Math.PI * s)/n; 
     BitmapData originalData = buffer.LockBits(
      new Rectangle(0, 0, buffer.Width, buffer.Height), 
      ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 

     for (int i = 0; i < buffer.Width; i++) 
     { 
      for (int j = 0; j < buffer.Height; j++) 
      { 
       double val; 
       int c = 0; 

       if (j == 0) 
       { 
        val = Math.Sin(inner * i); 
        val += 1; 
        val *= 128; 
        val = val > 255 ? 255 : val; 
        c = (int)val; 

        Color col = Color.FromArgb(c, c, c); 
        SetPixel(originalData, i, j, col); 
       } 
       else 
        SetPixel(originalData, i, j, GetColor(originalData, i, 0)); 

       Data[i, j] = c; 
      } 
     } 
     buffer.UnlockBits(originalData); 

     return buffer; 
    } 

現在,我試圖想象一個能夠接受角度的公式,並且在實線處於給定角度的位置將出圖像。

例如,如果我輸入45度,其結果必然是:

Rotated image

感謝您的幫助!

下面是對setPixel代碼,如果所需要:

private unsafe void SetPixel(BitmapData originalData, int x, int y, Color color) 
    { 
     //set the number of bytes per pixel 
     int pixelSize = 3; 

     //get the data from the original image 
     byte* oRow = (byte*)originalData.Scan0 + (y * originalData.Stride); 

     //set the new image's pixel to the grayscale version 
     oRow[x * pixelSize] = color.B; //B 
     oRow[x * pixelSize + 1] = color.G; //G 
     oRow[x * pixelSize + 2] = color.R; //R 
    } 

回答

2

這應該通過使用旋轉的座標系是可能的。的ij轉化爲如下:

x = i * cos(angle) - j * sin(angle); 
y = j * cos(angle) + i * sin(angle); 

注:我不知道度/弧度在這裏,所以調整angle,使其適合於COS和罪惡確實需要的單位。另外,根據所需的旋轉方向,您可能不得不取消角度。

實際上,您只需要x即可取代您使用i。我們將預先計算sin(angle)cos(angle),因爲這些是我們不想在內部循環中執行的相當昂貴的操作。

[...] 
    // double angle = ... 
    double cos_angle = cos(angle); 
    double sin_angle = sin(angle); 
    for (int i = 0; i < buffer.Width; i++) 
    { 
     for (int j = 0; j < buffer.Height; j++) 
     { 
      double val; 
      double x; 
      int c = 0; 

      x = i * cos_angle - j * sin_angle; 
      val = Math.Sin(inner * x); 
      val += 1; 
      val *= 128; 
      val = val > 255 ? 255 : val; 
      c = (int)val; 

      Color col = Color.FromArgb(c, c, c); 
      SetPixel(originalData, i, j, col); 

      Data[i, j] = c; 
     } 
    } 
+0

這就對了!謝謝:)當設置爲每隔50ms刷新一次時,結果非常糟糕。 – 2011-03-07 21:09:09

0

您可以編寫一個簡單的函數旋轉(X,Y,角度)和SetPixel使用其結果是:Additionaly,因爲我們不能只畫一條線,並重復了您的優化被刪除。你可以谷歌旋轉矩陣。 角度= 0的調用應產生默認輸出。