为了账号安全,请及时绑定邮箱和手机立即绑定

Mandelbrot 集的视觉表示

Mandelbrot 集的视觉表示

白板的微信 2023-02-16 15:47:26
我想使用 Java 生成 Mandelbrot 集的 PNG 照片,输出应该很容易在谷歌图像搜索中找到。该集合定义为以下序列:z_n+1 = z_n^2 + c其中c和z是复数,并且z始终具有小于 2 的模数。我首先为复数定义了一个类,其中还包含所需的基本复杂运算。public class ComplexNumber {    private double real;    private double imaginary;    public ComplexNumber(double real, double imaginary) {        this.real = real;        this.imaginary = imaginary;    }    public ComplexNumber add(ComplexNumber z1, ComplexNumber z2) {        ComplexNumber sum = new ComplexNumber(0, 0);        sum.real = z1.real + z2.real;        sum.imaginary = z1.imaginary + z2.imaginary;        return sum;    }    public ComplexNumber square(ComplexNumber z) {        ComplexNumber squared = new ComplexNumber(0, 0);        squared.real = Math.pow(z.real, 2) - Math.pow(z.imaginary, 2);        squared.imaginary = 2 * z.real * z.imaginary;        return squared;    }    public double abs() {        double absolute = Math.sqrt(Math.pow(this.real, 2) + Math.pow(this.imaginary, 2));        return absolute;    }}然后我定义了 Mandelbrot 类,它获取许多复数 c(基于像素)检查这些数字是否在使用 mandelbrot 方法的 mandelbrot 集中,并将此方法的输出转换为要显示的颜色。import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;public class Mandelbrot {    public static int mandelbrot(ComplexNumber c, ComplexNumber z, int i, int n) {        if (i < n) {            if (c.abs() > 2.0) {                return i;            } else                return 0;        }        return mandelbrot(c, z.square(z).add(z, c), i, n);    }
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

看起来您的递归 mandelbrot 函数的终止条件不正确。

您希望 mandelbrot 函数返回,当

  • z 的绝对值超过 2 或

  • 达到最大递归深度。

另外,你永远不会增加 i。

所以更新后的函数看起来像:

public static int mandelbrot(ComplexNumber c, ComplexNumber z, int i, int n) {

    if (i >= n) {

        // mandelbrot function does not diverge after n iterations.

        // Returning -1 as a magic value to indicate that the point c is in the mandelbrot set.

        // Values may already be outside of the mandelbrot set in the 0th iteration, so returning -1 makes more sense.

        return -1;

    } else if (z.abs() >= 2.0) {

        // mandelbrot function is diverging after i iterations.

        return i;

    } else {

        // recursively call mandelbrot function with an updated z and an incremented i.

        return mandelbrot(c, z.squared().add(c), i + 1, n);

    }

}

最后,如果您选择为 mandelbrot 集中的某个点返回 -1,则必须更新您的颜色计算以将这些点设置为黑色。


int mb = mandelbrot(c, z0, 0, maxRecurse);


if (mb == -1) {

    image.setRGB(x, y, 0);

} else {

    // set the color of your image as usual

}


查看完整回答
反对 回复 2023-02-16
  • 1 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信