2010-02-16 95 views
2

這會產生條紋而不是點。爲什麼?我正在嘗試繪製各個像素。還嘗試了另一種方法(使用fillrectangle),該方法也沒有給出所需的結果,得到了條而不是點。爲什麼這個簡單的C#試用版不能工作

protected override void OnPaint(PaintEventArgs pea) 
    { 

     Graphics g = pea.Graphics ; 

     for (int y = 1 ; y <= Width ; y++) 
     { 
      for ( int x = 1 ; x <= Height ; x++) 
      { 
       System.Random rand = new System.Random() ; 
       Color c = (Color.FromArgb(rand.Next(256), 
            rand.Next(256), 
            rand.Next(256))); 
      // SolidBrush myBrush = new SolidBrush(c); 
      // g.FillRectangle(myBrush, x, y, 1, 1); 


       Bitmap pt = new Bitmap(1, 1); 
       pt.SetPixel(0, 0, c); 
       g.DrawImageUnscaled(pt, x, y); 

      } 
     } 

}

這裏發生了什麼?

+0

不是它回答你的問題。但令人困惑的是,你會使用X遍歷垂直位置,並且y在水平方向上延伸 – Toad

+0

要繼續這個想法:既然你在DrawImageUnscaled調用中正確使用了x和y,但是在循環中錯誤地使用它們,我懷疑不是你的圖片全部會被填充 – Toad

+0

nitpick3:我無法想象DarImageUnscaled會使用它的座標系,從1開始。所以你的循環應該從0開始。 – Toad

回答

4

您應該不是每次創建一個新的Random對象。既然這樣會給你一遍又一遍重複的完全相同的「隨機」數字。

而是使用相同的隨機對象並調用Next上。

+0

非常感謝! 。但它是我還是得到一個相同的'隨機'每次有點不合邏輯 – user257412

+1

隨機數是從一個起始值生成的,稱爲「種子」。如果每次使用相同的種子,每次都會得到確切的隨機數序列。很可能你在這裏使用了相同的種子(或者它使用的系統時鐘在快速循環內沒有時間改變太多)。 http://msdn.microsoft.com/en-us/library/system.random.aspx –

+0

嗯,謝謝解釋! – user257412

4

您需要在循環外部創建System.Random對象。當在循環內部初始化時,它會繼續獲得相同的種子(因爲它是根據系統時鐘初始化的,它仍然具有相同的值),因此它們具有相同的顏色。

1

是啊,他們說了什麼。

而且你可能會得到更好的里程比特率。例如把它從屏幕上拖出來,然後一次畫完。

protected override void OnPaint(PaintEventArgs pea) 
{ 
    using (var b = new Bitmap(this.Width, this.Height)) 
    { 
     using (var g = Graphics.FromImage(b)) 
     { 
      var rand = new Random(); 

      for (int x = 0; x <= Width; x++) 
      { 
       for (int y = 0; y <= Height; y++) 
       { 
        Color c = (Color.FromArgb(rand.Next(256), 
               rand.Next(256), 
               rand.Next(256))); 
        using (var newPen = new Pen(c, 1)) 
        { 
         g.DrawRectangle(newPen, x, y, 0.5f, 0.5f); 
        } 
       } 
      } 
     } 

     pea.Graphics.DrawImage(b, 0, 0); 
    } 
} 

protected override void OnPaint(PaintEventArgs pea) 
{ 
    Graphics g = pea.Graphics; 
    var rand = new Random(); 

    for (int x = 0; x <= Width; x++) 
    { 
     for (int y = 0; y <= Height; y++) 
     { 
      Color c = (Color.FromArgb(rand.Next(256), 
             rand.Next(256), 
             rand.Next(256))); 
      using (var newPen = new Pen(c, 1)) 
      { 
       g.DrawRectangle(newPen, x, y, 0.5f, 0.5f); 
      } 
     } 
    } 
}y 
+0

看看我的意見下的問題。這裏還有不正確的東西。 – Toad

+0

只是爲了讓你快樂,並惹惱任何人在看代碼....只是改變它在平局。誦讀困難的人? –

+0

; ^)不應該循環從0開始? – Toad

0

你需要移動System.Radom的循環之外。這裏發生的事情是,每次迭代循環時都會創建相同的隨機點。另外如果你使用系統添加;到開始的程序比你可以簡單地說隨機(但這並不重要,只是一個旁註)。一旦創建了隨機數,就可以通過簡單地調用對象上的下一個來獲得下一個數字。試試看,我相信它會消除你的問題!

0

您正在矩形0,0,寬度,高度的每個像素上繪製不同的彩色點。但是由於之前的回答是因爲每個迴路中的隨機系統時鐘都是初始化的,所以循環會繪製相同的顏色,給出相同顏色的條紋(水平?),直到系統時鐘稍微滴答一點,然後提供給您一個不同的種子。

如果您將System.Random移動到循環的外部,以便在每個Next中獲得不同的顏色,那麼您將看到點。

相關問題