Кривая Леви

Материал из Википедии — свободной энциклопедии
Версия от 10:34, 21 октября 2023; imported>Alex parker 1979 (оформление)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску
Кривая Леви
Анимация построения

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

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

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

Свойства

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

Вариации

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

Пример алгоритма на PHP

<source lang="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);

?> </source>

Пример алгоритма на Python 3

<source lang="python"> import turtle

turtle.hideturtle() turtle.tracer(0) turtle.penup() turtle.setposition(-100, 0) turtle.pendown()

axiom, tempAx, logic, iterations = 'F', , {'F': '-F++F-'}, 15

for i in range(iterations):

   for j in axiom:
       tempAx += logic[j] if j in logic else j
   axiom, tempAx = tempAx, 

for k in axiom:

   if k == '+':
       turtle.right(45)
   elif k == '-':
       turtle.left(45)
   else:
       turtle.forward(1)

turtle.update() turtle.mainloop() </source>

См. также

Шаблон:Нет ссылок Шаблон:Кривые