Monday, May 2, 2011

немного об Asymptote

Как-то раз на лекции И. Романовский нахваливал нам MetaPost. Штука эта, безусловно, крута. Только вот есть у неё один существенный недостаток: при редком использовании самобытный синтаксис языка напрочь забывается (сужу по себе).

Однако существует не менее хороший язык Asymptote, созданный под влиянием MetaPost. Появился он в 2004 году (то бишь где-то вчера утром по меркам старика Романовского) и обладает C++-подобным синтаксисом. Даже Java-подобным, я б сказал.

Например, нарисуем фигурную скобку:

unitsize(1cm);

settings.outformat = "gif";

int height = 10;
real slant_coeff = 0.12;
transform t = shift(0, height/4);
pair A = (0, 0), B = (1, 0), C = t * B;

guide g = A{up}::{right}C; 
g = g -- reverse(shift(B-A) * g);
g = g -- shift(B-A) * rotate(180) * g;
g = slant(slant_coeff) * g;

fill(g--cycle);

add(currentpicture, reflect(t^-1 * A, t^-1 * B) * currentpicture); 

Как видите, всё просто. Сперва задаём единичную длину и выходной формат, после чего инициализируем некоторые переменные. Как можно видеть, помимо обычных числовых типов есть transform, который по сути своей есть набор из 6 чисел, соответствующих определённому аффинному преобразованию в 2D. Преобразования применяются путём умножения слева. Их также можно умножать друг на друга (12-я строка) и возводить в целочисленную степень, в том числе и отрицательную, если это возможно (последняя строка).

(Ещё стоит отметить, что в 7-й строке height/4 = 2.5, а вовсе не 2, как можно подумать.)

Теперь по поводу guide. В Asymptote есть также тип path — путь в его топологическом смысле, — очень похожий на guide. Разница в том, что guide — это набор узлов и контрольных точек, на которых будет при отрисовке построена кривая Безье, а path заключает в себе уже построенную кривую.
Путь в простейшем случае задаётся как набор точек, как-либо соединённых: соединение прямой линией обозначается '--', кривой Безье — '..', кривой Безье с минимумом перегибов — '::'. Также в фигурных скобках могут задаваться различные параметры навроде направления или кривизны.

Для 3D используются типы triple, path3, transform3, surface, projection, ...

И, да, между прочим: несмотря на всю схожесть с C++, в Asymptote нет постфиксных форм операторов инкремента/декремента. Только инфиксные. Так уж вышло.

В общем, кто заинтересовался — гоу на http://asymptote.sourceforge.net


No comments:

Post a Comment