我有这个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();
}
答案 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的语义吗?