Скрипты рисунков на MetaPost
[Download]
mac_1.tex



% !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.


Листинг-original с сайта http://www.Best-Listing.ru
Автор решения: Сергей Митрофанов Кто подготовил код к публикации: Sergey Mitrofanov
Дата записи в базу данных: 02-08-2020 Время записи в базу данных: 22:27:32
Просмотров: 25 Download: 21
mac_1.tex
[Download]

Скрипты рисунков на MetaPost
Valid XHTML 1.0 Transitional Valid CSS

Copyright © www.Best-Listing.ru, 2006–2024