Пожалуйста, объясните этот код в Mathematica, который создает карту тепла / интенсивности - PullRequest
2 голосов
/ 02 марта 2011
Graphics@Flatten[Table[

(*colors, dont mind*)
{ColorData["CMYKColors"][(a[[r, t]] - .000007)/(.0003 - 0.000007)], 

(*point size, dont mind*)
PointSize[1/Sqrt[r]/10], 

(*Coordinates for your points "a" is your data matrix *)
   Point[
        {(rr =Log[.025 + (.58 - .25)/64 r]) Cos@(tt = t 5 Degree), 
          rr Sin@tt}]
        } &@

 (*values for the iteration*)
 , {r, 7, 64}, {t, 1, 72}], 1] 

 (*Rotation, dont mind*)
 /. gg : Graphics[___] :> Rotate[gg, Pi/2]  

1 Ответ

7 голосов
/ 02 марта 2011

Хорошо, я укушу. Во-первых, 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 знать, что угол в градусах, а не в радианах. Кроме того, как написано, есть ошибка: сразу после закрытия } термины & и @ не должны быть там.

Это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...