Здравствуйте! суть проблемы такова: пытаюсь нарисовать картинки с помощью Множество Мандельброта. Вот ссылка на ресурс- 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;
}
Здравствуйте, 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
Тут все верно — если память не изменяет, sqr в Паскале — это функция возведения в квадрат.
Проблема-то в другом, автору нужно операторы получше изучить. Разобраться, чем присваивание отличается от сравнения, для начала. Потом разобраться с тем, как правильно все же сформулировать условие выполнения цикла.
Здравствуйте, algoritm256, Вы писали: A>Здравствуйте! суть проблемы такова: пытаюсь нарисовать картинки с помощью Множество Мандельброта. Вот ссылка на ресурс- http://fractalworld.xaoc.ru/Mandelbrot_set_and_Julia_set. Решил сам код переписать на С++, да вот не получается! Зацикливается. Помогите пожалуйста замечанием или советом!
Совет таков — на начальном этапе изучения программирования (если тебе действительно это интересно, а не просто "чтоб по лабе зачет получить"), желательно разобраться с основами владения отладчиком. При пошаговой трассировке подобные мелкие ошибки находятся легко.
Здравствуйте, 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. В чем проблема????
Здравствуйте, S_snowfall, Вы писали:
S_>Здравствуйте, algoritm256, Вы писали: A>>Здравствуйте! суть проблемы такова: пытаюсь нарисовать картинки с помощью Множество Мандельброта. Вот ссылка на ресурс- http://fractalworld.xaoc.ru/Mandelbrot_set_and_Julia_set. Решил сам код переписать на С++, да вот не получается! Зацикливается. Помогите пожалуйста замечанием или советом! S_>Совет таков — на начальном этапе изучения программирования (если тебе действительно это интересно, а не просто "чтоб по лабе зачет получить"), желательно разобраться с основами владения отладчиком. При пошаговой трассировке подобные мелкие ошибки находятся легко.
Спасибо большое за замечания! Условие цикла поправил(там правда тупанул), теперь прога не зацикливается, но рисоваться тоже не хочет.
Здравствуйте, 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;
}
Здравствуйте, algoritm256, Вы писали:
A>Спасибо большое за замечания! Условие цикла поправил(там правда тупанул), теперь прога не зацикливается, но рисоваться тоже не хочет.
А что именно происходит? Для всех точек получается расхождение — и, соответственно, чёрный цвет?
Посмотри на значения getmaxx() и getmaxy() — и, соответственно, на диапазон значений c.
Может быть, там что-то очень маленькое, и всё попадает в сплошную центральную область множества Мандельброта.
Для разнообразия, попробуй поменять коэффициенты — вместо 0.005 взять 0.01 например.
Или выбрать в центр экрана не нулевую точку, а что-то со смещением: