Хорошо, я укушу. Во-первых, Mathematica позволяет применять функции через одну из нескольких форм : стандартную форму - f[x]
, префиксную форму - f @ x
, постфиксную форму - f // x
и инфиксную форму - x ~ f ~ y
. Код Велисария использует как стандартную, так и префиксную форму.
Итак, давайте сначала рассмотрим самые внешние функции: Graphics @ x /. gg : Graphics[___]:> Rotate[gg,Pi/2]
, где x
- это все, что внутри Flatten
. По сути, это создает объект Graphics
из x
и с использованием именованного шаблона (gg : Graphics[___]
) поворачивает получившийся объект Graphics
на 90 градусов.
Теперь, чтобы создать объект Graphics
, нам нужно предоставить набор примитивов, и это в форме вложенного списка, где каждый подсписок описывает некоторый элемент. Это делается с помощью команды Table
, которая имеет вид: Table[ expr, iterators ]
. Итераторы могут иметь несколько форм, но здесь они оба имеют форму {var, min, max}
, и, поскольку у них нет 4-го члена, они принимают каждое значение от min
до max
с целочисленными шагами. Итак, наши итераторы {r, 7, 64}
и {t, 1, 72}
, и expr
оценивается для каждого значения, которое они принимают. Так как у нас есть два итератора, это создает матрицу, которая может запутать Graphics
, поэтому мы используем Flatten[ Table[ ... ], 1]
, мы берем каждый элемент матрицы и помещаем его в простой список.
Каждый элемент, который создает Table
, прост: цвет (ColorData
), размер точки (PointSize
) и местоположение точки (Point
). Итак, с Flatten
мы создали следующее:
Graphics[{{color, point size, point}, {color, point size, point}, ... }]
Генерация цвета берется из данных, и предполагается, что данные были помещены в список с именем a
. Доступ к отдельным элементам a
осуществляется через конструкцию Part
: [[]]
. На первый взгляд, конструкция ColorData
выглядит немного странно, но ее можно прочитать, так как ColorData["CMYKColors"]
возвращает ColorDataFunction
, который выдает значение цвета CMYK, если задано значение от 0 до 1. Вот почему данные из a
масштабируются так, как они есть.
Размер точки генерируется из радиальной координаты. Можно ожидать, что с 1/Sqrt[r]
размер точки должен уменьшаться с увеличением r
, но Log
инвертирует масштаб.
Точно так же, местоположение точки получается из радиальных и угловых (t
) переменных, но Point
принимает их только в форме {x,y}
, поэтому ему нужно было их преобразовать. При преобразовании из {r,t}
в {x,y}
возникают две странные конструкции: оба rr
и tt
равны Set (=
) при расчете x
, что позволяет использовать их при вычислении y
. Кроме того, термин t 5 Degree
позволяет Mathematica знать, что угол в градусах, а не в радианах. Кроме того, как написано, есть ошибка: сразу после закрытия }
термины &
и @
не должны быть там.
Это помогает?