【问题标题】:Julia Set rendering codeJulia Set 渲染代码
【发布时间】:2015-11-29 00:48:41
【问题描述】:

我正在研究逃逸时间分形作为我的 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());
    }
}

但情况似乎并非如此。输出窗口显示整个半径为 2 的圆,颜色对应于 1 次迭代的转义时间。

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

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

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

【问题讨论】:

  • 您有工作的 Mandelbrot 发电机吗?将其修改为 Julia 涉及将变量更改为常量。如果减少循环变量,这个(int j= fy(-2); j&gt;=fy(2); j--) 将如何循环?这将表明fy(-2) 大于fy(2)
  • @karatedog 不,在 BGI 窗口中,(0.0) 是左上角,(width, height) 是右下角。所以从 y= -2 到 y= +2,你必须减少 j 的值。是的,我有一个可以工作的 Mandelbrot 集合生成器。
  • it 的值是多少?我建议通常,当您调试模拟每个输入数据并使用常量值而不是变量时(例如将 it 替换为 50)
  • @karatedog ,it 是用户输入的任何值,从 1 到 1275 的任意位置。我有一个 1275 种颜色的数组 [需要改进,但现在可以正常工作 [the曼德布罗集] ] .
  • 如果你有一个有效的 Mandlebrot 集,然后在迭代中修改这部分:z = z^2 + cz = z^2 + &lt;constant&gt;,你就完成了。我在这里有一个不同问题的答案(但你会明白的):stackoverflow.com/a/29984188/216248

标签: c++ iteration complex-numbers fractals


【解决方案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

【讨论】:

  • 是的,这正是问题所在[对我来说是一个非常愚蠢的问题]。非常感谢您指出!
  • @Sh.A.不客气。总是享受一点分形程序。 :-)
【解决方案2】:

请您告诉您如何使用这些 graphics.h 库显示图像

//setcolor(COLOR(color[p][0],colour[p][1],colour[p][2])); //putpixel(i,j,getcolor());

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2015-08-09
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多