Фрактальная графика
От: algoritm256  
Дата: 05.02.12 10:28
Оценка:
Здравствуйте! суть проблемы такова: пытаюсь нарисовать картинки с помощью Множество Мандельброта. Вот ссылка на ресурс- http://fractalworld.xaoc.ru/Mandelbrot_set_and_Julia_set. Решил сам код переписать на С++, да вот не получается! Зацикливается. Помогите пожалуйста замечанием или советом!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>

const int iter=50;
const int max=16;


struct Obj
{
  double x, y;
 };

 void GraphInit(){
   int gdriver = DETECT, gmode, errorcode;
   initgraph(&gdriver, &gmode, "c:\\langs\\BC\\bgi");
   errorcode = graphresult();
   if (errorcode != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to exit the program:");
      getch();
      exit(1);
   }
}

int main()
{
  GraphInit();
  Obj z, t, c;
  int x, y, n;;
  int mx, my;

   mx=getmaxx()/2;
   my=getmaxy()/2;

   for(y=-my; y=my; y++)
   {
     for(x=-mx;x=mx;x++)
     {
       n=0;
       c.x=x*0.005;
       c.y=y*0.005;
       z.x=1;
       z.y=1;
       while(pow(z.x,2)+pow(z.y,2)<max && n<iter)
       {
         t=z;
         z.x=pow(t.x,2)-pow(t.y,2)+c.x;
         z.y=2*t.x*t.y+c.y;
         n++;
        }
       if(n<iter)
       {
        putpixel(mx+x, my+y,16-(fmod(n,16)));
       }
     }
    }
    getch();
    closegraph();
    return 0;
}
Re: Фрактальная графика
От: VVV Россия  
Дата: 05.02.12 10:56
Оценка:
Здравствуйте, algoritm256, Вы писали:

A>Здравствуйте! суть проблемы такова: пытаюсь нарисовать картинки с помощью Множество Мандельброта. Вот ссылка на ресурс- http://fractalworld.xaoc.ru/Mandelbrot_set_and_Julia_set. Решил сам код переписать на С++, да вот не получается! Зацикливается. Помогите пожалуйста замечанием или советом!

