2015-11-29 7 views
1

Я работаю над фракталами времени эвакуации в качестве моего проекта 12-го класса, который должен быть написан на C++, используя простую графическую библиотеку.h, которая устарела, но кажется достаточной. Код для создания набора Мандельброта, похоже, работает, и я предположил, что наборы Джулии будут вариацией одного и того же. Вот код: (. Здесь, 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

У вас есть рабочий генератор Мандельброта? Изменение его к Джулии связано с изменением переменной на константу. И как будет этот цикл (int j = fy (-2); j> = fy (2); j -) ', если вы уменьшите переменную цикла? Это означает, что 'fy (-2)' больше, чем 'fy (2)'. – karatedog

+0

@karatedog no, в окне BGI, (0.0) - верхний левый, а (ширина, высота) - нижний правый. поэтому, чтобы перейти от y = -2 к y = +2, вам придется уменьшить значение j. И да, у меня есть работающий генератор множества Мандельброта. –

+0

Какова ценность 'it'? Я бы предложил обычный, в то время как вы отлаживаете макеты всех входных данных и используете постоянные значения вместо переменных (например, заменяете 'it' на 50) – karatedog

ответ

1

Я полагаю, что основная проблема заключается в том, что переменная i (мнимая часть) ошибочно переопределяется переменной цикла i. Поэтому строка

y= 2*x*y + i; 

дает неверный результат. Эта переменная должна быть переименована, например, im. Скорректированная версия приведена ниже, так как у меня нет графика. Я использовал экран в качестве вывода.

#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

И тогда, фрактал горящего корабля также совпадает с мандельбротом, за исключением того, что берутся абсолютные значения x и y –