我使用JComponent编写了Java中的Mandelbrot集合的实现,但是在渲染时我得到了奇怪的结果。除此之外,一切都编译正确。我只是不确定我在做什么错。任何代码审查也将不胜感激。帮助渲染Java中的Mandelbrot集合
我的源通发布引擎收录,因为它会在这里占用太多的空间:
JMandelbrot.java Mandelbrat.java
我使用JComponent编写了Java中的Mandelbrot集合的实现,但是在渲染时我得到了奇怪的结果。除此之外,一切都编译正确。我只是不确定我在做什么错。任何代码审查也将不胜感激。帮助渲染Java中的Mandelbrot集合
我的源通发布引擎收录,因为它会在这里占用太多的空间:
JMandelbrot.java Mandelbrat.java
问题:
解决方案:
renderPoint
方法接受double
参数并把它作为renderPoint((x - h)/100.0, (k - y)/100.0)
看到更有趣的东西。renderPoint
返回return (((r << 16) | (g << 8) | b)<<4)
并设置MaxColorBit = 16
,我设法看到了一些不错的东西。代码评审:
(int)Math.floor(Width/2)
可以通过Width/2
被替换,因为这是一个整数除法。width
和height
)开始属性Width
和Height
,因为这是一个Java约定,它有助于区分类和属性。iterations
属性未使用。你正确绘制的分形,但它是非常小的。整个Mandelbrot集适合半径为2的圆,所以它几乎不会覆盖400x500窗口中间的几个像素。
你应该制定某种从屏幕窗口(肚里从(0,0)
到(width,height)
)映射到复平面上,它应该在的-2-2i
附近值2+2i
左右。快速解决方案是将x-h
和k-y
表达式除以100
,然后再将它们传递给renderPoint
,并将renderPoint
的参数从int
更改为double
。最好的办法是指定所需的查看矩形并使用它来确定映射。
您正在计算GUI线程中的分形图像。这是一个禁忌,因为在窗口打开之前,应用程序会挂起。我想改变的render()
调用构造函数看起来像这样:
new Thread() {
public void run() { render(); }
}.start();
+1建议使用一个单独的线。但在这种情况下,必须在render()完成后请求'repaint()',否则计算的图像将不会显示:public void run(){render();重绘(); }' – 2010-04-26 21:17:55
是的,虽然我会在每行完成后重新绘制。 – 2010-04-26 21:28:19
看看曼德尔布罗分形呈现本例中使用马文: http://marvinproject.sourceforge.net/en/plugins/mandelbrot.html
还为朱莉娅插件组呈现: http://marvinproject.sourceforge.net/en/plugins/juliaSet.html
非常感谢。但是,你能否在回报线上解释额外的4点移动? – SDLFunTimes 2010-04-26 21:31:45
这是我的快速和肮脏的颜色编码黑客,因为否则图像会太黑看不到(尝试它)。通常的颜色编码如下:计算迭代直到停止条件成立或达到预定义的迭代计数。你拿出实际执行的迭代次数。该数字被用作颜色表(“调色板”)的索引。调色板通常包含一个或多个颜色的平滑渐变。以http://commons.wikimedia.org/wiki/File:Mandelbrot_palette_colour_editing_with_Fractint.png为例。 – 2010-04-26 21:40:01