如何在mandelbrot或julia中放大光标位置?

时间:2016-01-18 10:41:58

标签: c math fractals

我现在正在写一个分形探险家,而我却被困在缩放集合中的某一点。例如,Julia集的绘图功能如下所示:

void *julia_thread(void *param)
{
    int x, y, temp;
    long double re, aux, im;
    int start = ((int *)param)[0];
    int end = ((int *)param)[1];
    int iterations;


    for (x = start; x < end; x++)
        for (y = 0; y < WIN_SIZE; y++)
        {
            re = range_change(zoom_factor, x, mv_x);
            im = range_change(zoom_factor, y, mv_y);
            iterations = 0;
            while (!blowing_up(re, im) && iterations < max_iter)
            {
                aux = re;
                re = re * re - im * im + re_c;
                im = 2 * aux * im + im_c;
                iterations++;
            }
            put_pixel(img, x, y, color_table[iterations]);
        }
    return NULL;
}

计算Z的实部和虚部的初始值的函数是:

long double range_change(long double zoom_factor, int value, long double mv)
{
    long double newmax = 2 / zoom_factor;
    long double newmin = -2 / zoom_factor;

    return ((long double)value * (newmax - newmin)) / WIN_SIZE + newmin + mv;
}

因此,我获得了缩小值,该值是分形存在的间隔的一部分,并且根据迭代次数,我为该特定像素指定了颜色。通过将两个末端除以一个因子来使实际间隔(-2,2)变小,缩放工作正常。这有效,但我似乎无法弄清楚如何放大除中心以外的某个位置。我可以通过向实数和虚数部分(x,y)添加一个数字来移动并到达那个点,但是我不能放大由光标给我的屏幕(x,y)确定的点。位置。

1 个答案:

答案 0 :(得分:1)

做出不加思索的整数除法是一个非常糟糕的想法:

2 / zoom_factor
如果zoom_factor大于2,

将返回0.将2替换为2.0以强制浮点除法,这应该足以修复代码。

如果我正确解释了这一点,您希望屏幕窗口代表坐标或分形平面中的正方形,其宽度和高度4.0/zoom_factor围绕点(mv_x, mv_y)

mv位于WIN_SIZE/2,因此

coord = mv + ( 4*value/WIN_SIZE - 2 )/zoom_factor

可以完全按照这个

实现
return mv + ( (4.0*value)/WIN_SIZE - 2.0 )/zoom_factor;

并且使用因子4.0,分母得到double类型,除法以double形式执行。

缓慢推导

range_change想要实现的功能是坐标的线性变化

coord = A*screen + B

其中screen是输入屏幕坐标,coord是笛卡尔平面中作为Julia分形主机的坐标。端点映射是

screen=0         --> coord = center - 2.0/zoom
screen=WIN_SIZE  --> coord = center + 2.0/zoom

从第一次开始,我们阅读B=center - 2.0/zoom和第二个公式

A*WIN_SIZE + center - 2.0/zoom = center + 2.0/zoom
A*WIN_SIZE                     =          4.0/zoom
A = 4.0/(zoom*WIN_SIZE)

给出了转换公式

coord = (4.0*value)/(zoom*WIN_SIZE) + center - 2.0/zoom
      = ( (4.0*value)/WIN_SIZE - 2.0 )/zoom + center