【发布时间】:2023-03-03 02:33:02
【问题描述】:
我现在正在编写一个分形探索器,但在放大场景中的某个点时卡住了。例如,我的 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) 确定的点。
【问题讨论】:
-
在哪里以及如何设置
((int *)param)值?这些为您提供x的起始值和结束值;您可以立即从中计算出您的相对水平光标位置。 (虽然我不确定您为什么不对y做同样的事情。)它有助于将您的计算可视化为不仅是 zoom 而是作为 translation好吧。 -
这只是为了将工作分成 4 个相等的部分,这样我就可以使用多个线程(如果我有 600 个像素,第一个线程执行像素 0 到 150 等等),我有光标 x和 y 因为当用户滚动时调用一个函数。我的问题是如何将缩放发生的点从分形的中心更改为光标所在的任何点。
-
您能否以另一种方式调试或输出
(mv_x,mv_y)的实际值在julia_thread中使用的是什么?对于 zoom_factor 1 或 2,它应该按预期工作,对于所有其他的,它根本不应该工作,返回一个单色方块。