【发布时间】:2018-11-19 19:25:40
【问题描述】:
我正在尝试为 Java 中的 Mandelbrot 集编写可视化程序,并且有几件事我正在努力编程。我意识到围绕这个主题的问题被问了很多,网上有很多文档,但是很多事情看起来很复杂,而且我对编程还比较陌生。
第一期
我遇到的第一个问题是放大分形。我的目标是在分形上进行“无限”缩放(当然不是无限的,只要普通计算机允许计算时间和精度)。我目前正在采用的方法是计时器上的以下内容:
- 在实轴范围 (-2, 2) 和虚轴范围 (2, 2) 上使用一定次数的迭代绘制集合。
- 更改这些范围以放大。
- 根据迭代次数重新绘制集合的该部分。
这是我挣扎的第二步。这是我当前的代码:
for (int Py = beginY; Py < endY; Py++) {
for (int Px = beginX; Px < endX; Px++) {
double x0 = map(Px, 0, height,-2, 2);
double y0 = map(Py, 0, width, -2, 2);
Px 和 Py 是图像中像素的坐标。图像为 1000x1000。 map 函数接受一个范围为 (0, 1000) 的数字,在本例中为 Px 或 Py,并将其平均分配在 (-2, 2) 范围内,因此它返回该范围内的相应值。
我认为为了放大,我必须通过某种方式在计时器中更改 -2 和 2 值,但无论我尝试什么,它似乎都不起作用。缩放总是会在一段时间后变慢,或者最终会放大集合中的一部分,而不是边界。我尝试在每个计时器滴答声中将它们乘以某个比例因子,但这并不能真正产生我想要的结果。
现在我有两个关于这个问题的问题。
- 这是对集合进行可视化和放大(绘制、更改范围、重绘)的正确方法吗?
- 如果是,我如何正确放大有趣的区域,并且即使在运行一分钟后仍能正常放大?
第二期
当然,在可视化某些东西时,您需要获得一些实际的视觉效果。在这种情况下,我想以类似于您在此处看到的方式为集合着色:(https://upload.wikimedia.org/wikipedia/commons/f/fc/Mandel_zoom_08_satellite_antenna.jpg)。
我的猜测是,您已经使用了一个像素在跳出循环之前所经历的迭代量来赋予它一些颜色值。但是,我只知道如何使用黑白配色方案来做到这一点。我尝试制作一个颜色数组,它包含与最大迭代量相同数量的不同灰色颜色,从黑色开始,以白色结束。这是我的代码:
Color[] colors = new Color[maxIterations + 2];
for (int i = 0; i < colors.length; i++) {
colors[i] = new Color((int)map(i, 0, maxIterations + 2, 0, 255),
(int)map(i, 0, maxIterations + 2, 0, 255),
(int)map(i, 0, maxIterations + 2, 0, 255));
}
然后我只是在数组中填充了迭代次数并将该颜色分配给像素。我对此有两个问题:
- 当我们以前面描述的方式放大分形时,这是否也有效?
- 如何添加我自己的配色方案,如图所示?我已经阅读了一些有关“线性插值”的内容,但我并不真正了解它是什么以及它可以以何种方式帮助我。
【问题讨论】:
-
在计算机上无法进行无限缩放,但您可以缩放直到失去精度。 64 位 IEEE 浮点数为您提供 18 位精度。
-
@duffymo 是的,你是对的。我的目标只是进行缩放,直到由于这些或类似的限制而无法再缩放。我会在帖子中澄清这一点。
-
我已经用 Java 完成了,但我无法访问我在工作中保存的 BitBucket 存储库。我会尽量记住稍后发布。
标签: java mandelbrot