Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2010, 00:14   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию снежинка Мандельброта

Не могу понять как рисовать этот фрактал
Изображения
Тип файла: jpg mandelbrot.jpg (85.7 Кб, 176 просмотров)
NiCola999 вне форума Ответить с цитированием
Старый 25.09.2010, 09:42   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ап.........!
NiCola999 вне форума Ответить с цитированием
Старый 25.09.2010, 11:54   #3
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Множество Мандельброта рисовал, а вот снежинку - нет (только Коха).
Есть хороший ресурс по готовым алгоритмам рисования фракталов http://www.opita.net/

Если будет время, то завтра попробую на Делфи реализовать.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab

Последний раз редактировалось ex.cluz; 25.09.2010 в 11:58.
ex.cluz вне форума Ответить с цитированием
Старый 25.09.2010, 14:29   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

По-моему описание немного неточное. Когда кривая рисуется вправо, меняется и вся последовательность на LRRRRLLLRRLLR.

Код:
function MiddlePoint(A,B:TPoint; k:Single):TPoint;
begin
   result.x := A.x + trunc((B.x - A.x)*k);
   result.y := A.y + trunc((B.y - A.y)*k);
end;

const sides : array [boolean] of string = ('LRRRRLLLRRLLR', 'RLLLLRRRLLRRL');

procedure MakeSnowflake(Canvas:TCanvas; A, C:TPoint; side:char; k1:integer);
var B, D, E, F, G, H, I, J, K, L, M, N, O :TPoint;
    a1, l1:Single;
    isLeft : boolean;
begin
   // Вычисляем B
   B.x := C.x - A.x;
   B.y := C.y - A.y;
   if B.x = 0 then a1 := pi/2
   else begin
      a1 := arctan(abs(B.y/B.x));
      if B.x < 0 then a1 := pi-a1;
   end;
   if B.y < 0 then a1 := -a1;

   isLeft := side = 'L';
   if isLeft
   then a1 := a1 + pi/3
   else a1 := a1 - pi/3;

   l1 := sqrt(sqr(B.x) + sqr(B.y));
   B.x := trunc(l1*cos(a1))+A.x;
   B.y := trunc(l1*sin(a1))+A.Y;

   // Вычисляем остальные точки
   D := middlePoint(A, B, 1/3);
   E := middlePoint(A, B, 2/3);
   F := middlePoint(B, C, 1/3);
   G := middlePoint(B, C, 2/3);
   I := middlePoint(A, C, 1/3);
   H := middlePoint(A, C, 2/3);
   K := middlePoint(E, G, 1/3);
   N := middlePoint(E, G, 2/3);
   O := middlePoint(G, I, 1/3);
   L := middlePoint(G, I, 2/3);
   M := middlePoint(E, I, 1/3);
   J := middlePoint(E, I, 2/3);

   dec(k1);
   if k1 = 0 then begin
      Canvas.MoveTo(A.x+100, 400-A.y);
      Canvas.LineTo(E.x+100, 400-E.y);
      Canvas.LineTo(F.x+100, 400-F.y);
      Canvas.LineTo(G.x+100, 400-G.y);
      Canvas.LineTo(K.x+100, 400-K.y);
      Canvas.LineTo(M.x+100, 400-M.y);
      Canvas.LineTo(J.x+100, 400-J.y);
      Canvas.LineTo(O.x+100, 400-O.y);
      Canvas.LineTo(I.x+100, 400-I.y);
      Canvas.LineTo(C.x+100, 400-C.y);
   end else begin
      MakeSnowflake(Canvas, A, D, sides[isLeft][ 1], k1);
      MakeSnowflake(Canvas, D, E, sides[isLeft][ 2], k1);
      MakeSnowflake(Canvas, E, F, sides[isLeft][ 3], k1);
      MakeSnowflake(Canvas, F, G, sides[isLeft][ 4], k1);
      MakeSnowflake(Canvas, G, N, sides[isLeft][ 5], k1);
      MakeSnowflake(Canvas, N, K, sides[isLeft][ 6], k1);
      MakeSnowflake(Canvas, K, M, sides[isLeft][ 7], k1);
      MakeSnowflake(Canvas, M, J, sides[isLeft][ 8], k1);
      MakeSnowflake(Canvas, J, O, sides[isLeft][ 9], k1);
      MakeSnowflake(Canvas, O, L, sides[isLeft][10], k1);
      MakeSnowflake(Canvas, L, I, sides[isLeft][11], k1);
      MakeSnowflake(Canvas, I, H, sides[isLeft][12], k1);
      MakeSnowflake(Canvas, H, C, sides[isLeft][13], k1);
   end;
end;

procedure TForm7.Button1Click(Sender: TObject);
begin
   MakeSnowflake(Canvas, Point(0,0), Point(500,0), 'L', 3);
end;
alexBlack вне форума Ответить с цитированием
Старый 25.09.2010, 16:13   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Интересно..... Жаль опаздал, тоже бы попробовал...

А откуда задание? Там ещё подобные есть?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 25.09.2010, 16:17   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Ф. Хилл. "OpenGL. Программирование компьютерной графики. Для профессионалов." 2-ое издание

спасибо вам alexBlack за программу, я в ней разобрался останется её написать на c++ opengl (сам справлюсь), но есть моменты, которые мне не понятны(в плане алгоритма) в личку письмо написал

Последний раз редактировалось NiCola999; 25.09.2010 в 16:19.
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Множество Мандельброта и Жюлиа KEnt Помощь студентам 8 07.12.2011 23:54