В математике кривая Леви C — это самоподобная фрактальная кривая , которая была впервые описана и чьи свойства дифференцируемости были проанализированы Эрнесто Чезаро в 1906 году и Георгом Фабером в 1910 году, но теперь носит имя французского математика Поля Леви , который был первым, кто описал ее свойства самоподобия , а также предоставил геометрическую конструкцию, показывающую ее как представительную кривую в том же классе, что и кривая Коха . Это особый случай кривой удвоения периода, кривой де Рама .
Если используется система Линденмайера , то построение кривой C начинается с прямой линии. Равнобедренный треугольник с углами 45°, 90° и 45° строится с использованием этой линии в качестве гипотенузы . Затем исходная линия заменяется двумя другими сторонами этого треугольника.
На втором этапе две новые линии формируют основание для другого прямоугольного равнобедренного треугольника и заменяются двумя другими сторонами соответствующего треугольника. Таким образом, после двух этапов кривая приобретает вид трех сторон прямоугольника с той же длиной, что и исходная линия, но шириной в два раза меньше.
На каждом последующем этапе каждый отрезок прямой линии в кривой заменяется двумя другими сторонами прямоугольного равнобедренного треугольника, построенного на нем. После n этапов кривая состоит из 2 n отрезков прямой, каждый из которых меньше исходной линии в 2 n /2 раза .
Эту L-систему можно описать следующим образом:
где « F » означает «тянуть вперед», «+» означает «повернуть по часовой стрелке на 45°», а «−» означает «повернуть против часовой стрелки на 45°».
Фрактальная кривая , которая является пределом этого «бесконечного» процесса, — это кривая Леви С. Свое название она получила из-за сходства с богато украшенной версией буквы «С». Кривая напоминает более тонкие детали дерева Пифагора .
Размерность Хаусдорфа кривой C равна 2 (она содержит открытые множества), тогда как граница имеет размерность около 1,9340 [1].
Стандартная кривая C строится с использованием равнобедренных треугольников с углом 45°. Вариации кривой C могут быть построены с использованием равнобедренных треугольников с углами, отличными от 45°. Пока угол меньше 60°, новые линии, вводимые на каждом этапе, короче линий, которые они заменяют, поэтому процесс построения стремится к предельной кривой. Углы меньше 45° создают фрактал, который менее плотно «закручен».
Если использовать итеративную систему функций (IFS, или, на самом деле, метод IFS игры хаоса ), то построение кривой C немного проще. Для этого понадобится набор из двух «правил», которые таковы: Две точки на плоскости ( трансляторы ), каждое из которых связано с масштабным коэффициентом 1/ √ 2 . Первое правило — это поворот на 45°, а второе — на −45°. Этот набор будет итерировать точку [ x , y ] из случайного выбора любого из двух правил и использовать параметры, связанные с правилом, для масштабирования/поворота и переноса точки с использованием функции 2D- преобразования .
Подставим в формулы:
из начального набора точек .
// Пример реализации кривой Леви C на Javaимпорт java.awt.Color ; импорт java.awt.Graphics ; импорт java.awt.Graphics2D ; импорт javax.swing.JFrame ; импорт javax.swing.JPanel ; импорт java.util.concurrent.ThreadLocalRandom ; открытый класс C_curve расширяет JPanel { public float x , y , len , alpha_angle ; public int iteration_n ; public void paint ( Graphics g ) { Graphics2D g2d = ( Graphics2D ) g ; c_curve ( x , y , len , alpha_angle , iteration_n , g2d ); } public void c_curve ( double x , double y , double len , double alpha_angle , int iteration_n , Graphics2D g ) { double fx = x ; double fy = y ; double length = len ; double alpha = alpha_angle ; int it_n = iteration_n ; if ( it_n > 0 ) { length = ( length / Math . sqrt ( 2 )); c_curve ( fx , fy , length , ( alpha + 45 ), ( it_n - 1 ), g ); // Рекурсивный вызов fx = ( fx + ( length * Math . cos ( Math . toRadians ( alpha + 45 )))); fy = ( fy + ( length * Math . sin ( Math . toRadians ( alpha + 45 )))); c_curve ( fx , fy , length , ( alpha - 45 ) , ( it_n - 1 ) , g ) ; // Рекурсивный вызов } else { Color [ ] A = { Color.RED , Color.ORANGE , Color.BLUE , Color.DARK_GRAY } ; g.setColor ( A [ ThreadLocalRandom.current ( ) ) . nextInt ( 0 , A . length ) ] ); //Для выбора различных значений цвета g . drawLine (( int ) fx , ( int ) fy , ( int ) ( fx + ( length * Math . cos ( Math . toRadians ( alpha ))))), ( int ) ( fy + ( length * Math . sin ( Math . toRadians ( alpha ))))); } } public static void main ( String [] args ) { C_curve points = new C_curve (); points . x = 200 ; // Указание значения x points . y = 100 ; // Указание значения y points . len = 150 ; // Указание значения длины points . alpha_angle = 90 ; // Указание значения угла points . iteration_n = 15 ; // Указание значения итерации JFrame frame = new JFrame ( " Points " ) ; frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE ) ; frame.add ( points ) ; frame.setSize ( 500 , 500 ) ; frame.setLocationRelativeTo ( null ) ; frame.setVisible ( true ) ; } }