Julia 设置渲染代码

Julia Set rendering code

我正在研究逃逸时间分形作为我的 12 年级项目,将使用 c++ 编写,使用简单的 graphics.h 库,该库已过时但似乎足够了。 生成 Mandelbrot 集合的代码似乎可以工作,我假设 Julia 集合是相同的变体。这是代码: (这里,fx 和 fy 只是将实际的复杂坐标(如 (-0.003,0.05))转换为屏幕上像素的实际值的函数。)

int p;
x0=0, y0=0;
long double r, i;
cout<<"Enter c"<<endl;
cin>>r>>i;
for(int i= fx(-2); i<=fx(2); i++)
{
    for(int j= fy(-2); j>=fy(2); j--)
    {
        long double x=0.0, y= 0.0,t;
        x= gx(i), y= gy(j);
        int k= -1;

        while(( x*x + y*y <4)&& k<it-1)
        {
            t= x*x - y*y + r;
            y= 2*x*y + i ;
            x=t;
            k++;

        }
        p= k*pd;
        setcolor(COLOR(colour[p][0],colour[p][1],colour[p][2]));
        putpixel(i,j,getcolor());
    }
}

不过好像不是这样的。输出 window 显示了整个半径为 2 的圆,其颜色对应于 1 次迭代的逃逸时间。

此外,在尝试寻找此问题的解决方案时,我发现其他人使用的所有算法都会像这样初始化初始坐标:

x = (col - width/2)*4.0/width;
y = (row - height/2)*4.0/width;

有人可以解释一下我遗漏了什么吗?

我猜主要是变量i(虚部)被循环变量i错误地覆盖了。所以行

y= 2*x*y + i;

给出了错误的结果。该变量应重命名为 im。更正后的版本附在下面,由于我没有graphics.h,所以我使用屏幕作为输出。

#include <iostream>
using namespace std;

#define WIDTH  40
#define HEIGHT 60

/* real to screen */
#define fx(x) ((int) ((x + 2)/4.0 * WIDTH))
#define fy(y) ((int) ((2 - y)/4.0 * HEIGHT))

/* screen to real */
#define gx(i) ((i)*4.0/WIDTH - 2)
#define gy(j) ((j)*4.0/HEIGHT - 2)

static void julia(int it, int pd)
{
  int p;
  long double re = -0.75, im = 0;
  long double x0 = 0, y0 = 0;

  cout << "Enter c" << endl;
  cin >> re >> im;
  for (int i = fx(-2.0); i <= fx(2.0); i++)
  {
      for (int j = fy(-2.0); j >= fy(2.0); j--)
      {
          long double x = gx(i), y = gy(j), t;
          int k = 0;

          while (x*x + y*y < 4 && k < it)
          {
              t = x*x - y*y + re;
              y = 2*x*y + im;
              x = t;
              k++;
          }
          p = (int) (k * pd);
          //setcolor(COLOR(colour[p][0],colour[p][1],colour[p][2]));
          //putpixel(i,j,getcolor());
          cout << p; // for ASCII output
      }
      cout << endl; // for ASCII output
  }
}

int main(void)
{
  julia(9, 1);
  return 0;
}

输入 -0.75 0 的输出如下所示。

0000000000000000000000000000000000000000000000000000000000000
0000000000000000000001111111111111111111000000000000000000000
0000000000000000011111111111111111111111111100000000000000000
0000000000000001111111111111111111111111111111000000000000000
0000000000000111111111111122222222211111111111110000000000000
0000000000011111111111122222349432222211111111111100000000000
0000000001111111111112222233479743322222111111111111000000000
0000000011111111111222222334999994332222221111111111100000000
0000000111111111112222223345999995433222222111111111110000000
0000011111111111122222234479999999744322222211111111111100000
0000011111111111222222346899999999986432222221111111111100000
0000111111111111222223359999999999999533222221111111111110000
0001111111111112222233446999999999996443322222111111111111000
0011111111111112222233446999999999996443322222111111111111100
0011111111111122222333456899999999986543332222211111111111100
0111111111111122223334557999999999997554333222211111111111110
0111111111111122233345799999999999999975433322211111111111110
0111111111111122233457999999999999999997543322211111111111110
0111111111111122334469999999999999999999644332211111111111110
0111111111111122345999999999999999999999995432211111111111110
0111111111111122379999999999999999999999999732211111111111110
0111111111111122345999999999999999999999995432211111111111110
0111111111111122334469999999999999999999644332211111111111110
0111111111111122233457999999999999999997543322211111111111110
0111111111111122233345799999999999999975433322211111111111110
0111111111111122223334557999999999997554333222211111111111110
0011111111111122222333456899999999986543332222211111111111100
0011111111111112222233446999999999996443322222111111111111100
0001111111111112222233446999999999996443322222111111111111000
0000111111111111222223359999999999999533222221111111111110000
0000011111111111222222346899999999986432222221111111111100000
0000011111111111122222234479999999744322222211111111111100000
0000000111111111112222223345999995433222222111111111110000000
0000000011111111111222222334999994332222221111111111100000000
0000000001111111111112222233479743322222111111111111000000000
0000000000011111111111122222349432222211111111111100000000000
0000000000000111111111111122222222211111111111110000000000000
0000000000000001111111111111111111111111111111000000000000000
0000000000000000011111111111111111111111111100000000000000000
0000000000000000000001111111111111111111000000000000000000000
0000000000000000000000000000000000000000000000000000000000000

能否请您说明如何使用这些 graphics.h 库显示图像

//设置颜色(颜色(颜色[p][0],颜色[p][1],颜色[p][2])); //putpixel(i,j,getcolor());