【问题标题】:MandelbrotSet zoomMandelbrot设置缩放
【发布时间】:2012-10-20 16:30:23
【问题描述】:

我是 C++ 编程的新手,为了改进我正在尝试制作一个 mandelbrot set consol 应用程序。我已经让它几乎完美地工作:图像生成,我可以放大/缩小,并且非常容易移动。不过,我遇到的问题是,当我开始放大图像的边缘时,边缘将开始“被切断”

图片缩小:

图片放大一点 - 正如你所见,最后一个“圆圈”被切掉了一半:

最后,放大一圈,最后一个“圈”已经被完全切掉了:

如果我继续放大,那么大圆圈的边缘也会开始被切掉。 我完全不明白为什么会发生这种情况,但我猜想是我的缩放方法应该归咎于某种原因。

这里是算法计算函数的源代码(我猜是错误的地方):

int fractalCalc(double x0, double y0, double zoom)
{
    double x = 0;
    double y = 0;

    int iteration = 0;
    int max_iteration = 1000; //1000

    double xtemp;
    while (x*x + y*y < 2*2 && iteration < max_iteration) //x*x + y*y < 2*2 && iteration < max_iteration
    {
        xtemp = x*x - y*y + x0;
        y = 2*x*y + y0;
        y /= zoom;
        x = xtemp;
        x /= zoom;
        iteration++;
    }


    return iteration;
}

完整的源代码,请转到(因为我的预测很可能是错误的):http://pastebin.com/WhbS0WYE

欢迎任何建议和/或帮助。提前谢谢!

【问题讨论】:

    标签: c++ mandelbrot


    【解决方案1】:

    我没有仔细计算过,但我怀疑这是由于您处理缩放的方式。我建议不要在处理实际 Mandelbrot 深度计算的代码中这样做。

    相反,使用缩放来选择一个“视口”,从中选择样本。计算出您要采样的坐标,然后编写 fractalCalc 函数来计算特定点的深度。该函数不需要知道您正在显示的内容。

    除此之外,这种关注点分离(视口与分形部分)将使推理和调试变得更容易。这也意味着您每次迭代执行的计算更少,这应该会减少浮点不准确性。

    【讨论】:

    • 嗯。我现在开始看到'y / = zoom;'和'x / =缩放;'在代码中会导致问题。我忘记了它实际上增加了“x”和“y”值,并再次在循环中运行增加的值(我有时会这样做)。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多