C 如何在mandelbrot或julia集中缩放光标位置?

C 如何在mandelbrot或julia集中缩放光标位置?,c,math,fractals,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 < en

我现在正在写一个分形探索者,我被困在集中某个点的缩放上。例如,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;
}

因此,我得到了一个缩小的值,它是分形存在的时间间隔的一部分,根据迭代次数,我为特定像素指定了一种颜色。通过将两端除以一个因子,使实际间隔(-2,2)变小,缩放效果良好。这是可行的,但我似乎不知道如何在中心以外的某个点放大。我可以通过在实部和虚部(x,y)上加一个数字来移动并最终到达该点,但我不能放大由光标位置给我的屏幕(x,y)确定的点。

不加选择地进行整数除法是一个非常糟糕的想法:

2 / zoom_factor
如果缩放系数大于2,则返回0。将
2
替换为
2.0
以强制浮点除法,这应足以修复代码


如果我正确解释了这一点,您希望屏幕窗口在坐标或分形平面中表示一个正方形,其宽度和高度
4.0/缩放系数
围绕点
(mv\u x,mv\u y)

mv
位于
WIN\u 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\u 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 

在何处以及如何设置
((int*)参数)
值?这些为您提供了
x
的起始值和结束值;您的相对水平光标位置可以立即从中计算出来。(虽然我不知道为什么你不对
y
做同样的操作)这不仅有助于将你的计算可视化为缩放,也有助于将计算可视化为平移。这只是为了将工作分成4等分,这样我就可以使用多个线程(如果我有600个像素,第一个线程会显示像素0到150,依此类推),我有光标x和y,因为当用户滚动时,会调用一个函数。我的问题是如何将缩放发生的点从分形的中心更改为光标所在的任何点。您能否以另一种方式调试或输出
(mv_x,mv_y)
中使用的
julia_thread
的实际值?对于zoom_因子1或2,它应该按预期工作,对于所有其他的,它应该根本不工作,返回一个单色正方形。什么是分形维数(这是一个标准的数学概念,也称为Hausdorff维数)?但是你是对的,以前的版本会给出从
mv-0.5/缩放因子
mv-0.5/缩放因子
的真实坐标,这与规定的像素大小相矛盾。现在从
mv-(0.5*WIN\u SIZE)/zoom\u factor
mv+(0.5*WIN\u SIZE)/zoom\u factor
。你的指控在哪里?分形是向量空间中的一个点集,在某些变换下具有自相似性。计算机图形学中称之为Julia或Mandelbrot集的是这些分形集的某种彩色距离映射。正方形[-2,2]×[-2,2]或[-2.5,1.5]×[-2,2]是这些颜色贴图的视口,第一个通常用于完整的Julia,第二个用于完整的Mandelbrot集。
coord = (4.0*value)/(zoom*WIN_SIZE) + center - 2.0/zoom
      = ( (4.0*value)/WIN_SIZE - 2.0 )/zoom + center