2016-12-24 28 views
1

在一類新的頂部:爲什麼在改變點半徑大小時工作速度太慢?

private Random r = new Random(); 
public int numberOfPoints = 100; 
public Bitmap bmpWithPoints; 

然後在類Initi方法:

public void Init() 
     {    
       bmpWithPoints = GetBitmapWithEllipses(1.0f); 
     } 

然後則方法GetBitmapWithEllipses:

private Bitmap GetBitmapWithEllipses(float radius) 
     { 
      Bitmap bmp = new Bitmap(512, 512); 
      Random r = new Random(); 

      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
        g.Clear(Color.Black); 
        g.SmoothingMode = SmoothingMode.AntiAlias; 
        List<RectangleF> rects = new List<RectangleF>(); 
        rects.Add(new RectangleF(0, 0, 0, 0)); 

        for (int x = 0; x < numberOfPoints; x++) 
        { 
         for (int y = 0; y < numberOfPoints; y++) 
         { 
          Color c = Color.FromArgb(
           r.Next(0, 256), 
           r.Next(0, 256), 
           r.Next(0, 256)); 

          PointF p = new PointF(r.Next(bmp.Width), r.Next(bmp.Height)); 
          RectangleF rect = new RectangleF(p, new SizeF(radius * 2, radius * 2)); 

          if (!rects.Any(tmp => tmp.IntersectsWith(rect))) 
          { 
           rects.Add(rect); 
           g.FillEllipse(new SolidBrush(c), rect); 
          } 
          else 
          { 
           y--; 
          } 
         } 
        }     
      } 

      return bmp; 
     } 

在Form1頂部和構造:

DopplerEffect de = new DopplerEffect(); 

     public Form1() 
     { 
      InitializeComponent(); 

      de.bmpWithPoints = new Bitmap(512, 512); 
      de.numberOfPoints = 50; 
      de.Init(); 
     } 

在我遇到問題之前,GetBitmapWithEllipses方法很慢,因爲將點數設置爲50.現在這部分工作很快,但現在將半徑大小更改爲5.0f或10.0f時,它非常緩慢。

當我在Form1中的線設置的點的數量爲10或20或50:

de.numberOfPoints = 50; 

在類的方法GetBitmapWithEllipses將工作速度快。 但是,如果我在課堂上改變了每個點的半徑大小,例如1.0f,它將工作得很快。但是,如果我將點數設置爲50,並將半徑大小更改爲10.0f,例如GetBitmapWithEllipses方法的工作速度非常慢。甚至到5.0f

當改變每個點的半徑大小時,是否有任何方法可以使它快速工作?

+0

你隨意在循環建立的社交圈,如果創建的圈子有與之前創建的省略號重疊,您可以向後循環。當收音機增長時,重疊的機會增加,所以你向後退一步,循環需要更長時間才能完成。 –

回答

1

您可以在循環中隨機創建圓,並且如果新創建的圓與先前創建的圓重疊,則可以向後循環。

當收音機增長的重疊機會增加,所以你後退更多,循環需要很長時間才能完成。事實上,你的循環無法保證完成!

您可以發表評論,其檢查重疊,這使得落後的循環步代碼的代碼,那麼你將有一個快速的結果:

//if (!rects.Any(tmp => tmp.IntersectsWith(rect))) 
//{ 
// rects.Add(rect); 
     g.FillEllipse(new SolidBrush(c), rect); 
//} 
//else 
//{ 
// y--; 
//} 
+0

檢查重疊有多重要? –

+1

我對創建這種效果的目標沒有任何意見。所以你應該知道更好:) –