内螺旋算法不起作用

时间:2013-03-05 22:06:39

标签: c# algorithm spiral

我有这个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();
    }

2 个答案:

答案 0 :(得分:2)

假设一个正方形(宽度=高度)看起来你有一个O(x ^ 4)实现 - 那将会非常慢。

我建议尝试将其降低到O(x ^ 2)。而不是螺旋式绘制,重写您的算法以矩形绘制它 - 也就是说,按行&amp;列,计算每个像素应该是什么。

答案 1 :(得分:0)

假设

draw_pixel(c,x,y,g)

在图g中的(x,y)坐标处绘制颜色c点,你走得太远了。你在做什么

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

打印一条应该有长度宽度的线,但是要打印一条长度为一行的线。

我想我不明白你的算法。如果这没有意义,你能解释一下draw_pixel的语义吗?