2

我使用 JComponent 在 Java 中编写了 Mandelbrot 集的实现,但是在渲染它时却得到了奇怪的结果。除此之外,一切都编译正确。我只是不确定我做错了什么。任何代码审查也将不胜感激。

我的来源发布在 pastebin 上,因为它在这里会占用太多空间:

JMandelbrot.java Mandelbrat.java

4

3 回答 3

4

问题:

  • 图像与我对代码的期望一样。Mandelbrot 集的直径为 2,因此您只能在中间看到一些像素。

解决方案:

  • 更改renderPoint方法以接受double参数并调用它renderPoint((x - h)/100.0, (k - y)/100.0)以查看更有趣的内容。
  • 更改迭代次数和颜色编码,因为现在您要为每个内部像素计算 255^3 次迭代。renderPoint通过更改toreturn (((r << 16) | (g << 8) | b)<<4)和 setting的返回值,我设法看到了一些不错的东西MaxColorBit = 16

代码审查:

  • (int)Math.floor(Width / 2)可以用 代替Width / 2,因为那是整数除法。
  • 您应该以小写字母 ( Widthand ) 开头属性,因为这是有助于区分类和属性的 Java 约定。Heightwidthheight
  • iterations不使用该属性。
于 2010-04-26T20:55:17.657 回答
2
  • 你正确地绘制了分形,但它真的很小。整个 Mandelbrot 集适合半径为 2 的圆,因此它几乎不会覆盖 400x500 窗口中间的几个像素。

    您应该设计某种从屏幕窗口(从(0,0)(width,height))到复平面的映射,它的值应该在-2-2ito2+2i左右。一个快速的解决方法是在将x-handk-y表达式100传递给 之前将它们除以renderPoint,并更改renderPointfromint到的参数double。最好是指定所需的查看矩形并使用它来确定映射。

  • 您正在 GUI 线程中计算分形图像。这是一个禁忌,因为在窗口完成打开之前应用程序似乎会挂起。我会将render()构造函数中的调用更改为如下所示:

    new Thread() {
      public void run() { render(); }
    }.start();
    
于 2010-04-26T20:50:23.380 回答
0

看看这个使用 Marvin 的 Mandelbrot 分形渲染示例:http: //marvinproject.sourceforge.net/en/plugins/mandelbrot.html

还有一个用于 Julia 集渲染的插件:http: //marvinproject.sourceforge.net/en/plugins/juliaSet.html

于 2011-04-19T00:10:53.513 回答