і інші класифікації фракталів, наприклад поділ фракталів на детерміновані (алгебраїчні і геометричні) і недетермінірованние (стохастичні).
2.2 Реалізація трикутника
1) Відображається у вигляді трикутника, з чотирьох секцій, кожен трикутник має половину ширини і висоти оригіналу. Центральний трикутник інвертується і може розглядатися як отвір в зображенні. Кожен з трьох зовнішніх трикутників є зменшеною версією цілого малюнка з власними центральними отворами. Така схема повторюється нескінченно.
Малюнок 2.3
2) Алгоритм побудови
Існують різні методи побудови трикутника .Однією з них є використання теорії хаосу з трьома аттракторами, розташованими на трьох вершинах рівностороннього трикутника. При переході з поточної позиції в напрямку аттрактора пройдену відстань завжди становить відстань між поточною точкою і обраної вершиною.
Розглянемо кроки для побудови фрактала:
. Визначити три крапки.
. Вибрати стартову позицію.
. Випадково вибрати один з трьох атракторів.
. Перемістити поточну позицію на половину в напрямку позиції аттрактора і намалювати крапку.
. Повернутися до кроку 3.
) Малювання трикутника
Нам знадобитися три методи. Перший для генерації псевдо - випадкових чисел, які будуть використовуватися для визначення напрямку під час кожної ітерації. По - друге, нам необхідно зберегти три позиції рівностороннього трикутника, для цього будемо використовувати структуру Point. Нарешті, ще одна структура Point знадобитися для зберігання поточної позиції. Оголосимо трьох змінні: randomiser=new Random (); Point [] points;
private Point currentLocation;
Розмір трикутника повинен бути, як можна більше, щоб розглянути деталі Щоб визначити найбільший можливий розмір, ми повинні розглядати співвідношення між висотою і шириною будь-якого рівностороннього трикутника. Якщо припустити, що основу трикутника вирівнюється по горизонталі, ширина буде така ж, як довжина однієї зі сторін. Висота матиме ширину, помножена на половину квадратного кореня з трьох. Додамо метод, який розрахує співвідношення:
private double HeightWidthRatio ()
{Math.Sqrt (3)/2;
}
Наступний метод обчислює розмір трикутника, щоб помістити на формі:
private int SideLength ()
{height=(int) Math.Min (
(double) ClientSize.Width, ClientSize.Height/HeightWidthRatio ());
//віднімаємо 2 щоб трикутник примикав до країв. (int) height - 2;
}
Наступний метод буде обчислювати позиції кожного з трьох атракторів, кожен буде розташований у вершині трикутника. Ці значення будуть засновані на розмірі трикутника і медіані клієнтської області форми.
void SetPointLocations (int sideLength)
{
Point midPoint=new Point (ClientSize.Width/2, ClientSize.Height/2);=new Point [3]; [0]=new Point (midPoint.X
, midPoint.Y - (int) (sideLength * HeightWidthRatio ()/2)); [1]=new Point (midPoint.X - sideLength/2
, midPoint.Y + (int) (sideLength * HeightWidthRatio ()/2)); [2]=new Point (midPoint.X + sideLength/2
, midPoint.Y + (int) (sideLength * HeightWidthRatio ()/2));
}
Наступним завданням є створення методу (точніше двох) для розміщення точок.
void PlotPointLocations (Graphics g)
{(Point p in _points)
{(p, g);
}
} void PlotPoint (Point p, Graphics g)
{b=new SolidBrush (Color.Black) ;. FillRectangle (b, pX, pY, 1, 1);
}
Тепер напишемо методи, які використовуються в циклі алгоритмом для малювання фрактала. Метод DrawNextPoint буде контролювати цей процес викликаючи MoveTowardsRandomPoint raquo ;, за яким слідує виклик PlotPoint, щоб поставити крапку в поточній позиції. Нарешті, викликається метод Application.DoEvents для поновлення форми.
Метод MoveTowardsRandomPoint вибирає одну з трьох вершин використовуючи наш об'єкт randomizer.Он якраз і обчислює половину відстані між поточною позицією і вибраним аттрактором:
void DrawNextPoint (Graphics g)
{
MoveTowardsRand...