Бінарні дерева і фракали

Бінарне дерево може також виступати у ролі конструктивного фрактала. Він будується за наступним прин

Бінарне дерево може також виступати у ролі конструктивного фрактала. Він будується за наступним принципом: на кожному рівні вертикальна лінія розділяється на дві з деяким показником зменшення. Такі розгалужені фрактали називаються дендритами (в перекладі з грецької « δένδρον» — дерево).

Код для побудови такого фракталу:

private void DrawTTree(int x, int y, int lenght, int level)
        {
            if (lenght < 4) return;
            var l = lenght / 2;
            var pen = new Pen(Colors[level % 5], (5-level)>1?(5-level):1);
            _graphics.DrawLine(pen,x, y, x, y - l);
            _graphics.DrawLine(pen,x, y - l, x - l, y - l);
            _graphics.DrawLine(pen,x, y - l, x + l, y - l);
            DrawTTree(x - l, y - l, l, level + 1);
            DrawTTree(x + l, y - l, l, level + 1);
        }
Існують і інші подання двійкового дерева: H-дерево і V-дерево.
 
H-дерево будується наступним чином: беремо одиничний відрізок, і на першому кроці два коротших відрізка поміщаємо перпендикулярно кінцях початкового так, щоб утворилася буква H, повторюємо дії.

 

Код для побудови такого фракталу:

 {            
            if (lenght < 20) return; 
            var l = lenght/2;            
            int x1=centerX-l, x2=centerX+l, y1=centerY-l/2, y2=centerY+l/2;
            var pen = new Pen(Colors[level], 4-level/2);            
            _graphics.DrawLine(pen, x1, centerY, x2, centerY);
            _graphics.DrawLine(pen, x1, y1, x1, y2);
            _graphics.DrawLine(pen, x2, y1, x2, y2);          
            DrawHTree(x1, y1, l, level + 1);
            DrawHTree(x1, y2, l, level + 1);
            DrawHTree(x2, y1, l, level + 1);
            DrawHTree(x2, y2, l, level + 1);
        }

 

V-дерево будується аналогічно:

 private static void DrawVTree(int centerX, int centerY, int lenght, int level)
{
            if (lenght < 2) return;
            var delta= Convert.ToInt32(lenght * Math.Sqrt(2)/2.0);
            var x1 = centerX - delta;
            var x2 = centerX + delta;
            var y = centerY - delta;
            var pen = new Pen(Colors[level%5], 2);
            _graphics.DrawLine(pen, centerX, centerY, x1, y );
            _graphics.DrawLine(pen, centerX, centerY, x2, y );
            DrawVTree(x1, y, 2*delta/3, level + 1);
            DrawVTree(x2, y, 2*delta/3, level + 1);            
}

 

Додати коментар

Loading