如何放大 mandelbrot 或 julia 集中的光标位置?
How do I zoom on cursor position in mandelbrot or julia set?
我目前正在编写一个分形浏览器,但在缩放集中的某个点时卡住了。例如,我的 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) 确定的点。
不加区别地进行整数除法是非常糟糕的想法:
2 / zoom_factor
如果 zoom_factor
大于 2, 将 return 0。将 2
替换为 2.0
以强制进行浮点除法,这应该足以修复代码。
如果我解释正确,您希望屏幕 window 代表坐标或分形平面中的正方形,其宽度和高度 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
是朱莉娅分形所在的笛卡尔平面坐标。端点映射是
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
我目前正在编写一个分形浏览器,但在缩放集中的某个点时卡住了。例如,我的 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) 确定的点。
不加区别地进行整数除法是非常糟糕的想法:
2 / zoom_factor
如果 zoom_factor
大于 2, 将 return 0。将 2
替换为 2.0
以强制进行浮点除法,这应该足以修复代码。
如果我解释正确,您希望屏幕 window 代表坐标或分形平面中的正方形,其宽度和高度 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
是朱莉娅分形所在的笛卡尔平面坐标。端点映射是
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