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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2008, 16:28   #1
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,544
По умолчанию Фрактал в виде папоротника

Может кому пригодится, программа, выводящая итерационный фрактал в виде папоротника. В таймере добавлен элемент анимации (интервал таймера установить на 1 мс).
Код:
var T0, FPS: Integer;
    Alpha, Beta, KA, KB: Single;

procedure Fract (A, B: TPoint; Alpha, Beta, K1, K2: Single);
const LMin = 36; // Корень минимальной длины ветки
var CosA, SinA, CosB, SinB: Single;
    BitMap: TBitMap;
  procedure Fr (A, B: TPoint; Num: Integer);
  var C, D, E, F, G: TPoint;
  begin
    if Sqr (B.X - A.X) + Sqr (B.Y - A.Y) > LMin then
    begin
      C.X := Round ((B.X - A.X) * CosA - (B.Y - A.Y) * SinA + A.X);
      C.Y := Round ((B.X - A.X) * SinA + (B.Y - A.Y) * CosA + A.Y);
      D.X := Round (A.X * (1 - K1) + C.X * K1);
      D.Y := Round (A.Y * (1 - K1) + C.Y * K1);
      E.X := Round (A.X * (1 - K2) + C.X * K2);
      E.Y := Round (A.Y * (1 - K2) + C.Y * K2);
      F.X := Round ((E.X - D.X) * CosB - (E.Y - D.Y) * SinB + D.X);
      F.Y := Round ((E.X - D.X) * SinB + (E.Y - D.Y) * CosB + D.Y);
      G.X := Round ((E.X - D.X) * CosB + (E.Y - D.Y) * SinB + D.X);
      G.Y := Round (-(E.X - D.X) * SinB + (E.Y - D.Y) * CosB + D.Y);
      with BitMap.Canvas do
      begin
        Pen.Color := RGB (0, (32 + Num * 32) mod 256, 0);
        MoveTo (A.X, A.Y);
        LineTo (D.X, D.Y);
{        MoveTo (BitMap.Width - A.X, A.Y);
        LineTo (BitMap.Width - D.X, D.Y);{}
        MoveTo (A.X + 100, A.Y);
        LineTo (D.X + 100, D.Y);
        MoveTo (A.X - 100, A.Y);
        LineTo (D.X - 100, D.Y);{}
      end; {with}
      Fr (D, C, Num);
      Fr (D, F, Num + 1);
      Fr (D, G, Num + 1);
    end; {if}
  end; {proc Fr}
begin
  BitMap := TBitMap.Create;
  BitMap.Width := FMain.Width;
  BitMap.Height := FMain.Height;
  CosA := Cos (Alpha);
  SinA := Sin (Alpha);
  CosB := Cos (Beta);
  SinB := Sin (Beta);
  Fr (A, B, 0);
  FMain.Canvas.Draw (0, 0, BitMap);
  BitMap.Free;
end; {proc Fract}

procedure TFMain.Timer1Timer(Sender: TObject);
begin
  Fract (Point (250, 400), Point (300, 10), Alpha, Beta, 0.18, 0.6);
  Alpha := Alpha + KA;
  if (Alpha < -Pi / 60) or (Alpha > Pi / 60) then KA := -KA;
  Beta := Beta + KB;
  if (Beta < Pi / 8 - Pi / 60) or (Beta > Pi / 8 + Pi / 60) then KB := -KB;
  Inc (FPS);
  if GetTickCount - T0 > 1000 then
  begin
    Caption := 'FPS: ' + IntToStr (FPS);
    T0 := GetTickCount;
    FPS := 0;
  end; {if}
end;

procedure TFMain.FormShow(Sender: TObject);
begin
  Alpha := 0;
  Beta := Pi / 8;
  KA := 0.003;
  KB := 0.002;
  T0 := GetTickCount;
  FPS := 0;
  Timer1.Enabled := not Timer1.Enabled;
end;
В прикреплённом файле откомпилированная программа.
Вложения
Тип файла: rar Fractal.rar (152.7 Кб, 133 просмотров)
Arigato вне форума Ответить с цитированием
Старый 07.11.2008, 17:25   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Очень симпатичненько получилось. Музычку добавить еще...
mihali4 вне форума Ответить с цитированием
Старый 07.11.2008, 18:57   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

5 баллов )
Прикольная чтука. Попробую такое в 3DS применить )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.03.2009, 23:43   #4
CraZZy RabbIt
Форумчанин
 
Регистрация: 16.02.2009
Сообщений: 172
По умолчанию

о=)спасибо=)приготится=)
CraZZy RabbIt вне форума Ответить с цитированием
Старый 28.03.2011, 22:47   #5
AinaRai
Новичок
Джуниор
 
Регистрация: 28.03.2011
Сообщений: 1
По умолчанию

Супер! я как раз искала нечто подобное, спасибо))
AinaRai вне форума Ответить с цитированием
Старый 29.03.2011, 06:33   #6
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

Классная вещь!
ZvEr_HaCkEr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оформить в виде функций Smotritel89 Помощь студентам 2 04.11.2008 14:39
Фрактал на PHP Alter PHP 5 29.10.2008 15:24
Фрактал Дерево Пифагора Delphi yulia Помощь студентам 2 25.09.2008 08:27
Фрактал. Посчитать количество треугольников. Marsik Помощь студентам 2 22.11.2007 08:19
Меню в виде дерева pu4koff JavaScript, Ajax 7 16.10.2007 11:24