2011-03-07 147 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的调用应产生默认输出。