Здравия желаю, Товарищи! Очевидно, эта тема уже обсуждалась, и я прочитал все касательно этих фракталов... НО. Результирующую программу мне так никто не предложил, а сам я еще не дорос, чтобы всю математику фрактала прописать самостоятельно в Паскале.
С множеством Мандельброта все понятно - я, наконец-то, достал информатика, и он дал мне готовую, полностью рабочую программу. Как я понял, в множестве Мандельброта граница убегания постоянна, а затравочное число изменятся. Тогда в множестве Жюлиа наоборот: затравочное число постоянно, а граница убегания меняется. Верно? (Гсподи! Неужли я такое говорю? )
Тогда достаточно в процедуре рисования множества Мандельброта изменить итерационный процесс и получим множество Жюлиа? Вопрос только в том, как это сделать? Вот текст процедуры рисования множества Мандельброта:
procedure Mandelbrot_Draw;
{ постpоение множества Мандельбpота }var
i, j : Integer;
X_New, Y_New,
X_Old, Y_Old : Extended;
r, P, Q : Extended;
Color : Word;
Beginfor i:= 0to GetMaxX dofor j:= 0to GetMaxY dobegin
P:= P_min+i*d_p;
Q:= Q_min+j*d_q;
Color:= 0;
X_Old:= 0;
Y_Old:= 0;
repeat
X_New:= X_Old*X_Old - Y_Old*Y_Old + p;
Y_New:= 2*X_Old*Y_Old + q;
Inc (Color);
r:=Sqr(X_New) + Sqr(Y_New);
X_Old:= X_New;
Y_Old:= Y_New;
until (r >= M) or (Color >= GetMaxColor);
if r > M then PutPixel (i,j, Color) else PutPixel (i,j, 0);
if KeyPressed thencase ReadKey of#27 : Exit;
#32 : PaletteCreate;
end;
end;
{ чистим буфеp клавиатуpы }while KeyPressed do ReadKey;
End; { Mandelbrot_Draw }
(кстати, у меня работает почему-то быстрее, чем та, которую на нашел на этом форуме в теории)
Как я понял, итерационный процесс, это вот эта штука:
Которую надо изменить. Понятно дело придется так же поменять некоторые константы и переменные. Помогите мне, пожалуйста, преобразовать ЭТУ программу, чтобы она рисовала множества и Мандельброта и Жюлиа. Пропишите за меня процедуру для Жюлиа и объясните, что еще где нужно поменять и как, чтобы все без глюков запускалось. Мне надо завтра сдать эту задачу, иначе я себе аттестат испорчу. Помогите, пожалуйста поскорее кто может! Плиз! Я очень надеюсь на вас! А уж с интерфайсом выбора одного или другого множетсва я сам разберусь.
И еще одна мааленькая просьба. Если кто-нибудь меня услышит и поможет, киньте пожалуйста мне СМСку <...> (Здесь не доска сообщений. Читай правила!)
Всем заранее спасибо!!
Вот код всей программы(Показать/Скрыть)
program Fractal_Mandelbrot;
{ множество Мандельброта }{ клавиши управления:
стрелки - движение рамки курсора;
Shift-стрелки вверх/вниз - увеличение/уменьшение рамки;
Enter - начало нового рисунка;
Alt-H - скрытие/отображение рамки;
пробел - смена палитры;
Esc - остановка рисунка/выход из программы }uses Crt, Graph;
const
GetMaxColor : Word = 50;
N = 16; { число цветов в палитре }
M = 50; { граница убегания }
Path = 'd:\pascal\bgi';
var
P_min, P_max, { гpаницы pисунка }
Q_min, Q_max : Extended;
d_p, d_q : Extended;
procedure GraphBegin;
var Gd, Gm : Integer;
Begin
Gd:= Detect;
InitGraph (Gd, Gm, Path);
End; { GraphBegin }procedure PaletteCreate;
var
i, R1, G1, B1,
R2, G2, B2,
Red, Green, Blue : Integer;
Begin{ начальный и конечный цвета палитры }repeat
R1:= Random (64); G1:= Random (64); B1:= Random (64);
Red:= R1; Green:= G1; Blue:= B1;
R2:= Random (64); G2:= Random (64); B2:= Random (64);
until Sqrt (Sqr (R1-R2)+Sqr (G1-G2)+Sqr (B1-B2)) > 50;
{ модифицируем цвета с 1 по 15, оставляя 0 - черным }for i:= 1to15dobegin
SetRGBPalette (i, Red, Green, Blue);
SetPalette (i,i);
Inc (Red, (R2-R1) div (N-1));
Inc (Green, (G2-G1) div (N-1));
Inc (Blue, (B2-B1) div (N-1));
end;
End; { PaletteCreate }procedure Init;
{ гpаницы pисунка }Begin
P_min:= -2;
Q_min:= -1.1;
P_max:= 0.7;
Q_max:= 1.1;
d_p:= (P_max-P_min)/GetMaxX;
d_q:= (Q_max-Q_min)/GetMaxY;
End; { Init }procedure Mandelbrot_Draw;
{ постpоение множества Мандельбpота }var
i, j : Integer;
X_New, Y_New,
X_Old, Y_Old : Extended;
r, P, Q : Extended;
Color : Word;
Beginfor i:= 0to GetMaxX dofor j:= 0to GetMaxY dobegin
P:= P_min+i*d_p;
Q:= Q_min+j*d_q;
Color:= 0;
X_Old:= 0;
Y_Old:= 0;
repeat
X_New:= X_Old*X_Old - Y_Old*Y_Old + p;
Y_New:= 2*X_Old*Y_Old + q;
Inc (Color);
r:=Sqr(X_New) + Sqr(Y_New);
X_Old:= X_New;
Y_Old:= Y_New;
until (r >= M) or (Color >= GetMaxColor);
if r > M then PutPixel (i,j, Color) else PutPixel (i,j, 0);
if KeyPressed thencase ReadKey of#27 : Exit;
#32 : PaletteCreate;
end;
end;
{ чистим буфеp клавиатуpы }while KeyPressed do ReadKey;
End; { Mandelbrot_Draw }procedure Rect (X, Y : Integer);
{ пунктиpная pамка, подобная экpану с центpом в X,Y }const
DX_min : Integer = 40; { min и max размеры рамки }
DX_max : Integer = 150;
Hide : Boolean = False; { рамка скрыта }var
Ch : Char;
i : Integer;
DX, DY, Z : Integer; { шиpины pамки по осям }
X1, Y1, X2, Y2 : Integer; { кооpдинаты углов }Begin
SetColor (White);
SetLineStyle(DottedLn, 0, NormWidth);
SetWriteMode(XORPut); { чтобы не возиться со стиранием }
DX:= DX_min; { вначале минимальная pамка }{ опpеделим углы }
X1:= X-DX div2;
X2:= X+DX div2;
DY:= Round ((X2-X1)/GetMaxX*GetMaxY);
Y1:= Y - DY div2;
Y2:= Y + DY div2;
{ изменение pазмеpов - выход по Enter }repeatifnot Hide then{ меpцающая pамка }repeat
Rectangle(X1, Y1, X2, Y2); Delay (15);
Rectangle(X1, Y1, X2, Y2); Delay (15);
until KeyPressed;
{ отслеживаем клавиши }repeat Ch:= Readkey until Ch<>#0;
if (Mem[$0040:$017] and3) <> 0thenbegin{ нажат Shift }case ord (Ch) of72 : { увеличиваем pазмеpы }if (X1>0) and (X2<GetMaxX) and (X2-X1<DX_max) and
(Y1>0) and (Y2<GetMaxY) thenbegin{ пpеобpазуем шиpину, а высоту
пеpесчитываем под экpанное соотношение}
Dec(X1, 1); Inc (X2, 1);
DY:= Round ((X2-X1)/GetMaxX*GetMaxY);
Z:= (Y2+Y1) div2;
Y1:= Z - (DY div2);
Y2:= Z + (DY div2);
end;
80 : { уменьшаем pазмеpы }if (X2-X1>DX_min) thenbegin{ пpеобpазуем шиpину, а высоту
пеpесчитываем под экpанное соотношение}
Inc(X1, 1); Dec (X2, 1);
DY:= Round ((X2-X1)/GetMaxX*GetMaxY);
Z:= (Y2+Y1) div2;
Y1:= Z - (DY div2);
Y2:= Z + (DY div2);
end;
end;
endelse{ не нажат Shift }case ord (Ch) of35 : Hide:= not Hide; { Alt-H - рамка скрыта }72 : if Y1>0then{ ввеpх }begin Dec(Y1, 1); Dec (Y2, 1); end;
80 : if Y2<GetMaxY then{ вниз }begin Inc(Y1, 1); Inc (Y2, 1); end;
75 : if X1>0then{ влево }begin Dec(X1, 1); Dec (X2, 1); end;
77 : if X2<GetMaxX then{ впpаво }begin Inc(X1, 1); Inc (X2, 1); end;
32 : PaletteCreate; { меняем цвета }27 : Halt;
end;
until Ch = #13;
{ пеpесчет гpаниц pисунка (паpаметpов итеpаций) }
P_max:= P_min+X2*d_p;
P_min:= P_min+X1*d_p;
Q_max:= Q_min+Y2*d_q;
Q_min:= Q_min+Y1*d_q;
d_p:= (P_max-P_min)/GetMaxX;
d_q:= (Q_max-Q_min)/GetMaxY;
GetMaxColor:= Round (GetMaxColor*1.5);
{ чистим буфеp клавиатуpы }while KeyPressed do ReadKey;
End; { Rect }BEGIN
GraphBegin;
Init;
PaletteCreate;
Mandelbrot_Draw;
repeat
Rect (GetMaxX div2, GetMaxY div2);
Mandelbrot_Draw;
until False;
END.
Спасибо за внимание! =)
volvo
28.04.2006 13:15
Цитата
Результирующую программу мне так никто не предложил, а сам я еще не дорос, чтобы всю математику фрактала прописать самостоятельно в Паскале.
Вот и подумай, если ты не соизволил хотя бы немного поискать (даже на этом форуме), чтобы приблизиться к нужному тебе результату, то как можно относиться к твоему заявлению:
Цитата
я прочитал все касательно этих фракталов
?
Не верю! (С) К.С.Станиславский
Цитата
(кстати, у меня работает почему-то быстрее, чем та, которую на нашел на этом форуме в теории)
Почему-то такие заявления принято подкреплять фактами, знаешь ли... Вот и приведи время отрисовки обоими методами, если уж начал о скорости...
GoodWind
28.04.2006 13:28
Цитата
Пропишите за меня процедуру для Жюлиа и объясните, что еще где нужно поменять и как, чтобы все без глюков запускалось.
никто вместо тебя делать не станет...
Цитата
Мне надо завтра сдать эту задачу, иначе я себе аттестат испорчу. Помогите, пожалуйста поскорее кто может! Плиз! Я очень надеюсь на вас!
а о чем до этого думал ?
Гersh
28.04.2006 13:57
Цитата
До использования поиска тоже не дорос?
Дорос! Не помогло! Откуда мне было знать, что при поиске Жюлиа надо искать фракталы? Может надо было начать с основ графики? Все, что я нашел по слову "Жюлиа" я ПРОЧИТАЛ! А если в тебе даже это слово не встречается, то зачем мне туда лезть? (и теме "Создание фрактальных рисунков" нет ни слова о множестве Жюлиа (не говоря уже о самой программе)) ...
Цитата
Почему-то такие заявления принято подкреплять фактами, знаешь ли... Вот и приведи время отрисовки обоими методами, если уж начал о скорости
Ну, блин! Я же не гений! Я в этом вообще не разбираюсь! Я думал этот огромный форум помогает людям познать азы программирования. А на меня тут пока что только наорали! Вот это приняли, млин!
Цитата
никто вместо тебя делать не станет...
Тогда какого четра в комментарее к категории написано "делаем вместе"?? Какие вы тут все злые!
Цитата
а о чем до этого думал ?
Думал о том, как бы меня окончательно не забанили!
GoodWind
28.04.2006 14:15
Цитата
Тогда какого четра в комментарее к категории написано "делаем вместе"?? Какие вы тут все злые!
вместе - это не значит, что за тебя делают самое сложное, а всякие мелочи (вроде интерфейса) ты делаешь (так и быть...) сам.
volvo
28.04.2006 14:27
Цитата
Откуда мне было знать, что при поиске Жюлиа надо искать фракталы?
Только одним постом выше ты утверждал, что прочел ВСЕ что было по теме. Неужели же ВЕЗДЕ где ты был, при упоминании множества Julia не упоминаются фракталы? Я тебя умоляю, сказки будешь внукам рассказывать...
Цитата
Тогда какого четра в комментарее к категории написано "делаем вместе"??
Во-первых, тебя не спросили, что там написать...
А во-вторых, "решаем вместе". Начинай. Где ТВОЕ решение?
Цитата
я, наконец-то, достал информатика, и он дал мне готовую, полностью рабочую программу.
Ты что, это сам решил? Или хотя бы разобрался с тем, КАК это работает? НЕТ! Ты достал готовую программу, и теперь хочешь, чтобы ее переделали под твои нужды, да еще и прикрываешься подзаголовком форума???
Гersh
28.04.2006 16:41
Цитата
вместе - это не значит, что за тебя делают самое сложное,
а то что я готовую программу дал - это не считается? В которой надо всего лишь пять срок перетисать... И вообще сколько можно флудить? Я тему создал в поисках помощи, а не врагов. Если в падлу формулу написать, то че вообще докапываться?
Цитата
Я тебя умоляю, сказки будешь внукам рассказывать...
С такими темпами нет гарантии, что я детей увижу!
Цитата
А во-вторых, "решаем вместе". Начинай. Где ТВОЕ решение?
Я уже предостваил рабоучу программу, в которой надо всего 5 строк переписать...
Цитата
Ты что, это сам решил? Или хотя бы разобрался с тем, КАК это работает?
повторяю
Цитата
сам я еще не дорос, чтобы всю математику фрактала прописать самостоятельно в Паскале.
Аналогично и разобраться с ней не могу. Тем более [quote]Мне надо завтра сдать эту задачу, иначе я себе аттестат испорчу. [quote]
Гersh
7.05.2006 14:56
Кажется я понял в чем дело!! По-моему все траблы из-за константы GetMaxColor!! Только как от них избавиться? Вот блин! ( Про такую переменную вообще ни слова ни где не сказано!!! ((( Чёрт!! >_<
Кстати! Я еще не разобрался с процессом пересчета границ рисунка... Мне кажется, что для Жюлиа он не такой должен быть. Потому что там что-то меняется не так и, после возврата к исходному рисунку, он получается не такой как был...
Гersh
11.05.2006 14:52
Я сдал множество Жюлиа!! Спасибо, всем, кто мне помогал!
Если интересно, могу выложить показать. (Или это уже не тут обсуждается? А где?)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.