大家好我正在尝试绘制mandlebrot分形,但结果离它很远,你能帮我找到原因吗?
以下是代码:
void Button1Click(object sender, EventArgs e)
{
Graphics g = pbx.CreateGraphics();
Pen p = new Pen(Color.Black);
double xmin = -2.0;
double ymin = -1.2;
double xmax = 0;
double ymax = 0;
double x = xmin, y = ymin;
int MAX = 1000;
double stepY = Math.Abs(ymin - ymax)/(pbx.Height);
double stepX = Math.Abs(xmin - xmax)/(pbx.Width);
for(int i = 0; i < pbx.Width; i++)
{
y = ymin;
for(int j = 0; j < pbx.Height; j++)
{
double rez = x;
double imz = y;
int iter = 0;
while(rez * rez + imz * imz <= 4 && iter < MAX)
{
rez = rez * rez - imz * imz + x;
imz = 2 * rez * imz + y;
iter++;
}
if(iter == MAX)
{
p.Color = Color.Black;
g.DrawRectangle(p, i, j, 1, 1);
}
else
{
p.Color = Color.White;
g.DrawRectangle(p, i, j, 1, 1);
}
y += stepY;
}
x += stepX;
}
}
请帮助我,我的头脑正在碾压思考如何获得美丽的mandlebrot设置... 对不起,如果我犯了一些错误,但英语不是我的语言!
答案 0 :(得分:1)
你在其他地方有一些违规行为。您绘制的范围不是整个集合,我会直接为每个像素计算x
和y
,而不是使用增量(以避免舍入误差累积)。
但它看起来好像你的主要错误是在迭代计算中。在计算新的rez
值之前,您正在修改imz
变量。你的循环看起来应该更像这样:
while(rez * rez + imz * imz <= 4 && iter < MAX)
{
double rT = rez * rez - imz * imz + x;
imz = 2 * rez * imz + y;
rez = rT;
iter++;
}
答案 1 :(得分:1)
除了Peters回答之外,您应该使用调色板而不是仅绘制黑白像素。
创建一个颜色数组,如下所示:(非常简单的例子)
Color[] colors = new Colors[768];
for (int i=0; i<256; i++) {
colors[i ]=Color.FromArgb( i, 0, 0);
colors[i+256]=Color.FromArgb(255-i, i, 0);
colors[i+512]=Color.FromArgb(0 , 255-i, i);
}
然后使用iter
值拉取颜色并绘制它:
int index=(int)((double)iter/MAX*767);
p.Color c = colors[index];
g.DrawRectangle(p, i, j, 1, 1);
用最后一步替换整个if (iter == MAX) ... else ...
语句。