向内螺旋算法不工作

本文关键字:工作 算法 螺旋 | 更新日期: 2023-09-27 18:02:40

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

向内螺旋算法不工作

假设一个正方形(width=height),看起来你已经得到了一个0 (x^4)的实现-这将是非常慢的。

我建议尝试将其降至O(x^2)。而不是螺旋绘制,重写你的算法来绘制矩形-也就是说,按行&列,计算每个像素应该是多少

draw_pixel(c,x,y,g)

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

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

打印长度应该为width的行,但您打印的是长度为size的行。

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