A> while(pow(z.x,2)+pow(z.y,2)<max && n<iter)
A> {
A> t=z;
A> z.x=pow(t.x,2)-pow(t.y,2)+c.x;

Там же, вроде как,

while (sqr(z.x) + sqr(z.y) < max) and (n < iter) do

а у тебя pow, замени на sqrt.
Re[2]: Фрактальная графика
От: S_snowfall  
Дата: 05.02.12 11:13
Оценка:
VVV>а у тебя pow, замени на sqrt.

Тут все верно — если память не изменяет, sqr в Паскале — это функция возведения в квадрат.

Проблема-то в другом, автору нужно операторы получше изучить. Разобраться, чем присваивание отличается от сравнения, для начала. Потом разобраться с тем, как правильно все же сформулировать условие выполнения цикла.
Re: Фрактальная графика
От: S_snowfall  
Дата: 05.02.12 11:21
Оценка:
Здравствуйте, algoritm256, Вы писали:
A>Здравствуйте! суть проблемы такова: пытаюсь нарисовать картинки с помощью Множество Мандельброта. Вот ссылка на ресурс- http://fractalworld.xaoc.ru/Mandelbrot_set_and_Julia_set. Решил сам код переписать на С++, да вот не получается! Зацикливается. Помогите пожалуйста замечанием или советом!
Совет таков — на начальном этапе изучения программирования (если тебе действительно это интересно, а не просто "чтоб по лабе зачет получить"), желательно разобраться с основами владения отладчиком. При пошаговой трассировке подобные мелкие ошибки находятся легко.
Re[2]: Фрактальная графика
От: algoritm256  
Дата: 05.02.12 11:22
Оценка:
Здравствуйте, VVV, Вы писали:

VVV>Здравствуйте, algoritm256, Вы писали:


A>>Здравствуйте! суть проблемы такова: пытаюсь нарисовать картинки с помощью Множество Мандельброта. Вот ссылка на ресурс- http://fractalworld.xaoc.ru/Mandelbrot_set_and_Julia_set. Решил сам код переписать на С++, да вот не получается! Зацикливается. Помогите пожалуйста замечанием или советом!

A>> while(pow(z.x,2)+pow(z.y,2)<max && n<iter)
A>> {
A>> t=z;
A>> z.x=pow(t.x,2)-pow(t.y,2)+c.x;

VVV>Там же, вроде как,

VVV>

VVV>while (sqr(z.x) + sqr(z.y) < max) and (n < iter) do

VVV>а у тебя pow, замени на sqrt.

теперь вылетает ошибка SQRT: Domain Error. Floating point error: domain. Abnormal porgram detirmenition. В чем проблема????
Re[2]: Фрактальная графика
От: algoritm256  
Дата: 05.02.12 12:14
Оценка:
Здравствуйте, S_snowfall, Вы писали:

S_>Здравствуйте, algoritm256, Вы писали:

A>>Здравствуйте! суть проблемы такова: пытаюсь нарисовать картинки с помощью Множество Мандельброта. Вот ссылка на ресурс- http://fractalworld.xaoc.ru/Mandelbrot_set_and_Julia_set. Решил сам код переписать на С++, да вот не получается! Зацикливается. Помогите пожалуйста замечанием или советом!
S_>Совет таков — на начальном этапе изучения программирования (если тебе действительно это интересно, а не просто "чтоб по лабе зачет получить"), желательно разобраться с основами владения отладчиком. При пошаговой трассировке подобные мелкие ошибки находятся легко.

Спасибо большое за замечания! Условие цикла поправил(там правда тупанул), теперь прога не зацикливается, но рисоваться тоже не хочет.

вот как его исправил:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>
#include <complex.h>

const int iter=50;
const int max=16;


class Obj
{
  public:
  float x, y;
 };

 void GraphInit(){
   int gdriver = DETECT, gmode, errorcode;
   initgraph(&gdriver, &gmode, "c:\\langs\\BC\\bgi");
   errorcode = graphresult();
   if (errorcode != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to exit the program:");
      getch();
      exit(1);
   }
}

int main()
{
  GraphInit();
  Obj z, t, c;
  float x, y;
  int n;
  int Mx, My;

   Mx=getmaxx()/2;
   My=getmaxy()/2;
   n=0;

   for(y=-My; y>My; y++)
   {
     for(x=-Mx; x>Mx; x++)
     {
       c.x=x*0.005;
       c.y=y*0.005;
       z.x=0;
       z.y=0;
       while(pow(z.x,2)+pow(z.y,2)<max && n<iter)
       {
         t=z;
         z.x=pow(t.x,2)-pow(t.y,2)+c.x;
         z.y=2*t.x*t.y+c.y;
         n++;
        }
       if(n<iter)
       {
        putpixel(Mx+x, My+y,16-(fmod(n,16)));
       }
     }
    }
    getch();
    closegraph();
    return 0;
}
Re[3]: Фрактальная графика
От: Кодт Россия  
Дата: 05.02.12 12:41
Оценка: +1
Здравствуйте, algoritm256, Вы писали:

A>теперь вылетает ошибка SQRT: Domain Error. Floating point error: domain. Abnormal porgram detirmenition. В чем проблема????


Проблема в том, что кое-кто бездумно копирует всё что попало.

Функция sqr — это квадратный корень от вещественного числа.
Квадратный корень отрицательного числа не существует.

Сейчас я по костям программу разнесу, ибо.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h> /* это лишнее - всё равно делаем getch из стандартного потока, а не слушаем клавиатуру вживую */
#include <graphics.h>

const int iter=50;
const int max=16; /* во-первых, имя max используется в стандартной библиотеке и совсем в ином смысле */
                  /* во-вторых, радиус сходимости множества Мандельброта равен 2 */

struct Obj /* почему намёк на ООП, а не ясно и понятно Complex? */
{
  double x, y;
};

 void GraphInit(){
   int gdriver = DETECT, gmode, errorcode;
   initgraph(&gdriver, &gmode, "c:\\langs\\BC\\bgi");
   errorcode = graphresult();
   if (errorcode != grOk)
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
      printf("Press any key to exit the program:");
      getch();
      exit(1);
   }
}

int main()
{
  GraphInit();
  Obj z, t, c;
  int x, y, n;;
  int mx, my;

   mx=getmaxx()/2;
   my=getmaxy()/2;

   for(y=-my; y=my; y++) /* здесь ошибка - в условии цикла делается не сравнение, а присваивание */
   {
     for(x=-mx;x=mx;x++) /* и здесь тоже */
     {
       n=0;
       c.x=x*0.005;
       c.y=y*0.005;
       z.x=1;
       z.y=1;
       while(pow(z.x,2)+pow(z.y,2)<max && n<iter)
/*
  Условие итерирования - это |z|<R, где R - радиус сходимости
  |z|²<R²
  Re(z)²+Im(z)²<R²
  Для возведения чисел в квадрат нет нужды гонять функцию pow
  Просто z.x*z.x + z.y*z.y < R*R
*/
       {
         t=z;
         z.x=pow(t.x,2)-pow(t.y,2)+c.x; /* t.x*t.x - t.y*t.y + c.x */
         z.y=2*t.x*t.y+c.y;
         n++;
        }
       if(n<iter)
       {
        putpixel(mx+x, my+y,16-(fmod(n,16)));
           /*
              Зачем брать вещественный модуль?!
              К тому же, по этой формуле получаются числа от 1 до 16, а нужно от 0 до 15.
              Правильно было бы 15-(n%16)
              И по-хорошему, надо бы вынести формулу трансляции n в цвет в отдельную функцию,
              чтобы потом можно было менять её как угодно
           */
       }
     }
    }
    getch();
    closegraph();
    return 0;
}
Перекуём баги на фичи!
Re[3]: Фрактальная графика
От: Кодт Россия  
Дата: 05.02.12 13:38
Оценка:
Здравствуйте, algoritm256, Вы писали:

A>Спасибо большое за замечания! Условие цикла поправил(там правда тупанул), теперь прога не зацикливается, но рисоваться тоже не хочет.


А что именно происходит? Для всех точек получается расхождение — и, соответственно, чёрный цвет?
Посмотри на значения getmaxx() и getmaxy() — и, соответственно, на диапазон значений c.
Может быть, там что-то очень маленькое, и всё попадает в сплошную центральную область множества Мандельброта.
Для разнообразия, попробуй поменять коэффициенты — вместо 0.005 взять 0.01 например.
Или выбрать в центр экрана не нулевую точку, а что-то со смещением:
c.x = x*0.005 + 0.5;
c.y = y*0.005 + 0.1;
Перекуём баги на фичи!
Re[3]: Фрактальная графика
От: Анатолий Широков СССР  
Дата: 06.02.12 06:58
Оценка:
Еще раз прочтите условия входа в циклы

   for(y=-My; y>My; y++)
   {
     for(x=-Mx; x>Mx; x++)
     {
      ...
     }
     ...
   }
Re[4]: Фрактальная графика
От: Banned by IT  
Дата: 06.02.12 12:23
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Функция sqr — это квадратный корень от вещественного числа.

sqrt
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.