% !TeX encoding = UTF-8 Unicode
% MSP, 30.06.20, 12:27
% MSP, 01.08.20, 21:31
% Compilator: lualatex
% Font Encoding: utf-8
% LIBRARY
% FILE: macros_msp.mp
% Version: 1
% должен быть помещён в текущую директорию.
% Библиотека подключается в листинге так:
% input macros_msp;
% эта строка должна быть написана перед beginfig (1);
% macros 1
% MSP, 07.07.20, 23:34
% окружность с цетром O и радиусом R
% return path
def circle (expr O, R) =
fullcircle scaled (2 * R) shifted O
enddef;
% MSP, 06.07.20, 22:06
% macros 2
% Из Library Арсения Акопяна
% отрезок с хвостиками за концевыми точками
% A и B - концы отрезка
% return path
% tail_A - 0.2 - длина хвостика у конца А
% tail_B - 0.4 - длина хвостика у конца B
def line (expr A, B)(expr tail_A, tail_B) =
((1 + tail_A) * A - tail_A * B)
--
((1 + tail_B) * B - tail_B * A)
enddef;
% SEE: mpman-ru.pdf
% радиус дуги-маркера угла
angle_radius = 14bp;
% MSP, 04.07.20, 11:25
% длина стороны маркера-квадратика прямого угла
marksize = 6pt;
% SEE: mpman-ru.pdf
% macros 3
% маркировка угла дугой с засечками
% a, b, c смотрим по часовой стрелке
% дужка маркера одна
% n - число засечек на дуге-маркере
% например, size = 15bp
def mark_angle (expr a, b, c)(text n)(text color)(text size) =
begingroup
save s, p;
path p;
p = unitvector (a - b){(a - b) rotated 90}..unitvector(c - b);
s = size / length (point 1 of p - point 0 of p);
% n засечек рисовать на пути p scaled s shifted b
draw_marked (p scaled s shifted b, n)(color);
endgroup
enddef;
% маркировка прямого угла
% MSP, 04.07.20, 12:35
% macros 4
def mark_rt_angle (expr a, b) =
draw ((1,0)--(1,1)--(0,1))
zscaled (angle_radius * unitvector (a - b))
shifted b
enddef;
% MSP, 04.07.20, 11:25
% macros 5
% нужен для того, чтобы нарисовать несколько засечек на пути
% путём может быть, например, отрезок.
def draw_mark (expr p, a)(text color) =
begingroup
save t, dm;
pair dm;
% время
t = arctime a of p;
dm = marksize * unitvector direction t of p
rotated 90;
draw (-.5dm.. .5dm)
shifted point t of p
withcolor color;
endgroup
enddef;
% macros 6
% засечка на пути p, например p == отрезок
% p - путь, на котором рисуются засечки
% n - число засечек
% CALL: draw_mark (...)
def draw_marked (expr p)(text n)(text color) =
begingroup
save amid;
% середина пути p (например, середина отрезка)
amid = .5 * arclength p;
% рисование n засечек
for i = -(n - 1) / 2 upto (n - 1) / 2 :
draw_mark (p, amid + .6marksize * i)(color);
endfor
draw p;
endgroup
enddef;
% macros 7
% MSP, 03.07.20, 19:13
% Квадратик, помечающий прямой угол с заданным размером
% угол ABC
def mark_right_angle (expr a, b, c)(text size) =
begingroup
save m, n, r;
pair m, n;
r := size;
if size <= 0 :
r := (8 * pt) * 2 / 3;
fi
m = unitvector (a - b);
n = unitvector (c - b);
draw (m -- (m + n) -- n) scaled r shifted b;
endgroup
enddef;
% macros 8
% дуга от одной стороны угла до другой
% O - вершина угла
% имеется ввиду угол AOB, который нужно отметить дугой-маркером
% d - радиус дуги, приходит из mark_circle_angle
def mark_circle_angle_ (expr A, O, B, d) =
draw (O + d * unitvector (A - O))
{ d * unitvector (A - O) rotated 90 }
..
{ d * unitvector (B - O) rotated 90 }
(O + d * unitvector (B - O));
enddef;
% macros 9
% MSP, 03.07.20, 19:16
% SEE: Metapost : exemples
% отметка дужками угла AOB
% n - сколько дуг-маркеров
% O - вершина угла AOB
% CALL: mark_circle_angle_
%
def mark_circle_angle (expr A, O, B)(text n)(text size) =
begingroup
if n = 1 :
mark_circle_angle_ (A, O, B, size + 3bp);
fi;
if n = 2 :
mark_circle_angle_ (A, O, B, size + 3bp);
mark_circle_angle_ (A, O, B, size + 5bp);
fi;
if n = 3 :
mark_circle_angle_ (A, O, B, size + 3bp);
mark_circle_angle_ (A, O, B, size + 5bp);
mark_circle_angle_ (A, O, B, size + 7bp);
fi;
if n = 4 :
mark_circle_angle_ (A, O, B, size + 3bp);
mark_circle_angle_ (A, O, B, size + 5bp);
mark_circle_angle_ (A, O, B, size + 7bp);
mark_circle_angle_ (A, O, B, zise + 9bp);
fi;
endgroup
enddef;
% MSP, 02.07.20, 00:42
% macros 10
% нахождение точки основания перпендикуляра, проведенного
% из точки A на отрезок [BC]
% T - основание перпендикуляра
vardef osn_perpend (expr A, B, C) =
save T;
pair T;
T - A = whatever * (B - C) rotated 90;
T = whatever [B, C];
T
enddef;
% MSP, 01.07.20
% macros 11
% нахождение точки основания биссектрисы,
% проведенной из вершины A угла CAB на отрезок [CB]
vardef osn_bisector (expr A, C, B) =
save z;
pair z;
z = whatever [C, B]
= A + whatever * dir (1/2 * angle (C-A) + 1/2 * angle (B-A));
z
enddef;
% macros 12
% Точка пересечения двух прямых
% p, q, r, s - 4 точки (2 пары)
vardef point_per_two_lines (expr p, q, r, s) =
save z;
pair z;
% уравнение нахождения точки пересечения
z = whatever [p, q] = whatever [r, s];
z
enddef;
% macros 13
vardef center_vpis_circle (expr A, B, C) =
save z, v, w;
pair z, v, w;
z = osn_bisector (A, B, C);
v = osn_bisector (C, A, B);
w = point_per_two_lines (A, z, C, v);
w
enddef;
% macros 14
vardef radius_vpis_circle (expr A, B, C) =
save w, z;
pair w, z;
w = center_vpis_circle (A, B, C);
z = osn_perpend (w, A, C);
abs (w - z)
enddef;
% macros 15
def vpis_circle (expr A, B, C) =
fullcircle
scaled (2 * radius_vpis_circle (A, B, C))
shifted center_vpis_circle (A, B, C);
enddef;
% MSP, 01.07.20, 13:50
% macros 16
% нарисовать красивую крупную круглую точку
% pair z - закрашиваемая точка
% color - цвет точки
% size - диаметр точки
def draw_point (expr z)(text color)(text size) =
begingroup
% запомним текущее значение a
save t;
% теперь t - локальная, работает только внутри этого макроса
path t; % путь фигуры
% рисуется окружность с центром origin == (0, 0),
% её центр смещается точку z
t := fullcircle
scaled size
shifted z;
% точка закрашивается
fill t withcolor color;
endgroup
enddef;
% центр описанной окружности вокруг треугольника SET
% MSP, 22.07.20, 01:03
% macros 17
vardef center_opis_circle (expr S, E, T) =
save O;
pair O;
O - 1/2 [T, E] = whatever * (T - E) rotated 90;
O - 1/2 [S, T] = whatever * (S - T) rotated 90;
O
enddef;
% поиск основания биссектрисы угла BAD, лежащей на [BD]
% A - вершина угла
% MSP, 22.07.20, 01:03
% macros 18
vardef bisector (expr A, B, D) =
save P;
pair P;
P = whatever [B, D]
= whatever * right shifted
A rotatedabout (A, 1/2 (angle (D-A) + angle (B-A)));
P
enddef;
% macros 19
% центр описанной окружности около треугольника
% найден как точка пересечения 3-х серединных перпендикуляров
% (медиатрис) к сторонам треугольника
% p, q, r - вершины треугольника
vardef center_opis_circle_ap (expr p, q, r) =
point_per_two_lines (
.5[p, q],
.5[p, q] + ((q-p) rotated 90),
.5[q, r],
.5[q, r] + ((r-q) rotated 90)
)
enddef;
% macros 20
% Радиус окружности
% Находим как расстояние от центра окружности до одной
% из его вершин
vardef radius_opis_circle (expr p, q, r) =
abs (center_opis_circle (p, q, r) - p)
enddef;
% macros 21
% Построение окружности по 3 точкам
% return <путь>
vardef opis_circle (expr p, q, r) =
fullcircle
scaled (2 * radius_opis_circle (p, q, r))
shifted center_opis_circle (p, q, r)
enddef;
% END.
|