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();
    }
4

2 回答 2

2

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

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

于 2013-03-05T22:48:49.673 回答
0

假如说

draw_pixel(c,x,y,g)

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

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

打印一条应该有长度宽度的线,但你正在打印一条长度大小的线。

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

于 2013-03-06T01:15:48.977 回答