使用for循环 生成mandelbrot图像

非人 发布于 2012-11-28 191 次阅读


跟着《C#入门经典》第四版上的代码自己写的

static void Main(string[] args)
{
double realCoord, imagCoord;
double realTemp, imagTemp, realTemp2, arg;
int iterations;
for (imagCoord = 1.2; imagCoord >= -1.2; imagCoord -= 0.05)
{
for (realCoord = -0.6; realCoord <= 1.77; realCoord += 0.03)
{
iterations = 0;
realTemp = realCoord;
imagTemp = imagCoord;
arg =(realCoord * realCoord )+(imagCoord * imagCoord );
while ((arg < 4) && (iterations < 40))
{
realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp) - realCoord;
imagTemp = (2 * realTemp * imagTemp) - imagCoord;
realTemp = realTemp2;
arg = (realTemp * realTemp) + (imagTemp * imagTemp);
iterations += 1;
}
switch (iterations % 4)
{
case 0:
Console.WriteLine(".");
break;
case 1:
Console.WriteLine("。");
break;
case 2:
Console.WriteLine("0");
break;
case 3:
Console.WriteLine("@");
break;
}
}
Console .Write ("n");
}
Console.ReadKey();
}

非常奇怪的是居然无法生成跟书本上一样的图形。不知道哪里出了问题。于是我就对照了几次,发现代码都一样啊!怎么回事?真见鬼了。于是不手写代码,直接复制粘贴然后运行,哎,可以啊,代码没错啊。真是见鬼了今天。

然后我就一条一条代码复制覆盖过去测试,终于发现原来是switch语句中的Console.WriteLine()应为Console.Write(),还有:

case 1:
Console.Write("o");

这句“o”是小写字母O,我写成句号“。”了……

因为用VS2010习惯了程序自动填充,打了”console.w“之后敲了空格键,然后一没留意就成了WriteLine了。你妹的,对着都抄错,真活见鬼了。

正确的应该为:

 static void Main(string[] args)
{
double realCoord,imagCoord;
double realTemp,imagTemp,realTemp2,arg;
int iterations;
for(imagCoord=1.2;imagCoord>=-1.2;imagCoord-=0.05)
{
for(realCoord=-0.6;realCoord<=1.77;realCoord+=0.03)
{
iterations=0;
realTemp=realCoord;
imagTemp=imagCoord;
arg=(realCoord*realCoord)+(imagCoord*imagCoord);
while((arg<4)&&(iterations<40))
{
realTemp2=(realTemp*realTemp)-(imagTemp*imagTemp)-realCoord;
imagTemp=(2*realTemp*imagTemp)-imagCoord;
realTemp=realTemp2;
arg=(realTemp*realTemp)+(imagTemp*imagTemp);
iterations+=1;
}
switch(iterations % 4)
{
case 0:
Console.Write(".");
break;
case 1:
Console.Write("o");
break;
case 2:
Console.Write("O");
break;
case 3:
Console.Write("@");
break;
}
}
Console.Write("n");
}

Console.ReadKey();
}

====================

顺便用了一下百度百科上的mandelbrot图像C#代码:

static void Main(string[] args)
{
double realCoord, imagCoord;
double realMax = 1.77;
double realMin = -0.6;
double imagMax = -1.2;
double imagMin = 1.2;
double realStep;
double imagStep;
double realTemp, imagTemp, realTemp2, arg;
int iterations;
while (true)
{
realStep = (realMax - realMin) / 79;
imagStep = (imagMax - imagMin) / 48;
for (imagCoord = imagMin; imagCoord >= imagMax;
imagCoord += imagStep)
{
for (realCoord = realMin; realCoord <= realMax;
realCoord += realStep)
{
iterations = 0;
realTemp = realCoord;
imagTemp = imagCoord;
arg = (realCoord * realCoord) + (imagCoord *
imagCoord);
while ((arg < 4) && (iterations < 40))
{
realTemp2 = (realTemp * realTemp) - (imagTemp *
imagTemp)
- realCoord;
imagTemp = (2 * realTemp * imagTemp) - imagCoord;
realTemp = realTemp2;
arg = (realTemp * realTemp) + (imagTemp *
imagTemp);
iterations += 1;
}
switch (iterations % 4)
{
case 0:
Console.Write("."); break;
case 1:
Console.Write("o");
break;
case 2:
Console.Write("O");
break;
case 3:
Console.Write("@");
break;
}
}
Console.Write("n");
}
Console.WriteLine("Current limits:");
Console.WriteLine("realCoord: from {0} to {1}", realMin,
realMax);
Console.WriteLine("imagCoord: from {0} to {1}", imagMin,
imagMax);
Console.WriteLine("Enter new limits:");
Console.WriteLine("realCoord: from:");
realMin = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("realCoord: to:");
realMax = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("imagCoord: from:");
imagMin = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("imagCoord: to:");
imagMax = Convert.ToDouble(Console.ReadLine());
}
}

用这个代码倒是能出现图形。

 

除非注明,本博客所有内容 由 秒速340 创作,采用 知识共享 署名-非商业性使用-禁止演绎 3.0 未本地化版本 许可协议进行许可。
此作者没有提供个人介绍
最后更新于 2021-10-31