2015-11-29 155 views
1

我正在研究逃逸时间分形作为我的12年级项目,用C++编写,使用简单的graphics.h库已经过时但似乎足够了。 生成Mandelbrot集合的代码似乎有效,我假定Julia集合将是相同的变体。下面是代码: (这里,fx和fy是简单地起到将实际复杂坐标等(-0.003,0.05)转换为屏幕上的像素的实际值)Julia设置渲染代码

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()); 
    } 
} 

但这似乎并非如此。输出窗口显示半径= 2的整个圆,其颜色对应于1次迭代的逸出时间。

此外,在试图寻找一个解决这个问题,我已经看到了所有的算法其他人使用有点初始化初始坐标如下:

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

有人能解释一下我错过了吗?

+0

你有一个Mandelbrot发电机吗?将其修改为Julia涉及将变量更改为常量。如果你减少了循环变量,这个'(int j = fy(-2); j> = fy(2); j - )'循环如何?这会表明'fy(-2)'大于'fy(2)'。 – karatedog

+0

@karatedog否,在BGI窗口中,(0.0)是左上角,(宽度,高度)是右下角。所以要从y = -2到y = +2,你必须减少j的值。是的,我有一个Mandelbrot集合发电机。 –

+0

'it'的价值是什么?我建议通常,当你正在调试模拟每一个输入数据,并使用常量值而不是变量(比如用50代替'it') – karatedog

回答

1

我猜测主要问题是变量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 
+0

是的,这正是问题[我的一个非常愚蠢的问题]。非常感谢您指出! –

+0

@ Sh.A。别客气。总是享受一点分形程序。 :-) – hbp

+0

然后,燃烧的船的分形也与mandelbrot相同,除了x和y的绝对值被采用 –