我必须制作一个c#程序来创建一个窗体,并且其中的一个控件必须是一个绘制Mandelbrot集草图的控件,您可以在其中放大并指出要居中的点。我认为我做对了,但是当我想启动程序时,却没有得到标准Mandelbrot集的理想图像。对于Mandelbrot草图控件,我有了Mandelbrot类的下一部分:
class Mandelbrotsketchscreen : UserControl
{
//a method that draws every point with a certain paint
//a method that chooses the right colour
//a method that translates the pixel coordinates of the control to the actual coordinates
//gives the number how many times the function has to be used
private static int Mandelnumber(PointF p, PointF middle, double scale, int max, Size size)
{
PointF realpoint = new PointF();
realpoint.X = (float)(middle.X + (p.X - size.Width / 2) * scale);
realpoint.Y = (float)(middle.Y + (p.Y - size.Height / 2) * scale);
PointF help = new PointF(0, 0);
int i;
for (i = 1; i <= max; i++)
{
help.X = help.X * help.X - help.Y * help.Y + realpoint.X;
help.Y = 2 * help.X * help.Y + realpoint.Y;
if (Math.Sqrt(help.X * help.X + help.Y * help.Y) > 2)
break;
}
return i;
}
}
有人可以告诉我我做错了计算还是循环不正确?
答案 0 :(得分:2)
需要根据help.X
和help.Y
的先前值来计算help.X
和help.Y
的新值。
您的代码首先根据先前的 help.X 和 help.Y 值计算新的help.X
值。到目前为止,一切都很好。但是,然后,您的代码将使用新的 help.X 值而不是上一个 help.X 值来计算help.Y
。>
因此,针对您的问题的解决方案/解决方案可以很简单:
for (i = 1; i <= max; i++)
{
var newX = help.X * help.X - help.Y * help.Y + realpoint.X;
var newY = 2 * help.X * help.Y + realpoint.Y;
help.X = newX;
help.Y = newY;
if (Math.Sqrt(help.X * help.X + help.Y * help.Y) > 2)
break;
}
(附带说明:在我的示例中, newY 变量不是严格必需的。我选择使用它来清楚地说明help.X和help.Y的先前值与新值之间的区别。 )
埃里克·利珀特(Eric Lippert)在评论中提到了一个不同的解决方案:只需创建一个新的help
点,而不要更改/修改现有的help
点:
for (i = 1; i <= max; i++)
{
help = new PointF(
help.X * help.X - help.Y * help.Y + realpoint.X,
2 * help.X * help.Y + realpoint.Y
);
if (help.X * help.X + help.Y * help.Y > 4)
break;
}
这种较短的解决方案还通过与2(= 4)的平方进行比较,消除了相当慢的平方根计算。