В математике орбитальная ловушка — это метод раскрашивания фрактальных изображений, основанный на том, насколько близко итерационная функция , используемая для создания фрактала, приближается к геометрической фигуре, называемой «ловушкой». Типичные ловушки — это точки, линии, круги, формы цветов и даже растровые изображения . Орбитальные ловушки обычно используются для раскрашивания двумерных фракталов, представляющих комплексную плоскость.
Точечная орбитальная ловушка окрашивает точку в зависимости от того, насколько близко орбита функции подходит к одной точке, обычно к началу координат.
Орбитальная ловушка на основе линий окрашивает точку в зависимости от того, насколько близко орбита функции подходит к одной или нескольким линиям, обычно вертикальным или горизонтальным (линии x=a или y=a). Примером орбитальной ловушки на основе линий, которая использует две линии, являются стебли пиковера .
Орбитальные ловушки обычно используются с классом двумерных фракталов, основанных на итеративной функции. Программа, которая создает такой фрактал, раскрашивает каждый пиксель, представляющий дискретные точки в комплексной плоскости, на основе поведения этих точек, когда они проходят через функцию заданное количество раз.
Самым известным примером такого рода фрактала является множество Мандельброта , которое основано на функции z n +1 = z n 2 + c . Наиболее распространенный способ раскрашивания изображений Мандельброта — это взятие числа итераций, необходимых для достижения определенного значения спасения, а затем назначение этому значению цвета. Это называется алгоритмом времени спасения.
Программа, которая раскрашивает множество Мандельброта с помощью точечной орбитальной ловушки, назначает каждому пикселю переменную «расстояние», которая обычно будет очень большой при первом назначении:
двойное расстояние = 10 e5
Поскольку программа передает комплексное значение через итеративную функцию, она будет проверять расстояние между каждой точкой орбиты и точкой ловушки. Значение переменной расстояния будет кратчайшим расстоянием, найденным во время итерации:
private double getDistance ( Complex c , Complex point , int maxIteration ) { double distance = 1e20 ; Complex z = new Complex ( 0 , 0 ); for ( int i = 0 ; i < maxIteration ; i ++ ) { // Выполнить итерацию Мандельброта z = z.multiple ( z ) ; z = z.add ( c ) ; // Установить новое расстояние dist = min(dist, |z-point | ) Complex zMinusPoint = new Complex ( z ) ; zMinusPoint = zMinusPoint.subtract ( point ) ; double zMinusPointModulus = zMinusPoint.Magnitude ( ) ; if ( zMinusPointModulus < distance ) distance = zMinusPointModulus ; } return distance ; }