Julia Установить код рендеринга

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

Может кто-нибудь объяснить, что я упускаю?


person Sh.A    schedule 29.11.2015    source источник
comment
У вас есть работающий генератор Мандельброта? Изменение его на Julia включает изменение переменной на константу. И как будет работать этот (int j= fy(-2); j>=fy(2); j--) цикл, если вы уменьшите переменную цикла? Это будет означать, что fy(-2) больше, чем fy(2).   -  person karatedog    schedule 29.11.2015
comment
@karatedog нет, в окне BGI (0.0) — это верхний левый угол, а (ширина, высота) — нижний правый. поэтому, чтобы перейти от y= -2 к y= +2, вам придется уменьшить значение j. И да, у меня есть рабочий генератор множества Мандельброта.   -  person Sh.A    schedule 29.11.2015
comment
Каково значение it? Я бы предложил обычное, пока вы отлаживаете, имитируйте все входные данные и используйте постоянные значения вместо переменных (например, замените it на 50)   -  person karatedog    schedule 29.11.2015
comment
@karatedog, it - это любое значение, введенное пользователем, в любом месте от ч/б от 1 до 1275. У меня есть массив из 1275 цветов [требуется улучшение, но пока работает нормально [набор Мандельброта]] .   -  person Sh.A    schedule 30.11.2015
comment
Если у вас есть рабочий набор Mandlebrot, измените эту часть в итерации: z = z^2 + c на z = z^2 + <constant>, и все готово. У меня есть ответ на другой вопрос (но вы поймете): stackoverflow.com/a/29984188/216248   -  person karatedog    schedule 30.11.2015


Ответы (2)


Я предполагаю, что основная проблема заключается в том, что переменная 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
person Community    schedule 02.12.2015
comment
Да, именно в этом была проблема [очень глупая с моей стороны]. Большое спасибо, что указали на это! - person Sh.A; 05.12.2015
comment
@Ш.А. Пожалуйста. Всегда наслаждайтесь небольшой фрактальной программой. :-) - person hbp; 07.12.2015

не могли бы вы рассказать, как вы отображаете изображение с помощью этой библиотеки graphics.h

//setcolor(COLOR(color[p][0],color[p][1],color[p][2])); // поместите пиксель (i, j, getcolor ());

person hassan anwar    schedule 09.05.2020