gpt4 book ai didi

java - 在 Java 中以图形方式表示 Mandelbrot 和 Julia 集

转载 作者:行者123 更新时间:2023-11-30 02:55:17 25 4
gpt4 key购买 nike

我正在解决一个问题,我需要使用 OpenCL 以图形方式表示 Mandelbrot 集,并首先处理我的顺序代码。然而,它生成的图像不是很好,我不确定我是否遗漏了某些地方,或者这是否仅仅是缺乏分辨率的问题(可以这么说)。我已经发布了下面的代码以及它生成的屏幕截图 - 这是我应该期待的还是我在某个地方搞砸了?

public class SequentialMandelbrot {

private static int[] colorMap;
private static int xSize = 200, ySize = 200;
private static float yMin = -2f, yMax = 2f;
private static float xMin = -2f, xMax = 2f;
private static float xStep = (xMax - xMin) / (float)xSize;
private static float yStep = (yMax - yMin) / (float)ySize;
private static final int maxIter = 250;
private static BufferedImage image;
private static JComponent imageComponent;

public static void main(String[] args) {

// Create the image and the component that will paint the image
initColorMap(32, Color.RED, Color.GREEN, Color.BLUE);
image = new BufferedImage(xSize, ySize, BufferedImage.TYPE_INT_RGB);
imageComponent = new JPanel()
{
private static final long serialVersionUID = 1L;
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(image, 0,0,this);
}
};

for (int j = 0; j < xSize; j++) {
for (int k = 0; k < ySize; k++) {
int iter = mandelbrot(j, k);
if (iter == maxIter) {
image.setRGB(j, k, 0);
} else {
int local_rgb = colorMap[iter%64];
image.setRGB(j, k, local_rgb);
}
}
}

JFrame frame = new JFrame("JOCL Simple Mandelbrot");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
imageComponent.setPreferredSize(new Dimension(xSize, ySize));
frame.add(imageComponent, BorderLayout.CENTER);
frame.pack();

frame.setVisible(true);
}

private static int mandelbrot(float j, float k) {
int t = 0;
float norm = 0;
float x = 0;
float y = 0;
float r = xMin + (j * xStep);
float i = yMin + (k * yStep);
while (t < maxIter && norm < 4) {
x = (x*x) - (y*y) + r;
y = (2*x*y) + i;
norm = (x*x) + (y*y);
t++;
}
return t;
}

Mandelbrot Set

我还更改了 Julia 集的代码(从数字 0.45 + 0.1428i),它产生了同样有问题的内容:
Julia Set

最佳答案

这是您的迭代循环,这是不正确的。

while (t < maxIter && norm < 4) {
x = (x*x) - (y*y) + r;
y = (2*x*y) + i;
norm = (x*x) + (y*y);
t++;
}

在重新使用x 计算y 之前,您将覆盖它。我建议使用临时变量,例如

while (t < maxIter && norm < 4) {
tempx = (x*x) - (y*y) + r;
y = (2*x*y) + i;
x = tempx;
norm = (x*x) + (y*y);
t++;
}

旁白:还有提高效率的空间,因为您要计算 x*xy*y 两次。

关于java - 在 Java 中以图形方式表示 Mandelbrot 和 Julia 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37404189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com