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

Java Mandelbrot关于缩放和着色的可视化问题,java,mandelbrot,Java,Mandelbrot,我正在尝试用java为Mandelbrot集合编写一个可视化程序,有几件事我正在努力编写。我意识到围绕这个主题的问题已经被问了很多,网上有很多文档,但是很多事情看起来非常复杂,我对编程相对来说是个新手 第一期 我的第一个问题是放大分形。我的目标是对分形进行“无限”缩放(当然不是无限的,只要普通计算机在计算时间和精度方面允许)。我目前采用的方法是以下计时器: 在实轴(-2,2)和虚轴(2,2)范围内使用一定次数的迭代绘制集合 将这些范围更改为放大 使用迭代次数重新绘制集合的该部分 这是我挣扎的

我正在尝试用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);
for(int-Py=beginY;Py
Px和Py是图像中像素的坐标。图像为1000x1000。贴图函数取一个数字,在本例中为Px或Py,范围为(0,1000),并在范围(-2,2)上均匀地对其进行划分,因此它返回该范围内的相应值

我认为为了放大,我必须在计时器中以某种方式更改-2和2的值,但无论我尝试什么,它似乎都不起作用。缩放总是在一段时间后变慢,或者它最终会放大集合中的一部分,而不是边框。我试着在每个计时器中将它们乘以一些比例因子ck,但这并没有真正产生我想要的结果

现在我有两个关于这个问题的问题

  • 这是可视化集合和放大(绘制、更改范围、重画)的正确方法吗
  • 如果是,我如何正确地放大一个有趣的区域,即使在运行一分钟后也能正确地放大
  • 第二个问题 当然,当视觉化的东西,你需要得到一些实际的视觉的东西。在这种情况下,我想颜色设置的方式类似于你在这里看到:()

    我的猜测是,你已经使用了一个像素在跳出循环之前经过的迭代次数来给它一些颜色值。然而,我只知道如何使用黑白配色方案来实现这一点。我尝试制作一个颜色数组,从我是黑色的,以白色结尾。这是我的代码:

    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));
        }
    
    Color[]colors=新颜色[maxIterations+2];
    for(int i=0;i
    然后我在数组中填入迭代次数,并将该颜色分配给像素。关于这一点,我有两个问题:

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

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

    第一个问题:我相信有一些方法可以自动选择要放大的集合中“有趣”的部分,但我不知道它们是什么。我很确定这不仅仅是对当前的边界矩形应用一些线性函数,这听起来像是你在做的

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

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

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

    当你开始使用越来越精确的坐标时,它总是会逐渐变慢,直到你用
    double
    达到精度极限,它就会变成一个像素化的混乱。从那里开始,如果你想进一步放大,你必须用
    bigdecime
    研究任意精度的算法,它将继续变为get越来越慢

    关于第二个问题:首先计算每个像素的
    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值也可能有效)

    如果你愿意的话,再来一杯