当前位置: 首页 > 知识库问答 >
问题:

Java Mandelbrot关于缩放和着色的可视化问题

巫马昆杰
2023-03-14

我试图在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的值,但是无论我尝试什么,它似乎都不起作用。缩放总是在一段时间后减速,或者它最终会放大集合中的一部分,而不是边框。我试着在每次计时器滴答时将它们乘以一些比例因子,但这并不能真正产生我想要的结果。

现在我对这个问题有两个问题。

  1. 这是可视化集合和放大(绘制、更改范围、重画)的正确方法吗

当然,当视觉化的东西,你需要得到一些实际的视觉的东西。在本例中,我希望以类似于您在此处看到的方式对集合进行着色:(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));
    }

然后,我只填写数组中的迭代量,并将颜色分配给像素。对此我有两个问题:

  1. 当我们以前面描述的方式放大分形时,这也会起作用吗
  2. 我如何在这张图中添加我自己的配色方案?我读过一些关于“线性插值”的书,但我真的不明白它是什么,以及它对我有什么帮助

共有1个答案

古扬
2023-03-14

听起来你已经有了一个好的开始。

关于第一个问题:我相信有一些方法可以自动选择场景中“有趣”的部分来放大,但我不知道它们是什么。我敢肯定,这不仅仅是将一些线性函数应用于当前的边框,这听起来像是您正在做的事情。

因此,您可以尝试找出这些方法是什么(可能会在数学上变得复杂),但是如果您是编程新手,您可能会发现让用户选择缩放位置更容易。这在开始时也更有趣,因为你可以重复运行你的程序,每次都可以探索集合的新部分。

一种简单的方法是让用户在图像上绘制一个矩形,并使用您的map函数将绘制矩形的像素坐标转换为缩放区域的新的真实和虚构坐标。

您也可以将这两种方法结合起来:一旦您通过手动选择缩放区域找到了您感兴趣的地方,您可以将其设置为您的“最终目的地”,并让代码逐渐平滑地缩放到其中,以创建一部精彩的电影。

当您开始使用更精确的坐标时,它总是会逐渐变慢,直到您达到双精度的极限,它变成了一个像素化的混乱。从那里,如果您想进一步放大,您将不得不查看带有BigDecimal的任意精度算术,并且它将继续变得越来越慢。

关于第二个问题:首先计算每个像素的numIterations/maxIterations(即介于0和1之间)值是正确的想法(我认为这基本上就是您正在做的)。

从那里,有各种各样的方法将此值转换为颜色,是时候发挥创意了!

一个简单的方法是有几个非常不同的颜色数组。例如,如果你有白色(0.0)、红色(0.25)、绿色(0.5)、蓝色(0.75)、黑色(1.0),那么如果你计算的数字正好是列出的数字之一,你会使用相应的颜色。如果介于两者之间,您可以混合颜色,例如,对于0.3,您可以选择:

((0.5-0.3)*red + (0.3-0.25)*green) / (0.5 - 0.25)
= 0.8*red + 0.2*green

将两种颜色的加权平均值作为练习;)(提示:分别取r、g和b值的平均值。使用alpha值也可能有效)。

另一种方法是,如果你想获得更多的数学知识,那就是取一个螺旋线方程,用它来计算HSB颜色空间中平面上的一个点(你可以将亮度保持在某个固定值,比如1)。事实上,如果你将坐标解释为某个颜色空间中的点,那么你知道如何将2D或3D中的任何曲线写成一个实数变量的方程,就可以通过这种方式给你平滑变化的颜色。

希望这足以让你继续前进!如果不清楚,请告诉我。

 类似资料:
  • 我们可以使用readResolve和WriteReplace方法来指定可外部化实例和可序列化实例的替换对象…… 只是想知道几件事: 1)对于可序列化的类,readObject(ObjectInputStream is)和writeObject(ObjectOutputStream OS)方法可以与readResolve()和writeReplace()结合使用吗?是否可以替换对象,然后使用read

  • 我想要一个显示阿尔巴尼亚2000年所有疾病数量的柱状图。 我试过了,但我得不到我想要的。

  • 问题内容: 我需要实现变焦为包含在。我已经通过覆盖方法和调用来成功进行缩放。 这是不正常:对的和的规模如预期,但一定会得到的和这样的寄存器在预分频的位置。我能做什么?感谢您的阅读。 问题答案: 显示了如何使用明确的转化方法扩展鼠标坐标:,,和。)。

  • 来自请求率和性能指南-Amazon Simple Storage Service: Amazon S3会自动扩展到高请求率。例如,您的应用程序可以在存储桶中的每个前缀每秒至少实现3,500个PUT/POST/DELETE和5,500个GET请求。存储桶中的前缀数量没有限制。以指数方式提高您的读取或写入性能很简单。例如,如果您在Amazon S3存储桶中创建10个前缀以并行化读取,您可以将读取性能扩

  • 我正在设计授权服务。它根据分配给用户的角色和对内容设置的权限执行访问控制。用户可以属于多个组。这些组也可以属于其他组。一组下一组下一组的深度不是那么大。内容可以在用户级或组级共享。内容也可以与多个组共享。允许对内容执行的操作有或。 以下是我对上述问题设计解决方案的想法。问题是,它看起来很简单。我担心我遗漏了一些会影响设计性能或可伸缩性的要点。这是设计图。 数据存储:每个用户可以有多个角色。角色是字

  • 我试图为我的TextView创建一个圆形背景,所以我创建了如下所示的形状样式。但是我需要有多种颜色和多种大小(而textSize保持不变),所以我需要设置样式中的宽度/高度。 根据我的理解…图层列表把所有的形状放在另一个上面?因为我需要在不同的地方调用它12次,所以拥有12个形状样式的XMLS似乎相当麻烦。