Множество Аполлона

результат работы

Построить фрактал Множество Аполлона

"Представьте себе окружность, а затем впишите в нее еще три окружности наибольшего возможного радиуса, конгруэнтные друг другу: повторите аналогичную операцию с каждой из этих окружностей и с каждым промежутком между ними. А теперь вообразите, что этот процесс продолжен до бесконечности..." - так впервые в письме Лейбница к де Броссу была описана конструкция, в последствии названная Бенуа Мандельбротом Упаковкой Лейбница.
Упаковка Лейбница похожа на более известный фрактал - Аполлониеву Сеть. Представляет она собой бесконечное количество окружностей вместе с их предельными точками. Этот фрактал назван в честь Аполлония Пергского - древнегреческого математика, жившего в III в. до нашей эры. Он был представителем александрийской школы и верным последователем Евклида и известен, помимо прочего, тем, что составил алгоритм построения пяти окружностей, касательных к трем заданным окружностям. В том случае, когда заданные окружности взаимно касательны, число аполлониевых кругов равно двум.
Снова совершим переход с плоскости в пространство. Возьмем четыре шара произвольного радиуса, и между ними впишем еще один, далее будем повторять эту процедуру до бесконечности. В итоге мы получим тремерное Аполлониево Множество. И никто нам не мешает повторить этот процесс с гиперсферами в четырех, пяти и шести мерных пространствах.
Заметим, что кроме Аполлониева Множества с помощью целующихся кругов, меняя алгоритм, можно построить множество других фракталов. Но фрактал можно строить и совершенно другим способом. Для этого возьмем окружность, и впишем в него несколько целующихся окружностей. Затем с каждой из новых окружностей повторим эту операцию. В пределе мы получим фрактал, который так и называется Целующиеся Круги.

А теперь программа построения множества Аполлона, используя нелинейные преобразования.

Program Apollony;
Uses CRT, Graph;
Var  //объявляем переменные
  gd, gm: Integer;
  x, y, a, b: Real;
  r: Real;
  a0, b0: Real;
  a1, b1, a2, b2: Real;
  f1x, f1y: Real;
  x1, y1: Real;
Begin
  gd:=detect;
  InitGraph(gd, gm, 'c:\bp\bgi');  //инициализируем графику
   x:=0.2;
   y:=0.3;
   a:=0;
   b:=0;
   Randomize;  //подключаем генератор случайных чисел
   r:=Sqrt(3);  //задаём радиус круга
   While not KeyPressed Do Begin   //цикл будет работать,пока не нажата клавиша
     a:=random;
     a0:=3*(1+r-x)/(sqr(1+r-x)+sqr(y))-(1+r)/(2+r);
     b0:=3*y/(sqr(1+r-x)+sqr(y));
     If (a<=1/3) and (a>=0) Then Begin
        x1:=a0;
        y1:=b0;
     End;   //в цикле производим вычисления
     a1:=-1/2;
     b1:=r/2;
     a2:=-1/2;
     b2:=-r/2;
     f1x:=a0/(sqr(a0)+sqr(b0));
     f1y:=-b0/(sqr(a0)+sqr(b0));
     If (a<=2/3) And (a>1/3) Then Begin
       x1:=f1x*a1-f1y*b1;
       y1:=f1x*b1+f1y*a1;
     End;
     If (a<= 3/3) and (a>2/3) Then Begin
       x1:=f1x*a2-f1y*b2;
       y1:=f1x*b2+f1y*a2;
     End;
   x:=x1;
   y:=y1;
   PutPixel(320+Round(x*50), 240+Round(y*50), 15);  //рисуем множество
  End;
  ReadLn;
  CloseGraph;
End.

Ключевые слова: 
фрактал, множество аполлона
ВложениеРазмер
Apollon.rar19.6 кб