Кривая Леви

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Кривая Леви
Анимация построения

Кривая Леви — фрактал. Предложен французским математиком П. Леви. Получается, если взять половину квадрата вида /\, а затем каждую сторону заменить таким же фрагментом, и, повторяя эту операцию, в пределе получим кривую Леви.

L-система, порождающая кривую Леви:

переменные : F
константы  : + −
начало  : F
правила  : −F++F−
угол  : 45°

Свойства[править | править вики-текст]

  • Кривая Леви нигде не дифференцируема и не спрямляема.
  • На любом интервале кривой Леви есть точки самопересечения.
  • Хаусдорфова размерность границы кривой Леви приблизительно равна 1,9340. (Кривая Леви состоит из двух равных частей, каждая из которых подобна всей кривой с коэффициентом подобия , из-за отстуствия существенных самопересечений её размерность в точности равна .)
  • Кривая Леви — крона дерева Пифагора.

Вариации[править | править вики-текст]

Стандартная кривая Леви строится с помощью равнобедренных треугольников с углами при основании 45°. Вариации кривой Леви можно построить с помощью равнобедренных треугольников с другими, отличными от 45° углами. До тех пор, пока угол меньше 60°, каждая новая линия короче той линии, из которой она образована, так что процесс строительства стремится к предельной кривой. Углы менее 45° производят фрактал, который менее плотно "свернут".


Пример алгоритма на PHP[править | править вики-текст]

<?php
        $i = 10;
        
        $image = imagecreatetruecolor(640, 480);
        imagefilledrectangle($image, 0, 0, imagesx($image) - 1, imagesy($image) - 1,
                imagecolorresolve($image, 255, 255, 255));
        $color = imagecolorresolve($image, 0, 0, 0);
 
        drawLevy($image, imagesx($image) * 3/8, imagesy($image) * 3/8,
                imagesx($image) * 5/8, imagesy($image) * 5/8, $i, $color);
        
        /**
         * Draws levy curve between two points.
         * @return void
         */
        function drawLevy($image, $xa, $ya, $xc, $yc, $i, $color) {
            if($i == 0)
                imageline($image, $xa, $ya, $xc, $yc, $color);
            else {
                // A---B
                //     |
                //     C
                $xb = ($xa + $xc) / 2 + ($yc - $ya) / 2;
                $yb = ($ya + $yc) / 2 - ($xc - $xa) / 2;
                drawLevy($image, $xa, $ya, $xb, $yb, $i - 1, $color);
                drawLevy($image, $xb, $yb, $xc, $yc, $i - 1, $color);
            } 
        }
 
        header('Content-type: image/png');
        imagepng($image);
        imagedestroy($image);


Пример алгоритма на Python 3[править | править вики-текст]

from turtle import *
instruction = ['l', 'f', 'r', 'f', 'l']


def movement(iterations=1, actions=None, length=None):
    if not actions:
        actions = ['f']
    if not length:
        length = 200 / 2 ** (iterations/2)
    for i in actions:
        if i == 'f':
            if iterations != 0:
                movement(iterations - 1, instruction, length)
            else:
                forward(length)
        elif i == 'l':
            left(45)
        elif i == 'r':
            right(90)

iterations = 18
speed(0), tracer(0, 0)
movement(iterations)
update()
mainloop()

См. также[править | править вики-текст]