2013-03-05 3 views
2

меня это C# код для итерации через сетку во внутренней спирали, как это:Внутрь спиральный алгоритм не работает

1 2 3 
8 9 4 
7 6 5 

Вот код, но есть что-то не так с ним, по какой-то причине занимая гораздо больше времени, чем ожидалось. Кто-нибудь знает, почему это происходит?

static void create_spiral_img(int width, int height) 
    { 
     Bitmap img = new Bitmap(width, height); 
     Graphics graph = Graphics.FromImage(img); 

     int x = 0; 
     int y = 0; 
     int size = width * height; 
     int max = size; 
     int count = 1; 
     int i, j; 
     while (size > 0) 
     { 
      for (i = y; i <= y + size - 1; i++) 
      { 
       draw_pixel(count++, x, i, graph); 
      } 

      for (j = x + 1; j <= x + size - 1; j++) 
      { 
       draw_pixel(count++, j, y + size - 1, graph); 
      } 

      for (i = y + size - 2; i >= y; i--) 
      { 
       draw_pixel(count++, x + size - 1, i, graph); 
      } 

      for (i = x + size - 2; i >= x + 1; i--) 
      { 
       draw_pixel(count++, i, y, graph); 
      } 

      x = x + 1; 
      y = y + 1; 
      size = size - 2; 
      Console.Write(100 * ((float)(count)/(float)max) + "% "); 
     } 

     graph.Dispose(); 
     img.Save("./" + width + "x" + height + "_spiril.png", System.Drawing.Imaging.ImageFormat.Png); 
     img.Dispose(); 
    } 
+3

Существует несколько сотен консольных записей. Я предполагаю, что это может повредить ... –

+0

Если вы создаете это, чтобы загипнотизировать людей, есть намного более простые способы ... Все шутите в сторону, как быстро вы ожидаете, что это исполнится? – Brian

+0

Насколько быстрым является 'draw_pixel'? –

ответ

2

Предполагая квадрат (ширина = высота), похоже, у вас есть O (х^4) реализация - это будет ужасно медленно.

Я бы порекомендовал попробовать бросить его на O (x^2). Вместо того, чтобы рисовать его по спирали, перепишите свой алгоритм, чтобы рисовать его прямоугольно - то есть идти по строкам столбцов &, вычисляя, какими должны быть каждый пиксель.

+0

На самом деле он не должен быть width = height, они могут быть разными. Можете ли вы показать мне, как это сделать в O (n^2) с кодом? – omega

+0

Это не O^4 - у вас может быть четыре петли, но вы по существу все еще делаете только высоту * ширину операций. Так что это действительно o^2. –

0

Предполагая, что

draw_pixel(c,x,y,g) 

рисует точку в цвете с при (х, у) координаты в графе г, вы собираетесь слишком далеко. Вы делаете

for (i = y; i <= y + size - 1; i++) 

Чтобы напечатать строку, которая должна иметь длину, но вы печатаете линию длины.

Я думаю, что не понял ваш алгоритм. Если это не имеет смысла, можете ли вы объяснить семантику draw_pixel, пожалуйста?

+0

На самом деле код 'draw_pixel' не имеет отношения к делу, я в основном интересуюсь фиксацией циклов, поэтому он выполняет итерацию по сетке по спиральному шаблону. Каждая координата (x, y) должна повторяться только один раз. Параметры 'draw_pixel' -' draw_pixel (i, x, y, graph); '. I и график не имеют отношения к моему вопросу. – omega

+0

Также вы, кажется, нашли проблему, но я не понимаю, можете ли вы объяснить больше? – omega

Смежные вопросы