133
КИЇВСЬКИЙ НАЦIОНАЛЬНИЙ УНIВЕРСИТЕТ IМЕНI ТАРАСА ШЕВЧЕНКА В. I. Романенко О. В. Романенко L A T E X У НАУКОВИХ ПУБЛIКАЦIЯХ ГРАФIЧНI ПОБУДОВИ Навчальний посiбник Рекомендовано Мiнiстерством освiти i науки України як навчальний посiбник для студентiв фiзичних спецiальностей унiверситетiв

ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

КИЇВСЬКИЙ НАЦIОНАЛЬНИЙ УНIВЕРСИТЕТ IМЕНI ТАРАСА ШЕВЧЕНКА

В. I. РоманенкоО. В. Романенко

LATEX У НАУКОВИХПУБЛIКАЦIЯХ

ГРАФIЧНI ПОБУДОВИ

Навчальний посiбник

Рекомендовано Мiнiстерством освiти i науки Українияк навчальний посiбник

для студентiв фiзичних спецiальностей унiверситетiв

Page 2: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

УДК 514.18:655.26(075.8)ББК 22.1+37.8я73

Р69

Рецензенти:д-р фiз.-мат. наук, проф., чл.-кор. НАН України Л. П. Яценко,

д-р фiз.-мат. наук, проф., чл.-кор. НАН України Б. I. Лев,д-р фiз.-мат. наук, проф. С. Й. Вiльчинський

Рекомендовано до друку вченою радою фiзичного факультету

(протокол № 12 вiд 18 травня 2009 року)

Романенко, В. I.

Р69 LATEX у наукових публiкацiях. Графiчнi побудови : навчальний посiбник/ В. I. Романенко, О. В. Романенко. – К. : Видавничо-полiграфiчний центр“Київський унiверситет”, 2011. – ?? с.

ISBN 978-966-439-416-8

Подано два найуживанiшi пакети графiчного розширення видавничої системиLATEX. Наведено опис мови МетаPost, яка дозволяє створювати рисунки у форматiPostScript, та пакет макросiв PSTricks, який дозволяє будувати рисунки безпосере-дньо в документi. Запропонований обсяг матерiалу цiлком достатнiй для пiдготовкистудентських курсових i дипломних робiт, а також наукових публiкацiй. Численнiприклади iлюструють застосування МетаPost i PSTricks у графiчних побудовах.

Для студентiв, аспiрантiв, викладачiв та наукових спiвробiтникiв природничихфакультетiв унiверситетiв.

УДК 514.18:655.26(075.8)ББК 22.1+37.8я73

Гриф надано Мiнiстерством освiти i науки України(лист № 1/11-3874 вiд 11.05.10)

ISBN 978-966-439-416-8 c© Романенко В. I., Романенко О. В., 2011c©Київський нацiональний унiверситет

iменi Тараса Шевченка,ВПЦ “Київський унiверситет”, 2011

Page 3: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

ЗМIСТ

Передмова . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Частина I. Практичний курс METAPOST

Роздiл 1. Основнi поняття . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.1. Про METAPOST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2. Приклади найпростiших рисункiв . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.3. Вигляд вхiдного файла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.4. Одиницi довжини . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.5. Координати . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.6. Iмена величин . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.7. Токени . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Роздiл 2. Типи величин . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.1. Тип numeric . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.2. Тип boolean . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.3. Тип color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.4. Тип pair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.5. Тип path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.6. Тип pen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.7. Тип picture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.8. Тип string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.9. Тип transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Роздiл 3. Побудова кривих i ламаних лiнiй . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

3.1. Загальнi вiдомостi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.2. Штриховi лiнiї та пунктир . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.3. З’єднання лiнiй. Опцiї команди draw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.4. Стрiлки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.5. Коло, елiпс, суперелiпс, квадрат, прямокутник, паралелограм . . . . . . . . . 373.6. Шлях як функцiя параметра . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Роздiл 4. Програмування тексту i графiки у METAPOST . . . . . . . . . . . . . . . . . 46

4.1. Текст у METAPOST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464.2. Умовний оператор i оператор циклу . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504.3. Операцiї обрiзання та витирання . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554.4. Локальнi i глобальнi величини . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564.5. Рiвняння в METAPOST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

3

Page 4: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

4.6. Читання даних iз файла i запис у файл . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.7. Макроси . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

Роздiл 5. Побудова графiкiв у METAPOST за допомогою макросiв GRAPH . . 67

5.1. Приклад побудови графiка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675.2. Дiапазон абсцис i ординат . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695.3. Логарифмiчна система координат . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705.4. Кiлька координатних осей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725.5. Безпосереднє задання позначок на осях . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745.6. Читання даних iз файла i обробка даних . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765.7. Арифметика великих чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

Роздiл 6. Приклади рисункiв, створених за допомогою METAPOST . . . . . . . 81

6.1. Геометрiя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816.2. Графiки функцiй . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866.3. Механiка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 956.4. Молекулярна фiзика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1066.5. Електрика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106.6. Геометрична оптика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156.7. Атомна фiзика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1216.8. Iлюстративна дiаграма . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

Прикiнцевi зауваження до частини I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

4

Page 5: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

ПЕРЕДМОВА

Посiбник призначений для студентiв фiзичного факультету i є частиною серiїкiлькох посiбникiв “LATEX у наукових публiкацiях” (зi спiльною назвою та рiзнимипiдзаголовками), що планується до видання кафедрою теоретичної фiзики фiзичногофакультету Київського нацiонального унiверситету iменi Тараса Шевченка на основiспецiальної дисциплiни з пакета LATEX, що викладається на фiзичному факультетi1.Видання присвячено графiчним розширенням видавничої системи LATEX, тут роз-глянуто два найпоширенiшi пакети для виконання графiчних побудов у документахLATEX.

Будь-якому студенту, аспiранту та науковцю добре вiдомо, що, окрiм отриман-ня оригiнальних i важливих результатiв, у науковiй роботi важливе мiсце належитьвмiнню правильно подати цi результати у виглядi наукової статтi, монографiї або еле-ктронної публiкацiї. Загальноприйнятим стандартом у наукових публiкацiях є верс-тка тексту у LATEX та iмпорт графiки у векторному форматi PostScript, що забезпечуємаксимально широкi можливостi для створення зображення. Кожне видавництво ви-суває свої вимоги, однак задовольнити бiльшiсть iз них можна за допомогою низкипакетiв унiверсального призначення, серед яких найбiльш вiдомими є METAPOST таPSTricks. Перший пакет — один iз найстарiших, вiн є компiлятором для створенняPostScript-коду на основi специфiчної мови програмування графiчних елементiв ри-сунка. Його розробив американець Д. Хоббi — на той час аспiрант Д. Кнута (авторасистеми TEX). Пакет PSTricks було створено як макрос на початку 90-х рр. Т. ванЗандтом. На даний час розвиток обох пакетiв широко пiдтримується науковцями,програмiстами, фахiвцями з комп’ютерної полiграфiї. Крiм того, багато вузькоспе-цiалiзованих пакетiв, призначених для розв’язання специфiчних задач, розвивалисьпiд значним впливом структури цих та деяких iнших пакетiв. Саме тому автори цьо-го посiбника впевненi, що вивчення графiчних можливостей LATEX доцiльно початисаме з METAPOST та (або) PSTricks.

Посiбник мiстить двi абсолютно незалежнi частини. Першу пiдготовано Рома-ненком В. I., тут викладено вступ до макромови METAPOST. У другiй частинi (авторРоманенко О. В.) описується пакет PSTricks, точнiше кiлька пакетiв iз сiм’ї PSTricks,якi актуальнi для фiзикiв.

1Попереднє видання: Дацюк В. В., “Програмування в TEX”, К. : РВЦ КНУ, 2005.

5

Page 6: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

У текстi наведено приклади, бiльшiсть iз них мають iлюстративний характер iпояснюють дiю окремих конструкцiй2. У кiнцi посiбника наведено стислий довiдникiз команд пакета PSTricks.

Посiбник буде корисним для студентiв старших курсiв, якi працюють над ди-пломними роботами та статтями, а також для викладачiв та наукових спiвробiтникiв,якi бажають засвоїти PostScript-пакети сiм’ї LATEX.

Автори вдячнi колегам iз кафедри теоретичної фiзики фiзичного факультету Ки-ївського нацiонального унiверситету iменi Тараса Шевченка та вiддiлу когерентноїта квантової оптики Iнституту фiзики НАН України за кориснi зауваження та пiд-тримку в роботi над посiбником.

2У багатьох прикладах другої частини для скорочення викладу опущено початок та кiнець, власне,команди оточення pspicture.

6

Page 7: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

ЧАСТИНА I

Практичний курс METAPOST

РОЗДIЛ 1. ОСНОВНI ПОНЯТТЯ

1.1. Про METAPOST

Програму METAPOST для виконання рисункiв розроблено Д. Хоббi [?] на основiпрограми METAFONT зi створення шрифтiв, розробленої ранiше Д. Кнутом [?] дляйого ж програми комп’ютерної верстки TEX [?]. METAPOST — природне доповненнядо TEX i LATEX — програми комп’ютерної верстки на основi TEX, створеної Л. Лем-портом [?], оскiльки METAPOST дозволяє використовувати TEX-шрифти i продукуєрисунки високої якостi у форматi PostScript, зручному для верстки в цих програмах.

Наша мета — показати, яким чином можна створити якiснi рисунки у форматiencapsulated PostScript (eps) для подальшого їх використання при пiдготовцi на-укової публiкацiї, користуючись METAPOST. Зазначимо, що у самiй мовi LATEX [?]передбачено можливiсть побудови рисункiв (оточення picture). Крiм того, пiслястворення LATEX, до нього було додано низку пакетiв (epic, eepic та iншi), якi роз-ширили досить скромнi можливостi оточення picture. Цi пакети не обов’язково єна всiх платформах, де реалiзовано LATEX (Unix, MacOSX, 32-розрядний Windows,DOS, Linux). Треба також брати до уваги, що видавництво повинно мати можли-вiсть масштабувати вашi рисунки i вставляти в текст згiдно з правилами верстки.Для цього рисунки оформлюють окремим файлом i вставляють в LATEX-файл у по-трiбному мiсцi (як правило, у текст статтi, що подається в журнал, включають тiлькипiдписи до рисункiв, а самi рисунки подаються окремими файлами).

Хоча LATEX сприймає рисунки кiлькох графiчних форматiв, для пiдготовки iлю-стративного матерiалу перевага надається рисункам у форматi eps. КомпiляторMETAPOST по сутi перекладає команди, написанi користувачем, на мову PostScript,створюючи, таким чином, якiсний графiчний файл.

Обсяг викладеного матерiалу в цiлому достатнiй для пiдготовки рисункiв длянаукових публiкацiй з фiзики i оформлення дипломних i курсових робiт студентiв.

7

Page 8: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Детальнi вiдомостi з програми METAPOST наведено у публiкацiях [?,?,?,?,?]. Оскiль-ки в основi METAPOST лежить METAFONT, багато корисної iнформацiї можна знайтиi в монографiї [?].

1.2. Приклади найпростiших рисункiв

Розглянемо побудову ламаної лiнiї. Для цього створимо файл simple.mp, як цепоказано у прикладi 1.1.

➠ Приклад 1.1.

Запишемо змiст файла simple.mp

beginfig(1)

draw (0,0)--(0,50)--(50,50)--(50,0);

endfig;

end;

Маємо змiст файла simple.1

%!PS

%%BoundingBox: -1 -1 51 51

%%Creator: MetaPost

%%CreationDate: 2008.08.27:1253

%%Pages: 1

%%EndProlog

%%Page: 1 1

0 0.5 dtransform truncate idtransform setlinewidth pop [] 0

setdash 1 setlinecap 1 setlinejoin 10 setmiterlimit

newpath 0 0 moveto

0 50 lineto

50 50 lineto

50 0 lineto stroke

showpage

%%EOF

Пiсля виконання команди mp simple.mp отримуємо файл simple.1, написаний мовою

PostScript. Пiсля перейменування розширення на eps його можна переглянути за допомогою

програми Gsview (рисунок праворуч) чи включити в LATEX документ

Змiст файла simple.mp показано лiворуч згори, пiд ним — змiст файла simple.1,який виникає пiсля виконання команди mp simple.mp, а праворуч — рисунок, якийможна побачити, переглядаючи файл simple.1 за допомогою програми, що читає

8

Page 9: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

файли, написанi мовою PostScript, наприклад Gsview. Для цього треба переймену-вати simple.1 у simple.eps або simple.ps. Файл simple.eps можна вста-вити в будь-який документ. Для того, щоб команда mp simple.mp спрацювала, накомп’ютерi потрiбно встановити програмний пакет MikTeX.

Два числа у круглих дужках означають x- i y-координати точок. Команда -- озна-чає, що точки будуть з’єднанi прямими лiнiями. Команда .. дає плавне з’єднанняточок. Пiсля замiни -- на .. отримуємо плавну криву, показану в прикладi 1.2 (тутi далi лiворуч наведено командний код, праворуч — рисунок, який йому вiдповiдає).

➠ Приклад 1.2.

beginfig(1)

draw (0,0)..(0,50)..(50,50)..(50,0);

endfig;

end;

Пiсля замiни -- на .. у файлi simple.mp (див. приклад 1.1) отримуємо плавну криву, що

з’єднує точки (0,0), (0,50), (50,50) i (50,0)

1.3. Вигляд вхiдного файла

Файл програми у METAPOST має розширення mp, наприклад, name.mp. У ре-зультатi його обробки програмою METAPOST (командний рядок mp name.mp) ви-никають файли з розширеннями 1, 2, 3, . . . i log. Файли з розширеннями 1, 2,3, . . . — рисунки у форматi PostScript, файл iз розширенням log — файл протоко-лу обробки файла з розширенням mp. Сюди вносяться також результати виконаннякоманди show, яка показує значення тiєї чи iншої величини. У загальному випадкуфайл iз розширенням mp має вигляд

〈 команди 〉beginfig(1);

〈 команди 〉endfig(1);

〈 команди 〉beginfig(2);

〈 команди 〉endfig(2);

......

9

Page 10: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

beginfig(n);

〈 команди 〉endfig(n);

end

Тут beginfig(n) показує початок побудови рисунка номер n, endfig(n) —кiнець побудови. Команди, записанi на початку файла, дозволяють описати величи-ни, що використовуються у кiлькох рисунках mp-файла. Закiнчується файл програмикомандою end. Якщо в рисунку є текст чи формули у форматi TEX або LATEX, требамати на увазi, що файли з розширеннями 1, 2, 3, . . . не мiстять даних про шрифти.Пiсля вставки в LATEX-документ рисунок не можна побачити у файлi з розширеннямdvi, але можна отримати ps-файл iз dvi-файла, у якому рисунки вже видно. Файлз iнформацiєю про шрифти можна дiстати з файла з розширенням n (n = 1, 2, . . .),якщо спочатку перший вставити в допомiжний LATEX-файл i з вiдповiдного йомуdvi-файла отримати eps-файл. Детально робота з LATEX у METAPOST описана впiдроздiлi 4.1.

1.4. Одиницi довжини

За замовчуванням, одиниця вимiрювання вiдстаней у METAPOST — великийпункт, bp (PostScript point), який дорiвнює 1/72 дюйма. 1 дюйм (1 in) = 25,4 мм.Звичайний пункт (printer’s point), pt = 1/72,27 дюйма. Одиниця pc (пiка) вiдповiдає12 pt.

Можна використовувати й iншi одиницi довжини, наприклад mm. Ця одиницядовжини — множник, який виражає кiлькiсть bp в 1 mm. За правилами синтаксисуMETAPOST записи 1*mm i 1mm еквiвалентнi. Можна ввести свої одиницi довжини,наприклад u = 12mm, v = 8mm i користуватися ними при побудовi рисункiв. Уве-дення кiлькох одиниць корисне при масштабуваннi рисункiв, коли є потреба незале-жно змiнювати розмiри деяких елементiв рисункiв. Тут також записи вигляду 1.5*ui 1.5u еквiвалентнi.

Команда show вiдображає у файлi з розширенням log значення змiнної. У при-кладi 1.3 показано змiст файла show.mp i файла show.log, який виникає пiслявиконання командного рядка mp show.mp.

➠ Приклад 1.3.

show mm; >> 2.83464

show in; >> 72

show bp; >> 1

10

Page 11: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

show pt; >> 0.99626

u = 2mm; show u; >> 5.66928

show 2u; >> 11.33856

show 2*u; >> 11.33856

show 10mm; >> 28.3464

show 1pc; >> 11.95517

show pc/mm; >> 4.21753

show pc/pt; >> 12.00003

show mm/pc; >> 0.2371

show in/mm; >> 25.40004

end;

Лiворуч показано змiст файла show.mp, праворуч — частину файла show.log, який вини-

кає пiсля виконання командного рядка mp show.mp i показує результати виконання команди

show

Команда show показує значення величини, котра є її аргументом.

1.5. Координати

Вiдлiк x-координати точки у METAPOST йде злiва праворуч, y-координати — знизувгору. Для побудови рисунка неважливо, додатнi чи вiд’ємнi значення мають коор-динати точок. Проте, якщо з якихось мiркувань бажано, щоб усi значення координатбули додатними, пiсля закiнчення побудови можна додати команду

currentpicture := currentpicture shifted

(-llcorner currentpicture)

i нижня лiва точка рисунка лежатиме в початку координат. Оператор := присвоюєзначення того, що знаходиться праворуч вiд :=, величинi, що лежить лiворуч вiдзнака цiєї операцiї. Знак = використовується для порiвняння величин (див. пiдроз-дiл 2.2) чи в лiнiйних рiвняннях (див. пiдроздiл 4.5). Хоч знак = можна застосовуватидля присвоєння величинi того чи iншого значення, як це зроблено у п’ятому рядкуприкладу 1.3, вiн не еквiвалентний :=. Так, послiдовнiсть операцiй a:=3; a:=2;

коректна. Водночас послiдовнiсть операцiй a=3; a=2; некоректна, оскiльки наве-денi рiвняння несумiснi.

11

Page 12: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

1.6. Iмена величин

Iмена у METAPOST складаються iз двох частин — основної частини (tag) i (не-обов’язково) суфiкса. Суфiкс може бути числом або числовим виразом, напри-клад, a3, a[i+7]. Можна використовувати багатовимiрну iндексацiю, наприклад,p[5][2][4]. Крiм букв, в основнiй частинi застосовуються й iншi символи, най-частiше крапка. Iмена з основною частиною z особливi: вони визначають одночасноаналогiчнi змiннi з основними частинами x i y (координатами x i y змiнної з основ-ною частиною iменi z). Цi самi складовi можна отримати за допомогою операторiвxpart, ypart. У прикладi 1.4 показано змiст файла vars.mp i частину файлаvars.log, який виникає пiсля виконання командного рядка mp vars.mp.

➠ Приклад 1.4.

z.example= (10,20); (vars.mp

show z.example; >> (10,20)

show x.example; >> 10

show y.example; >> 20

show xpart z.example; >> 10

show ypart z.example; >> 20 )

end;

Лiворуч показано змiст файла vars.mp, праворуч — частину файла vars.log, який ви-

никає пiсля виконання командного рядка mp vars.mp i показує, що x.a i y.a — x- i y-

координати змiнної z.a

Зазначимо, що в наведеному прикладi замiсть

z.example= (10,20);

не можна писати

z.example:= (10,20);

Лiворуч вiд операцiї присвоювання має стояти iм’я змiнної, а z.example — це ско-рочений запис двох змiнних типу numeric (див. пiдроздiл 2.1), якi утворюють пару(x.example, y.example) (див. пiдроздiл 2.4). Для змiнної типу пара (pair)подiбна операцiя можлива. Наприклад, якщо w — пара, то можна написати

w:=(10,20);

12

Page 13: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

1.7. Токени

Аналiзуючи файл, METAPOST розглядає його як послiдовнiсть чисел, рядковихконстант (послiдовнiсть символiв, обмежена з обох бокiв лапками ") i символьнихтокенiв. Символьний токен — це послiдовнiсть одного чи кiлькох символiв однако-вого типу. Наведемо цi типи (кожний рядок — символи однакового типу):

ABCDEFGHIJKLMNOPRSTUVWXYZ_abcdefghijklmnoprstuvwxyz

:<=>|

#&@$

/*\

+-

!?

‘’

^~

{}

[

]

Це означає, наприклад, що abc_d — один токен, +! — два токени. Символи ,;()кожний окремо становить токен, наприклад, ((( — три токени.

Особлива роль символу . — крапки. Двi i бiльше крапок формують символьнийтокен. Одна крапка перед цифрою або пiсля неї — частина числа (величина типуnumeric), у iнших випадках крапка iгнорується, але її присутнiсть впливає на аналiзпослiдовностi символiв. Так, a.b — два токени, a i b.

13

Page 14: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

РОЗДIЛ 2. ТИПИ ВЕЛИЧИН

Якщо тип змiнної не визначено явно, вона вважається числовою (numeric).METAPOST може сам встановити тип змiнної, якщо вона — результат операцiї над ужевизначеними типами змiнних. Змiннi типу numeric у METAPOST мають значення,кратнi 2−16 = 1

65536, якi не повиннi перевищувати 4096 = 212. METAPOST не розумiє

експоненцiальну форму запису вигляду 2.31E3. Слiд писати 2310.Iншi типи змiнних такi: boolean (логiчний), color (колiр), pair (пара, задає

координати точки), path (шлях, за яким можна провести ламану лiнiю чи плав-ну криву), pen (перо, яким METAPOST креслить криву чи ставить точку), picture(рисунок), string (рядок), transform (перетворення). Пiсля типу змiнної запису-ється список змiнних через кому. У кiнцi ставиться крапка з комою.

Неправильно:

pair p1, p2;

Правильно:

pair p[];

У цьому разi змiннi p1, p2, p3 (iнша форма запису — p[1], p[2], p[3]) i т. д.визначенi як пари. Можна також визначити багатовимiрнi масиви, наприклад,

pair q[][];

Вiдповiднi змiннi позначаються q[1][1], q[1][2], q[2][1] i т. д.Зазначимо, що оголошення типу змiнної знищує її попереднє значення i робить

змiнну невизначеною.

2.1. Тип numeric

Зi змiнними типу numeric можна виконувати арифметичнi дiї додавання +,вiднiмання −, множення *, дiлення /, обчислення степеня числа **. Визначенотакож операцiї m div n (цiла частина вiд дiлення m на n, [m/n]) i m mod n (цiлаостача вiд дiлення m на n, m− n[m/n]). Крiм того, визначено функцiї:

14

Page 15: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

abs x = |x|,sqrt x =

√x,

sind x = sin (xπ/180) — синус кута у градусах,cosd x = cos (xπ/180) — косинус кута у градусах,mexp x = exp (x/256),mlog x = 256 lnx,floor x = найближче цiле не бiльше x,ceiling x = найближче цiле не менше x,round x = найближче цiле до x,uniformdeviate x = випадкова величина з однорiдним розподiлом

на iнтервалi [0, x],normaldeviate = випадкова величина з нормальним розподiлом

iз µ = 0, σ = 1,decimal x = величина x, записана як string,r[x1,x2] = x1 + r(x2 − x1).

Пiд час роботи з випадковими величинами їх значення, взагалi кажучи, не повто-рюються при повторному запуску програми (якщо час мiж запусками досить вели-кий). Якщо з будь-яких мiркувань бажано при кожному запуску програми отримува-ти однi й тi самi випадковi значення, треба задати значення змiнної randomseed,записавши, наприклад,

randomseed=123.27;

причому значення числа повинно бути меншим за 4096.Зручно ввести функцiї, дiя яких збiгається з вiдповiдними елементарними фун-

кцiями. Їх визначення не вбудовано в METAPOST i користувач задає їх сам:

vardef sqr primary x = (x*x) enddef;

vardef log primary x = (if x=0: 0 else:

mlog(x)/mlog(10) fi) enddef;

vardef ln primary x = (if x=0: 0 else:

mlog(x)/256 fi) enddef;

vardef exp primary x = ((mexp 256)**x) enddef;

% тригонометричнi функцiї

numeric pi; pi := 3.1415926;

numeric radian; radian := 180/pi; % 2*pi*radian = 360;

vardef sin primary x = sind(x*radian) enddef;

vardef cos primary x = cosd(x*radian) enddef;

% гiперболiчнi функцiї

vardef sinh primary x = save xx; xx = exp x;

15

Page 16: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

(xx-1/xx)/2 enddef;

vardef cosh primary x = save xx; xx = exp x;

(xx+1/xx)/2 enddef;

% оберненi тригонометричнi функцiї

vardef arcsind primary x = angle ((1+-+x,x)) enddef;

vardef arccosd primary x = angle ((x,1+-+x)) enddef;

vardef arctand primary x = angle (1,x) enddef;

vardef arcsin primary x = (arcsind(x)/radian) enddef;

vardef arccos primary x = (arccosd(x)/radian) enddef;

vardef arctan primary x = (arctand(x)/radian) enddef;

При визначеннi обернених тригонометричних функцiй використано операцiї пi-фагорового додавання i вiднiмання: a++b =

√a2 + b2, a+−+b =

√a2 − b2. Зазначи-

мо, що використання пiфагорового додавання i вiднiмання допомагає уникнути пере-повнення при роботi з великими числами (коли a2+b2 велике). Можна також записа-ти a++b++c =

√a2 + b2 + c2. Коментарi, як i в LATEX, можна вставляти у програму,

користуючись символом %. Текст у рядку, що мiстить знак %, пiсля нього METAPOST

не сприймає. Службове слово primary використовується METAPOST, щоб задатипослiдовнiсть дiй у виразах. Є також службовi слова secondary, tertiary, якiми тут не розглядаємо. Оскiльки порядок дiй у METAPOST вiдрiзняється вiд звичного(наприклад, множення * i обчислення степеня числа ** мають однаковий прiори-тет), слiд напочатку визначати бажаний порядок дужками навiть у випадках, коливони здаються зайвими. Наприклад, 3*a**2=(3a)2, тому, щоб обчислити 3a2, требазаписати 3*(a**2).

2.2. Тип boolean

Величини типу boolean (тип логiчних величин) можуть набувати значенняtrue або false. Визначено унiтарний оператор not (не), бiнарнi оператори and

(i) та or (або). Оператори = (дорiвнює) i <> (не дорiвнює) визначено з усiма типамизмiнних. Оператори порiвняння (<, <=, >= i >) працюють iз бiльшiстю типiв. Iм’ятипу, за яким iде змiнна (наприклад, color c), дає результат true, якщо ця змiн-на вказаного типу. Оператор not змiнює значення логiчної змiнної true на falsei навпаки. Застосування оператора known до визначеної величини дає true, а доневизначеної — false. Проiлюструємо застосування цих операторiв (приклад 2.1).

➠ Приклад 2.1.

a=5; (boolean.mp

b=3; >> 5

16

Page 17: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

c=2; >> 3

show a,b,c; >> 2

show a>b; >> true

show b>=a; >> false

show a=a; >> true

show a<>a; >> false

show (a=a) and (b<a); >> true

show (a=a) or (b<a); >> true

show not (a<>a); >> true

show numeric a; >> true

show color a; >> false

show pair f; >> false

pair f; show f; >> (xpart f,ypart f)

show pair f; >> true

show pair z; >> true

show known z; >> false )

end;

Лiворуч показано змiст файла boolean.mp, праворуч — частину файла boolean.log,

який виникає пiсля виконання командного рядка mp boolean.mp. За замовчуванням, змiннi

мають тип numeric за винятком тих, iмена яких починаються iз z

2.3. Тип color

Тип color (колiр) використовується, щоб задати колiр елементiв рисунка, у томучислi вiдтiнки сiрого. Колiр задається трьома компонентами: червоний (red), зеле-ний (green), синiй (blue) i записується у виглядi трьох чисел у дужках (r,g,b).Область значення кожної з компонент — вiд 0 до 1. Сумiш червоного, зеленого i си-нього кольорiв дає сiрий або бiлий (white) колiр. Бiлий колiр вiдповiдає (1,1,1),вiдтiнки сiрого — (a,a,a), де a<1. Кольори можна використовувати в лiнiйнихрiвняннях, додавати, множити i дiлити на величину типу (numeric).

Наведемо константи i функцiї, що застосовуються в роботi з кольором:

color c = true, якщо c — колiр,black = (0, 0, 0) — чорний колiр,white = (1, 1, 1) — бiлий колiр,red = (1, 0, 0) — червоний колiр,green = (0, 1, 0) — зелений колiр,blue = (0, 0, 1) — синiй колiр,redpart(r,g,b) = r — червона компонента кольору,

17

Page 18: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

greenpart(r,g,b) = g — зелена компонента кольору,bluepart(r,g,b) = r — синя компонента кольору,background = колiр фону, по замовчуванню бiлий,r[c1,c2] = c1 + r(c2 − c1).

В останнiх версiях METAPOST можна користуватися системою кольорiв cmyk

(cyan, magenta, yellow, black). Зазначимо, що колiр cyan (голубий) у си-стемi кольорiв rgb передається сумою зеленого i синього кольорiв — (0,1,1); ко-лiр magenta (пурпуровий) у системi кольорiв rgb передається сумою червоного iсинього кольорiв — (1,0,1); yellow (жовтий) у системi кольорiв rgb передаєтьсясумою червоного i зеленого кольорiв — (1,1,0); black (чорний) у системi кольорiвrgb передається як (0,0,0), тобто вiдсутнiстю основних кольорiв.

Наведемо константи i функцiї, що застосовуються в роботi з кольором у системicmyk:

rgbcolor c = true, якщо c — колiр у системi кольорiв rgb,cmykcolor c = true, якщо c — колiр у системi кольорiв cmyk,cyanpart(c,m,y,k) = c — голуба компонента кольору,magentapart(c,m,y,k) = m — пурпурова компонента кольору,yellowtapart(c,m,y,k) = y — жовта компонента кольору,blackpart(c,m,y,k) = k — чорна компонента кольору,r[c1,c2] = c1 + r(c2 − c1).

Бiлий колiр записується у виглядi (0,0,0,0), чорний — (1,1,1,1), (1,1,1,0). Чорнийколiр дає також (0,0,0,1) i будь-яка iнша комбiнацiя кольорiв, якщо чорна компонентадорiвнює одиницi. Основнi кольори системи rgb, записанi у системi cmyk, такi:(0,1,1,0) — червоний, (1,1,0,0) — синiй, (1,0,1,0) — зелений.

Систему кольорiв cmyk рекомендовано застосовувати у працях, якi готуються додруку з кольоровими iлюстрацiями, оскiльки ця система кольорiв використовуєть-ся у полiграфiї (чотириколiрний друк). У пiдготовцi матерiалiв для застосування велектронному виглядi природно використовувати rgb систему кольорiв, оскiльки вутвореннi зображення на екранi комп’ютера беруть участь три кольори — червоний,зелений i синiй.

Небажано в одному рисунку використовувати рiзнi системи кольорiв.

2.4. Тип pair

Тип pair (пара) використовується для запису координат точок. Наприклад, якщоp=(3,5), то x-координата точки p дорiвнює 3bp, а y-координата точки p дорiвнює3bp. Пари можна додавати, вiднiмати, множити чи дiлити на число, використовувати

18

Page 19: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

в лiнiйних рiвняннях. Якщо p, q — пари, то визначена операцiя r[p,q], результатякої — p+r*(q-p), де r — число. Очевидно, при r=0 ми отримаємо точку p, приr=1 — точку q. Точку, що дiлить навпiл вiдрiзок, кiнцями якого є p i q, отримаємо,поклавши r=0.5.

Iмена z, x, y особливi. Вони стають невизначеними пiсля команди beginfig.За визначенням, z〈suffix〉≡(x〈suffix〉, y〈suffix〉).

Змiнну типу pair можна використовувати для визначення напрямку. Наприклад,одиничний вектор у напрямку осi y (кут 90◦ вiдносно осi x) можна подати у виглядi(0,1)≡dir(90).

Наведемо перелiк констант i функцiй для типу pair (тут z = (x, y)):

origin = (0, 0),up = (0, 1),down = (0,−1),left = (−1, 0),right = (1, 0),xpart z = x,ypart z = y,abs z = |z| =

x2 + y2,angle z = arctg(y/x),unitvector z = z/|z|,round z = (roundx, round y),z1 dotprod z2 = x1y1 + x2y2,dir θ = (cosθ, sinθ),r[z1,z2] = z1 + r(z2 − z1).

2.5. Тип path

Величина типу path використовується для опису шляху, яким METAPOST будуєлiнiю — криву, ламану чи їх комбiнацiю — i складається з послiдовностi величин ти-пу pair, з’єднаних символами, що описують спосiб з’єднання точок (наприклад, --дає з’єднання вiдрiзками прямих, .. — плавною лiнiєю). Якщо остання точка позна-чена внутрiшнiм iм’ям cycle, то в результатi отримаємо замкнену лiнiю. Зазначимо,що шляхи вигляду (0,0)--(10,10)--(10,0)--(0,0) i (0,0)--(10,10)--(10,0)--cycle нееквiвалентнi, хоча побудованi за ними ламанi мають однаковийвигляд. Побудову ламаних i плавних кривих показано у прикладах 1.1 i 1.2. Детальнi-ше побудова лiнiй описуватиметься у роздiлi 3. Команда turningnumber дозволяєвизначити напрямок руху по замкненому шляху пiд час його побудови. Якщо резуль-тат дорiвнює 1, шлях проходиться в напрямку проти годинникової стрiлки, а якщодорiвнює −1, то за годинниковою стрiлкою.

19

Page 20: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

2.6. Тип pen

Величина типу pen використовується для опису форми пера, яким проводитьсялiнiя. Щоб провести лiнiю пером заданої форми, користуємося командою

draw 〈вираз типу path〉 withpen 〈вираз типу pen〉;

Якщо ж ми хочемо, щоб надалi всi лiнiї проводилися заданим пером, слiд напи-сати

pickup 〈вираз типу pen〉;

За замовчуванням, використовується кругле перо дiаметром 0.5bp. Стандартнi пе-ра — кругле (pencircle) i квадратне (pensquare), форму яких можна змiнюватиафiнним перетворенням transform (пiдроздiл 2.9).

Команда makepen створює перо iз замкненого шляху, який має бути опуклимбагатокутником. Якщо ж шлях побудовано з використанням .., METAPOST замi-нить з’єднання точок на -- i розглядатиме шлях як багатокутник. Наприклад, перо,створене з fullcircle, матиме вигляд правильного восьмикутника. Для того, щобпровести лiнiю пером круглої чи елiптичної форми, слiд користуватися стандартнимпером pencircle.

Є й обернена команда makepath, що створює шлях iз пера заданої форми. Ство-ренi пера можна використовувати для маркування точок на графiку. Наведемо при-клад 2.2 формування трикутного пера i кiлька точок, побудованих цим пером, якеможе набувати рiзного розмiру i рiзної орiєнтацiї.

➠ Приклад 2.2.

beginfig(1);

path p;

p:=dir(-30)--dir(90)--dir(-150)--cycle;

pen pentriangle;

pentriangle := makepen(p);

draw (15mm,15mm) withpen pentriangle scaled 5;

draw (5mm,5mm) withpen pentriangle rotated 30

scaled 5 withcolor blue;

draw (25mm,5mm) withpen pentriangle rotated -30

scaled 5 withcolor red;

draw (15mm,25mm) withpen pentriangle xscaled 15

yscaled 5 withcolor green;

currentpicture := currentpicture

shifted(-llcorner currentpicture);

20

Page 21: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

endfig;

end;

Формування пера трикутної форми

2.7. Тип picture

Рисунок, виконаний у METAPOST, можна зберегти у величинi типу picture.Величина currentpicture мiстить результат побудованого на цей час рисунка,наприклад, командою draw. Величина nullpicture — “порожнiй” рисунок. Ко-манда

currentpicture:=nullpicture;

витирає зроблений рисунок. Можна скористатися скороченим варiантом цiєї коман-ди, який записується у виглядi

clearit;

Для змiнної p типу picture можна застосовувати такi операцiї:

center p = центр p,length p = кiлькiсть компонент у p,llcorner p = лiвий нижнiй кут p,lrcorner p = правий нижнiй кут p,ulcorner p = лiвий верхнiй кут p,urcorner p = правий верхнiй кут p.

Якщо межi (bounding box) рисунка p нас не влаштовують, їх можна змiнити так,щоб METAPOST вважав межами p межi змiнної q типу path командою

setbounds p to q;

Шлях q, що визначає межi рисунка p, отримують командою

q := bbox p;

Природно, що до цього змiннi q i p повиннi бути визначенi командами

picture p;

path q;

21

Page 22: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Замiсть того, щоб виконувати окремi частини рисунка, запам’ятовувати параметрcurrentpicture як змiнну типу picture, витирати currentpicture за допо-могою

currentpicture:=nullpicture;

i надалi використовувати цю змiнну багаторазово при побудовi рисунка, можна ско-ристатися командою

image( 〈послiдовнiсть команд 〉 )i присвоїти результат змiннiй типу picture. Проiлюструємо використання image(приклад 2.3).

➠ Приклад 2.3.

beginfig(1);

picture smiley;

smiley := image(draw fullcircle scaled 20mm

withcolor (1,0.75,0) withpen pencircle scaled 2bp;

draw halfcircle scaled 10mm rotated 180

withcolor (1,0.25,0) withpen pencircle scaled 2bp;

filldraw fullcircle scaled 1.5mm shifted (-5mm,5mm)

withcolor (0.5,0.25,0);

filldraw fullcircle scaled 1.5mm shifted (5mm,5mm)

withcolor (0.5,0.25,0); );

draw smiley;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Використання image для побудови рисунка

2.8. Тип string

Величина типу string — це послiдовнiсть символiв, взята в подвiйнi лап-ки, наприклад, "abcdefgh". Нумерацiя символiв починається з нуля. У рядку

22

Page 23: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

"abcdefgh" символ a має номер 0, b — 1 i т. д.Визначено операцiї порiвняння рядкiв =, <>, <, <=, >=, >.Операцiя string s дає true, якщо s — змiнна типу string.Операцiя length s дає кiлькiсть символiв у s.Операцiя substring(m,n) s формує новий рядок, який складається iз части-

ни рядка s, починаючи iз символу номер m до символу номер n включно.Команда ditto формує рядок, що складається з одного символу ", тобто резуль-

тат має вигляд """.Операцiя char n дає рядок довжиною в один символ з ASCII кодом n.Операцiя decimal n, де n — величина типу numeric, дає запис n у виглядi

рядка.Операцiя злиття двох рядкiв s i t в один записується у виглядi s&t.Команда message, аргументом якої є рядок, записує цей рядок у log-файл.Операцiя scantokens s здiйснює аналiз рядка s i дає результат у вигля-

дi списку. Її можна використовувати для вводу значення величини, наприклад,pi:=scantokens("3.14159"). Список, який формує scantokens, можна ви-користати в операторi циклу for ... endfor. У прикладi 2.4 записаний черезкому список чисел аналiзується за допомогою команди scantokens i його елемен-ти присвоюються змiнним a[i] (i набуває значень вiд 1 до 4).

➠ Приклад 2.4.

string line; (scantoks.mp

numeric a[]; >> "1.25, 3.5, 6, 7"

line:="1.25, 3.5, 6, 7"; >> 1

i:=0; >> 1.25

show line; >> 2

for token= scantokens(line): >> 3.5

i:=i+1; >> 3

a[i]:=token; >> 6

show i; >> 4

show a[i]; >> 7 )

endfor;

end;

Лiворуч показано змiст файла scantoks.mp, праворуч — частину файла scantoks.log,

який виникає пiсля виконання командного рядка mp scantoks.mp i показує результати

виконання команди scantokens

Ця функцiя застосовується для вводу даних iз файла при побудовi графiкiв числовихзалежностей, отриманих за допомогою iнших програм чи з експерименту.

23

Page 24: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

2.9. Тип transform

Величина типу transform використовується для змiни форми об’єкта. Напри-клад, це може бути об’єкт типу path, pen, picture.

Наведемо команди застосування стандартних перетворень до змiнних типу pair.Кути вимiрюємо у градусах.

(x, y) rotated θ = (x cos θ− y sin θ, x sin θ+ y cosθ),≡ поворот на кут θ вiдносно (0, 0),

(x, y) slanted a = (x + ay, y) ≡ нахил,(x, y) scaled a = (ax, ay) ≡ збiльшення координат в a разiв,(x, y) xscaled a = (ax, y) ≡ збiльшення x в a разiв,(x, y) yscaled a = (x, ay) ≡ збiльшення y в a разiв,(x, y) shifted (a, b) = (x + a, y + b) ≡ зсув на (a, b),(x, y) zscaled (a, b) = (ax− by, bx+ ay)

≡ аналог множення на комплексне число,(x, y) reflectedabout (p, q) ≡ вiдображення (x, y) вiдносно лiнiї (p, q)

(p,q — змiннi типу pair),(x, y) rotatedaround (p, θ) ≡ поворот (x, y) вiдносно точки p на кут θ.

Перетворення zscaled означає поворот точки (x,y) навколо початку коорди-нат на кут angle (u,v) i множення отриманого вектора на length (u,v).

Перетворення можна комбiнувати, записавши їх послiдовно.Приклад 2.5 показує вiдображення точки p3 вiдносно прямої, що проходить че-

рез точки p1, p2 за допомогою команди reflectedabout. Напрямок перетворен-ня показано пунктирною стрiлкою.

➠ Приклад 2.5.

beginfig(1);

pair p[];

p1:=(10mm,0);

p2:=(0,20mm);

p3:=(0,0);

p4:=p3 reflectedabout (p1,p2);

drawarrow p3--0.95[p3,p4] dashed evenly

withpen pencircle scaled 1bp;

draw p1--p2 withpen pencircle scaled 1bp;

draw p1 withpen pencircle scaled 5bp withcolor blue;

draw p2 withpen pencircle scaled 5bp withcolor blue;

draw p3 withpen pencircle scaled 5bp withcolor green;

draw p4 withpen pencircle scaled 5bp withcolor red;

currentpicture:= currentpicture

24

Page 25: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

shifted (-llcorner currentpicture);

endfig;

end;

Використання перетворення reflectedabout

Можна задати перетворення типу transform, наприклад,

transform t;

i користуватися у подальшому цим перетворенням. Якщо, наприклад, p описано якpicture, команда

p transformed t;

у результатi дасть p, змiнене перетворенням t. Перетворення inverse t дає ре-зультат, обернений перетворенню t. Перетворення identity — тотожне, напри-клад,

p transformed identity;

у результатi дає p. Його зручно використовувати для формування iнших перетворень.Проiлюструємо застосування перетворення i оберненого перетворення для побудовирисункiв на прикладi 2.6.

➠ Приклад 2.6.

transform t, s;

picture p[];

t=identity rotated 30 shifted (5mm,5mm)

scaled 1.414;

s=inverse t;

p1 = image(draw unitsquare scaled 5bp

withpen pencircle scaled 1bp);

p2 = p1 transformed t;

p3 = p2 transformed t;

p4 = p3 transformed t;

p5 = p4 transformed s shifted (10mm,0);

draw p1;

draw p2;

draw p3;

draw p4;

draw p5 withcolor red;

currentpicture:= currentpicture

25

Page 26: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

shifted (-llcorner currentpicture);

endfig;

end;

Використання перетворення identity для запису перетворення. Неправильно:

t=shifted (5mm,5mm). Правильно: t=identity shifted (5mm,5mm)

Будь-яке перетворення задається шiстьма параметрами. Вони визначають перехiдточки (x, y) у точку (x′, y′) згiдно з

x′

y′

1

=

txx txy txtyx tyy ty0 0 1

xy1

.

Значення цих параметрiв для перетворення T у METAPOST можна отримати коман-дами xpart, xxpart, xypart, ypart, yxpart, yypart:

tx = xpart T ty = ypart T

txx= xxpart T tyx = yxpart T

txy = xypart T tyy = yypart T

Для визначення перетворення можна використовувати рiвняння. Оскiльки перет-ворення точки p у точку p′ визначає два параметри перетворення (маємо двi коорди-нати для однiєї точки), можна повнiстю визначити перетворення, задаючи результатйого дiї на три точки трьома лiнiйними рiвняннями. Проiлюструємо формуванняперетворення у такий спосiб (приклад 2.7). Стрiлками показано, яка точка в якупереходить.

➠ Приклад 2.7.

beginfig(1);

transform t;

z1 = (-10mm,0); z2 = (-20mm,15mm);

z3 = (0,10mm); z4 = (0,15mm);

z5 = (10mm,0); z6 = (20mm,-15mm);

draw fullcircle scaled 20mm

withpen pencircle scaled 1bp;

z1 transformed t = z2;

z3 transformed t = z4;

z5 transformed t = z6;

draw fullcircle scaled 20mm transformed t

withpen pencircle scaled 1bp;

drawarrow z1--0.95[z1,z2] withcolor red;

26

Page 27: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

drawarrow z3--0.95[z3,z4] withcolor red;

drawarrow z5--0.95[z5,z6] withcolor red;

draw z1 withpen pencircle scaled 3bp withcolor blue;

draw z3 withpen pencircle scaled 3bp withcolor blue;

draw z5 withpen pencircle scaled 3bp withcolor blue;

draw z2 withpen pencircle scaled 3bp withcolor green;

draw z4 withpen pencircle scaled 3bp withcolor green;

draw z6 withpen pencircle scaled 3bp withcolor green;

currentpicture:= currentpicture

shifted (-llcorner currentpicture);

endfig;

end;

Використання лiнiйних рiвнянь для формування потрiбного перетворення

Визначення перетворення лiнiйними рiвняннями наведено у прикладi 2.8. Звер-таємо увагу на застосування процедури iтерацiй у цьому прикладi.

➠ Приклад 2.8.

beginfig(1);

pair A, B, C; transform T;

u=40mm;

A=(-0.5*u,0); B=(0,0.5*u*sqrt(3));

C=(0.5*u,0);

A transformed T = 0.05[A,B];

B transformed T = 0.05[B,C];

C transformed T = 0.05[C,A];

path p; p = A--B--C--cycle;

for i = 0 upto 70: draw p; p :=p transformed T; endfor;

currentpicture:= currentpicture

shifted (-llcorner currentpicture);

endfig;

end;

Приклад використання лiнiйних рiвнянь для формування потрiбного перетворення

Побудований у прикладi 2.8 рисунок може слугувати iлюстрацiєю до такої задачi.У вершинах правильного трикутника знаходяться черепашки. У деякий момент

часу вони починають рухатися в напрямку до сусiдньої (за годинниковою стрiлкою)черепашки з однаковою швидкiстю. Початкова вiдстань мiж черепашками 20 м. Якийшлях вони пройдуть до зустрiчi?

27

Page 28: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

РОЗДIЛ 3. ПОБУДОВА КРИВИХ I ЛАМАНИХЛIНIЙ

3.1. Загальнi вiдомостi

Щоб побудувати точку з координатами, заданими величиною типу pair, вико-ристовуємо команду draw. При цьому слiд указати перо, яким ця точка будується(iнакше це буде кругле перо дiаметром, установленим за замовчуванням).

Розглянемо тепер команди побудови кривих у METAPOST. Для того, щоб побуду-вати ламану лiнiю, слiд величинi типу path присвоїти вiдповiдний шлях, як описаноу пiдроздiлi 2.5, i побудувати криву командою draw. Для замкненої кривої слiд ви-користовувати замкнений шлях. Щоб побудувати плавну криву, координати точоку виразi для шляху сполучаємо двома крапками, а не двома дефiсами, наприклад,пишемо

path p;

p:=(0,0)..(10,10)..(15,20);

draw p withpen pencircle scaled 1pt;

Плавнi кривi, якi будує METAPOST — це кривi Безьє, котрi описуються полiномомтретього порядку вiд параметра кривої. Нехай крива, що проходить через двi точкиp0 i p1, має вигляд

p(t) = (1− t)3p0 + 3(1 − t)2tc0 + 3(1 − t)t2c1 + t3p1,

де t ∈ [0, 1]. METAPOST автоматично обчислює точки c0, c1, необхiднi для побудовикривої.

Приклад 3.1 iлюструє побудову кривих i ламаних лiнiй. Для побудови трьох то-чок s.1, s.2, s.3, через якi проходить крива чи ламана лiнiя, використовуєтьсяоператор циклу for ... endfor, який ми розглянемо у пiдроздiлi 4.2.

Крiм бiнарних операторiв -- i .. (двi крапки), при описi шляху використовую-ться також оператори --- i ... (три крапки). Вiдмiннiсть останнього вiд .. полягаєу тому, що криву, яку потрiбно побудувати у цьому разi, METAPOST намагатиме-ться провести так, щоб уникнути точок перегину. Якщо ми використовуємо ---,METAPOST намагатиметься побудувати сусiдню криву так, щоб дотичнi по обидва

28

Page 29: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

боки вiд точки, якою закiнчується дiлянка шляху, з’єднаного за допомогою ---, пра-ктично збiгалися при наближеннi до неї. Iншими словами, на кiнцях дiлянки шляхуa--b, який входить у криву, яку ми будуємо, як правило, дiлянка шляху рiзко змiнюєнапрямок, а дiлянка шляху a---b плавно сполучається iз сусiднiми кривими.

➠ Приклад 3.1.

pair s[]; path p;

s1:=(5mm,5mm); s2:=(15mm,5mm); s3:=(25mm,23mm);

beginfig(1);

for i:=1 step 1 until 3:

draw s[i] withpen pencircle scaled 3bp;

endfor;

endfig;

beginfig(2);

p:=s1--s2--s3;

draw p withpen pencircle scaled 1bp;

for i:=1 step 1 until 3:

draw s[i] withpen pencircle scaled 3bp;

endfor;

endfig;

beginfig(3);

p:=s1..s2..s3;

draw p withpen pencircle scaled 1bp;

for i:=1 step 1 until 3:

draw s[i] withpen pencircle scaled 3bp;

endfor;

endfig;

end;

Лiворуч показано змiст файла curves-a.mp, праворуч — три рисунки у форматi eps (з

iменами curves-a.1, curves-a.2, curvescurves-a.3), якi вiн генерує. Для побудови

трьох точок s.1, s.2, s.3, через якi проходить крива, використовується оператор циклу

for ... endfor, смисл якого очевидний

Приклади 3.2 i 3.3 iлюструють застосування --- i ... (три крапки) для побудо-ви лiнiй через однi й тi самi точки. Напрямок, у якому крива проходить ту або iншуточку можна задати, указавши його у фiгурних дужках перед точкою чи пiсля то-чки. Вiн задається значенням кута, наприклад, {dir 30} (вiдлiк кута виконують у

29

Page 30: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

напрямку проти годинникової стрiлки вiд горизонтальної осi) або ключовими слова-ми up (вгору), down (вниз), right (праворуч), left (лiворуч) у фiгурних дужках.Зокрема, при побудовi рис. 3.3 використано ключове слово down.

➠ Приклад 3.2.

pair s[]; path p;

s1:=(5mm,5mm); s2:=(15mm,5mm); s3:=(25mm,23mm);

beginfig(1);

p:=s1--s2..s3;

draw p withpen pencircle scaled 1bp;

for i:=1 step 1 until 3:

draw s[i] withpen pencircle scaled 3bp;

endfor;

endfig;

beginfig(2);

p:=s1---s2..s3;

draw p withpen pencircle scaled 1bp;

for i:=1 step 1 until 3:

draw s[i] withpen pencircle scaled 3bp;

endfor;

endfig;

end;

Застосування --- для побудови лiнiй. Лiворуч показано змiст файла curves-b.mp, право-

руч — два рисунки у форматi eps, якi вiн генерує

Якщо задано двi величини типу path, наприклад, p i q, команда p & q сполу-чає два шляхи в один. При цьому остання точка шляху p має збiгатися з початковоюточкою шляху q, iнакше METAPOST їх сполучить оператором .. i надрукує попере-дження у файлi з розширенням log. Для злиття двох шляхiв в один можна такожвикористовувати операцiї .. , ... , -- i --- , причому в цьому разi координатикiнцiв шляхiв можуть не збiгатися мiж собою.

Цiкаву можливiсть для побудови замкненого шляху надає команда buildcycle.Аргументи її — кiлька шляхiв, результат — замкнений шлях (якщо це можна зроби-ти), який складається iз частин шляхiв-аргументiв (приклад 3.4). Застосування цiєїкоманди до побудови циклу Карно iз двох iзотерм i двох адiабат буде розглянуто впiдроздiлi 6.4, при цьому не треба додатково обчислювати координати точок початкуi закiнчення вiдповiдних iзопроцесiв, досить щоб графiки iзопроцесiв перетиналися.

30

Page 31: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

➠ Приклад 3.3.

pair s[]; path p;

s1:=(5mm,5mm); s2:=(15mm,5mm); s3:=(25mm,23mm);

beginfig(1);

p:=s1..s2..downs3;

draw p withpen pencircle scaled 1bp;

for i:=1 step 1 until 3:

draw s[i] withpen pencircle scaled 3bp;

endfor;

endfig;

beginfig(2);

p:=s1...s2...downs3;

draw p withpen pencircle scaled 1bp;

for i:=1 step 1 until 3:

draw s[i] withpen pencircle scaled 3bp;

endfor;

endfig;

end;

Застосування ... для побудови лiнiй. Лiворуч показано змiст файла curves-c.mp, право-

руч — два рисунки у форматi eps, якi вiн генерує

Межi рисунка можна знайти, застосовуючи bbox до величини типу picture,наприклад, currentpicture. Якщо p — величина типу picture, то результатbbox p еквiвалентний

llcorner p -- lrcorner p -- urcorner p -- ulcorner p -- cycle

Тут llcorner — нижнiй лiвий кут рисунка, lrcorner — нижнiй правий кут ри-сунка, ulcorner — верхнiй лiвий кут рисунка, urcorner — верхнiй правий кутрисунка. Як видно з рисунка до прикладу 3.4, METAPOST до реальних розмiрiв ри-сунка додає невеликий зсув, який установлюється значенням bboxmargin (2bp зазамовчуванням) у чотирьох напрямках (лiворуч, праворуч, вгору, вниз). Це зручно,наприклад, якщо треба вставити текст на темному фонi, тодi можна видiлити мi-сце для тексту бiлим кольором i потiм написати текст. У результатi букви не будутьдотикатися до темного фону.

31

Page 32: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

➠ Приклад 3.4.

beginfig(1);

path p[];

p1:=(0,0)..(5mm,1mm)..(10mm,4mm)..(15mm,15mm);

p2:=(5mm,0)..(0,1mm)..(-5mm,4mm)..(-10mm,15mm);

p3:=(-10mm,5mm)--(20mm,10mm);

p4:=buildcycle(p1,p2,p3) shifted (0,15mm);

for i:=1 step 1 until 4:

draw p[i] withpen pencircle scaled 1bp;

endfor;

p5:=bbox(currentpicture);

draw p5 dashed evenly;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Iлюстрацiя роботи команди buildcycle. Iз чотирьох незамкнених шляхiв команда ро-

бить замкнений шлях, який складається iз частин шляхiв-аргументiв. Для наочностi шлях-

результат пiднято на 15 мм вище, нiж його дає команда buildcycle. Межi рисунка

вказано штриховою лiнiєю, яку отримано застосуванням bbox до величини типу picture,

у цьому разi currentpicture

Iнодi побудову рисункiв спрощує команда flex. Конструкцiя

flex(z[1],z[2],z[3])

означає шлях z[1]...z[2]{z[3]-z[1]}...z[3].У загальному випадку

flex(z[1],z[2],· · ·,z[n-1],z[n])

означає шлях

z[1]...z[2]{z[n]-z[n-1]}...· · ·...z[n-1]{z[n]-z[n-1]}...z[n]

Iншими словами, задаються двi крайнi точки i одна чи кiлька промiжних, у якихдотична до шляху, паралельна до лiнiї, що сполучає крайнi точки.

32

Page 33: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

3.2. Штриховi лiнiї та пунктир

Синтаксис штрихової лiнiї має вигляд

draw 〈path〉 dashed 〈pattern〉

Тут 〈path〉 — величина типу path, 〈pattern〉 — зразок, за яким будується лiнiя.Це може бути evenly, коли штрихи завдовжки 3bp i роздiленi пропусками зав-довжки 3bp. Для побудови пунктиру використовуємо withdots, що дає точки навiдстанi 5bp одна вiд iншої. Зразки можна перетворювати, користуючись командамиshifted i scaled (див. пiдроздiл 2.9).

Можна самому задати закон штрихування командою dashpattern. Зразкиштрихування evenly i withdots задано в METAPOST як

evenly = dashpattern (on 3 off 3); % штрихи на однаковiй

% вiдстанi 3bp

withdots = dashpattern (off 2.5 on 0 off 2.5); % пунктир

% на однаковiй вiдстанi 5bp

Наведемо приклад (3.5) побудови пунктирних лiнiй.

➠ Приклад 3.5.

beginfig(1);

pair s[],p[];

picture dp;

for ii:=1 upto 5: s[ii]:=(0,50mm-5.5*ii*mm);endfor;

for ii:=1 upto 5:

draw s[ii] withpen pencircle scaled 5pt;endfor;

for ii:=1 upto 5: p[ii]:=(20mm,50mm-5.5*ii*mm);endfor;

for ii:=1 upto 5:

draw p[ii] withpen pencircle scaled 5pt;endfor;

draw s1--p1 dashed evenly scaled 0.5pt;

draw s2--p2 dashed evenly scaled 1pt;

draw s3--p3 dashed evenly scaled 1pt shifted (3pt,0);

draw s4--p4 dashed withdots withpen pencircle scaled 1pt;

dp:=dashpattern(on 5bp off 2bp on 2bp off 5bp);

draw s5--p5 dashed dp;

currentpicture:=currentpicture

shifted(-llcorner currentpicture);

endfig; end;

Лiворуч показано змiст файла dashed.mp, праворуч — рисунок, який вiн генерує

33

Page 34: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

3.3. З’єднання лiнiй. Опцiї команди draw

Форма кiнця лiнiї задається параметром linecap, який може набувати значенняrounded (заокруглений на кiнцi радiусом, що дорiвнює половинi товщини лiнiї,за замовчуванням), squared (квадратний, iз виступом за кiнець лiнiї на половинутовщини лiнiї), butt (обрiзаний по кiнцю лiнiї). Наприклад, в останньому разi цедосягається командою

linecap:= butt;

Зазначимо, що пiсля цiєї команди спроба побудувати точку з координатами, що за-даються парою p, за допомогою

draw p;

закiнчується невдачею. У цьому разi можна скористатися командою

drawdot p;

Зазначимо, що такого самого ефекту, як за присвоєння linecap значення butt

(обрiзання по кiнцю лiнiї), можна досягти, користуючись cutdraw замiсть draw.Форма з’єднання двох лiнiй керується параметром linejoin, який може набу-

вати значення rounded (заокруглення у мiсцi з’єднання лiнiй, за замовчуванням),beveled (зрiз у мiсцi з’єднання лiнiй), mitered (у мiсцi з’єднання зовнiшня час-тина лiнiй утворює кут). Якщо в останньому випадку кут дуже гострий, так щовiдношення подовження лiнiї понад точку перетину до її товщини перевищує зна-чення константи miterlimit (за замовчуванням — 10), тодi з’єднання mitered

змiнюється на beveled. Наприклад, для з’єднання mitered слiд записати

linejoin:= mitered;

Якщо у кiлькох командах рисунка використовуються однаковi опцiї (колiр, формапера, товщина лiнiй), їх доцiльно встановити командою drawoptions, синтаксисякої має вигляд

drawoptions (〈опцiї〉);

Щоб вiдновити опцiї, що встановлюються за замовчуванням, пишемо

drawoptions ( );

Проiлюструємо застосування описаних команд (приклад 3.6).

34

Page 35: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

➠ Приклад 3.6.

beginfig(1);

pair s[],p[],q[];

for ii:=1 upto 3: s[ii]:=(0,50mm-12*ii*mm);endfor;

for ii:=1 upto 3: p[ii]:=(10mm,50mm-7mm-12*ii*mm);endfor;

for ii:=1 upto 3: q[ii]:=(20mm,50mm-12*ii*mm);endfor;

drawoptions(withcolor 0.8white withpen pencircle scaled 20pt);

draw s1--p1--q1 withpen pencircle scaled 20pt;

linejoin:=beveled;

linecap:=squared;

draw s2--p2--q2 withpen pencircle scaled 20pt;

linecap:=butt;

linejoin:=mitered;

draw s3--p3--q3 withpen pencircle scaled 20pt;

linecap:=rounded;

drawoptions(withcolor white withpen pencircle scaled 3pt);

for ii:=1 upto 3: draw s[ii]; draw p[ii]; draw q[ii];endfor;

drawoptions(withcolor black withpen pencircle scaled 1.5pt);

for ii:=1 upto 3: draw s[ii]; draw p[ii]; draw q[ii];endfor;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

З’єднання i форми кiнцiв лiнiй, проведених мiж указаними точками

Зазначимо важливiсть команди linecap:=rounded перед побудовою точокs[i], p[i], q[i], (i=1, 2, 3) у прикладi 3.6, через якi проходять лiнiї s[i]--p[i]--q[i]. Якщо цього не зробити, то завдяки встановленiй попередньо формiкiнця лiнiї linecap:=butt точка не буде побудована. По сутi, точка — це грани-чний випадок шляху, а linecap:=butt знiмає заокруглення з його кiнця, знiмаючитим самим i точку.

Проводячи лiнiю мiж точками, треба мати на увазi, що вона виступає за уявнупряму, що з’єднує точки, на половину товщини пера, яким вона будується. Iнодi тре-ба провести лiнiю так, щоб її межа проходила саме по уявнiй прямiй, що з’єднуєточки. Для цього, очевидно, треба провести лiнiю мiж точками, зсунутими на пiв-товщини пера вiд заданих точок. Якщо для цього треба зробити горизонтальний чивертикальний зсув, корисними можуть бути команди

35

Page 36: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

lft, rt, top, bot,

згiдно з якими вiдбувається зсув лiворуч, праворуч, вгору, вниз на половину товщи-ни пера. Перед цим треба вибрати перо, яким будемо користуватися. Приклад 3.7iлюструє застосування вказаних команд.

Зазначимо, що команди lft, rt, top, bot можна також використовувати послi-довно, наприклад, написати

lft top p[1]=p[2];

➠ Приклад 3.7.

1

2 3

45

6 7

89

10 11

12

beginfig(1);

u=1mm; a=60u; b=30u;

pair p[];

p[1]=(0,0); p[2]=(0,b);

p[3]=(a,b); p[4]=(a,0);

pickup pencircle

scaled (5u);

top p1 =p5; p6=bot p2;

top p7 =p3; p8=top p4;

draw p5--p7--p6--p8 withcolor 0.8white;

% точки p9 i p10 вiддаленi вiд p5 i p6 на товщину лiнiї

% (середина мiж ними, lft p5 i lft p6, на пiвтовщини)

0.5[p9,p5]=lft p5; 0.5[p10,p6]=lft p6;

draw p9--p10 withcolor 0.8white;

0.5[p11,p7]=rt p7; 0.5[p12,p8]=rt p8;

draw p11--p12 withcolor 0.8white;

% помiчаємо точки

NN:=12;

for ii = 1 upto NN: fill fullcircle scaled 3bp

shifted p[ii] withcolor white; endfor;

for ii = 1 upto NN: fill fullcircle scaled 1bp

shifted p[ii] withcolor black; endfor;

for ii = 1 upto NN: label.ulft(decimal(ii), p[ii]); endfor;

currentpicture := currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Застосування команд lft, rt, top, bot. Ламана p5–p7–p6–p8 дотикається до то-

чок p1, p2, p3, p4

36

Page 37: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

3.4. Стрiлки

Щоб побудувати стрiлку, користуємося командою drawarrow, яка рисує стрiл-ку в кiнцi шляху. Якщо треба поставити стрiлку на початку шляху, перед шляхомставимо оператор reverse, який змiнює напрям шляху на зворотний.

Довжина стрiлки установлюється величиною ahlength (за замовчуванням4bp), кут при вершинi стрiлки установлюється величиною ahangle (за замовчу-ванням 45◦). Двостороння стрiлка будується командою drawdblarrow. Проiлю-струємо рисування стрiлок описаними командами (приклад 3.8).

➠ Приклад 3.8.

beginfig(1);

drawarrow (0,20mm)--(20mm,20mm);

drawarrow reverse ((0,15mm)--(20mm,15mm))

withpen pencircle scaled 1bp;

ahlength:=7bp;

ahangle:=30;

drawdblarrow (0,10mm)--(20mm,10mm) withpen pencircle scaled 1bp;

drawarrow (0,0)dir 30..down(20mm,0)down..dir 150cycle;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Побудова стрiлок

3.5. Коло, елiпс, суперелiпс, квадрат, прямокутник,паралелограм

У METAPOST визначено: повне коло fullcircle з дiаметром 1 i центром упочатку координат, його верхня частина halfcircle i четверта частина, що ле-жить у першому квадрантi quatercircle. За допомогою перетворень shifted,

37

Page 38: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

xscaled, yscaled i rotated з fullcircle можна нарисувати коло потрiбногодiаметра чи елiпс i помiстити його центр у потрiбну точку.

METAPOST також визначає шлях unitsquare — квадрата зi стороною 1bp iнижньою лiвою точкою, що лежить у початку координат. Очевидно, з одиничногоквадрата можна зробити квадрат, прямокутник чи паралелограм потрiбного розмiруi помiстити його в потрiбному мiсцi рисунка. Для того, щоб геометричну фiгурузафарбувати, замiсть команди draw, яка дає контур фiгури, намальований пером,використовуємо команду fill. Можна вказати товщину пера, яким буде обведеноконтур фiгури. Iлюстрацiя до сказаного — приклад 3.9.

➠ Приклад 3.9.

beginfig(1);

draw fullcircle scaled 5mm shifted(0,57mm);

draw fullcircle xscaled 10mm yscaled 5mm

rotated 30 shifted(10mm,52mm);

draw halfcircle scaled 5mm shifted(20mm,47mm);

draw quartercircle rotated -135 scaled 5mm

shifted(20mm,47mm);

draw unitsquare scaled 5mm shifted(0,35mm);

draw unitsquare xscaled 10mm yscaled 5mm

shifted(10mm,32mm);

draw unitsquare xscaled 10mm yscaled 5mm

slanted 0.5 shifted(-5mm,27mm);

draw unitsquare scaled 5mm rotated 45

xscaled 1.5 shifted(15mm,24mm);

fill unitsquare xscaled 10mm yscaled 5mm

slanted 0.5 shifted(-5mm,18mm)

withpen pencircle scaled 5pt withcolor 0.7white;

fill unitsquare scaled 5mm rotated 45 xscaled 1.5

shifted(15mm,10mm)

withpen pencircle scaled 0 withcolor 0.7white;

currentpicture:= currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Побудова кола, його частин, елiпса, квадрата, прямокутника i паралелограма

Зазначимо, що при обчисленнi границь рисунка METAPOST бере до уваги шлях,який зафарбовується командою fill, не враховуючи товщину лiнiй, якими побу-довано контур геометричної фiгури. Крiм fill, внутрiшню частину геометричноїфiгури можна також зафарбувати командою filldraw.

38

Page 39: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Ще одну геометричну фiгуру, визначену в METAPOST як суперелiпс, iлюструєприклад 3.10. Щоб створити шлях, що називається суперелiпс (потiм його можнанамалювати), пишемо

superellipse (right_point,top_point,left_point,bottom_point,

superness);

Тут right_point — координата правого краю суперелiпса, top_point — верх-нього краю, left_point — лiвого краю, bottom_point — нижнього краю,superness — параметр, що задає деформованiсть елiпса.

➠ Приклад 3.10.

beginfig(1);

z1=(10mm,0);

z2=(0,15mm);

z3=(-10mm,0);

z4=(0mm,-15mm);

draw superellipse(z1,z2,z3,z4,1/sqrt(2)) withpen pencircle

scaled 1bp

dashed evenly;

draw superellipse(z1,z2,z3,z4,1) withpen pencircle scaled 1bp;

draw superellipse(z1,z2,z3,z4,0.5) withpen pencircle

scaled 1bp;

draw superellipse(z1,z2,z3,z4,0.8) withpen pencircle

scaled 1.5bp;

draw superellipse(z1,z2,z3,z4,0.6) withpen pencircle

scaled 0.7bp;

currentpicture:= currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Побудова фiгур за допомогою superellipse. При superness=0.5 отримуємо ромб,

при superness=1 — прямокутник, при superness=2−1/2 — елiпс (показано пункти-

ром). Жирна крива вiдповiдає суперелiпсу iз superness=0.8, тонка — суперелiпсу

з superness=0.6

39

Page 40: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Математично суперелiпс визначається рiвнянням [?]∣

x

a

α

+∣

y

b

α

= 1.

Вiн має крайнi точки з координатами (±a, 0) i (0,±b), а також “кутовi” точки(±σa,±σb), де σ = 2−1/α — показник деформованостi. Дотична, проведена до супе-релiпса в точцi (σa,σb) паралельна до прямої, що сполучає (a, 0) i (b, 0). Очевидно,при α = 1 (σ = 1

2) отримуємо ромб, при α = ∞ (σ = 1) — прямокутник, а при α = 2

(σ = 1√2) — елiпс.

METAPOST не будує iдеально суперелiпс, так само як i не будує iдеально коло,проте практичнi потреби цiлком задовольняються якiстю побудованих METAPOST

фiгур.

3.6. Шлях як функцiя параметра

Шлях можна розглядати як функцiю параметра (x(t), y(t)), де t — параметр шля-ху (“час”). Таким чином, можна сказати, що точка рухається вздовж шляху, почина-ючи з моменту часу t = 0 (перша точка шляху) до моменту часу t = n (остання,n+ 1 точка шляху). Значення n для шляху a знаходимо операцiєю

n:=length a;

Цiлi значення параметра шляху вiдповiдають точкам, якими задано шлях. Задаючиt, можна знайти точку на шляху, що вiдповiдає цьому значенню. Наприклад, точку,що вiдповiдає параметру 1.5 на шляху a (позначимо її p) отримуємо операцiєю

p:=point 1.5 of a;

Зазначимо, що останню точку шляху можна знайти, вказавши або її номер, отрима-ний за допомогою операцiї length, або замiсть номера точки вказавши infinity:

p:=point infinity of a;

Напрямок дотичної до шляху в певнiй точцi можна знайти операцiєю direction,написавши, наприклад,

p:=direction 1.5 of a;

де p — величина типу pair. Напрямок отриманого вектора збiгається з напрям-ком дотичної до шляху. Визначено i обернений до оператора direction операторdirectiontime, що показує, за якого значення параметра шляху t напрямок дошляху a збiгається iз заданим вектором p:

40

Page 41: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

t:=directiontime p of a;

Оператор directionpoint аналогiчний directiontime; вiн дає точку q нашляху a, у якiй напрямок дотичної до шляху збiгається iз заданим вектором p:

q:=directionpoint p of a;

Приклад 3.11 iлюструє застосування операторiв length, point 〈“час”〉 of,direction 〈“час”〉 of, а також directiontime 〈вектор〉 of у рисунках. Споча-тку будуємо шлях p (тип path), потiм знаходимо точку s (тип pair), що вiдповiдаєзначенню параметра шляху (“часу”) 1.5, будуємо цю точку i з неї проводимо стрiл-ку завдовжки 10 мм у напрямку дотичної до шляху у цiй точцi. Потiм знаходимоточку, у якiй напрямок дотичної до шляху збiгається з одиничним вектором u, на-правленим пiд кутом 25◦ до осi абсцис, i проводимо з неї стрiлку завдовжки 15 мму напрямку дотичної. Цифри, що розмiщенi вище кривої (вiд 0 до 6), показують зна-чення параметра шляху (“часу”) у точках, що були використанi для побудови кривої.Числа знизу кривої показують значення “часу”, для якого побудовано точку лiворучi значення “часу”, при якому дотична до кривої складає кут 25◦ iз вiссю абсцис.

➠ Приклад 3.11.

beginfig(1);

path p; pair u, s, v;

p:=(-15mm,22.5mm) for i:=-2 upto 3: ..(5*i*mm, 2.5*(i**2)*mm)

endfor;

u:=dir(25);

defaultfont:="cmr7";

draw p withpen pencircle scaled 1bp;

for i:=0 upto length(p): dotlabel.top(decimal i,point i of p);

endfor;

s:=point 1.5 of p;

draw s withpen pencircle scaled 3bp withcolor blue;

draw s withpen pencircle scaled 2.25bp withcolor white;

label.llft(decimal 1.5,s) withcolor red;

v:=unitvector(direction 1.5 of p) scaled 10mm;

drawarrow s--(v shifted s) withpen pencircle scaled 0.5bp

dashed evenly scaled 0.5 withcolor blue;

t:= directiontime u of p;

s:= (point t of p);

draw s withpen pencircle scaled 3bp;

draw s withpen pencircle scaled 2.25bp withcolor white;

drawarrow s--(u scaled 15mm) shifted s withpen pencircle

scaled 0.5bp withcolor blue;

41

Page 42: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

label.lrt(decimal t,s) withcolor red;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Застосування операторiв length, point 〈“час”〉 of, direction 〈“час”〉 of, а також

directiontime 〈вектор〉 of у рисунках. Вгорi — змiст файла parameter-a.mp, який

генерує рисунок

0

1

23

4

5

6

1.5

3.42383

У наведеному текстi програми прикладу 3.11 зустрiчаються командиdefaultfont, label, decimal для зображення на рисунку тексту. Їх ми розгля-немо у пiдроздiлi 4.1. Зазначимо тут лише, що файл parameter-a.1, отриманий iзparameter-a.mp, не мiстить iнформацiї про шрифти, тому сам рисунок неможли-во побачити при переглядi його програмою gsview (пiсля перейменування його вparameter-a.eps). Щоб отримати файл, який мiстить iнформацiю про шрифти,чинимо так:

• створюємо допомiжний файл METAPOST-eps.tex (iм’я довiльне) такого змi-сту:

\documentclass{article}

\usepackage{graphicx}

\DeclareGraphicsRule{*}{eps}{*}{}

\begin{document}

\thispagestyle{empty}

\includegraphics{parameter-a.1}

\end{document}

• виконуємо команди

latex METAPOST-eps.tex

dvips METAPOST-eps.dvi

• отриманий у результатi файл METAPOST-eps.ps вже мiстить iнформацiю прошрифти i його можна переглянути програмою gsview

• вiдкриваємо METAPOST-eps.ps програмою gsview i в меню file викону-ємо команду PS to EPS

• отриманий файл METAPOST-eps.eps перейменовуємо в parameter-a.eps

42

Page 43: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Iз заданого шляху можна видiлити його частину оператором subpath, який за-писується у виглядi

subpath (t1,t2) of p;

Тут t1, t2 — точки, мiж якими видiляється частина шляху, p — величина типуpair. Цей оператор зручно використовувати для побудови дуги. При цьому слiдмати на увазi, що довжина шляху fullcircle дорiвнює 8, так що одна одиницяпараметра шляху вiдповiдає 45◦. Нульова точка вiдповiдає 0◦, восьма — 360◦. Про-iлюструємо застосування команди subpath для побудови дуг (приклад 3.12).

➠ Приклад 3.12.

beginfig(1);

path p[];

p1:=subpath (1/3,1) of fullcircle;

p2:=subpath (1,7/3) of fullcircle;

p3:=subpath (0,7) of fullcircle;

draw p1 scaled 20mm withpen pencircle scaled 1bp;

draw p2 scaled 25mm withpen pencircle scaled 1bp;

draw p3 scaled 30mm withpen pencircle scaled 1bp;

draw origin withpen pencircle scaled 1bp;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Застосування оператора subpath для побудови дуг 30◦, 60◦, 315◦

Корисною для побудови рисункiв є команда intersectionpoint, яка дозво-ляє знайти точку перетину двох шляхiв. Результат операцiї

p:= a intersectionpoint b;

(де a i b — шляхи) має тип pair. Якщо точок перетину кiлька, METAPOST знайдетiльки одну з них.

Результат операцiї

p:= a intersectiontimes b;

де a i b — шляхи, має тип pair. Абсциса p показує, за якого значення параметрашляху a має мiсце його перетин iз b, а ордината p показує, при якому значеннiпараметра шляху b має мiсце його перетин з a. Якщо шляхи a i b не перетина-ються, p дорiвнює (-1,-1). Приклад 3.13 iлюструє можливостi, якi дає викори-стання intersectionpoint i intersectiontimes. Перший iз цих операторiв

43

Page 44: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

знаходить точку перетину двох кiл, другий — яким значенням параметрiв шляху кiлвiдповiдає знайдена точка перетину. Потiм, використовуючи оператори direction

xpart(s2) of p1 i direction ypart(s2) of p2, знаходимо напрямок до-тичних до кiл у точцi перетину i будуємо цi дотичнi.

➠ Приклад 3.13.

beginfig(1);

path p[]; pair s[];

p1:=fullcircle scaled 20mm;

p2:=(fullcircle scaled 20mm) shifted (0,10mm);

draw p1 withpen pencircle scaled 1bp;

draw p2 withpen pencircle scaled 1bp;

s1:= p1 intersectionpoint p2;

s2:= p1 intersectiontimes p2;

s3:=unitvector(direction xpart(s2) of p1)

scaled 15mm;

s4:=unitvector(direction ypart(s2) of p2)

scaled 15mm;

draw ((-s3)--s3) shifted s1;

draw ((-s4)--s4) shifted s1;

draw s1 withpen pencircle scaled 4bp withcolor red;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Застосування операторiв intersectionpoint, intersectiontimes i direction

〈“час”〉 of для побудови дотичних до кiл у точцi їх перетину

Оператори cutbefore i cutafter дозволяють видiлити частину одного iзшляхiв до чи пiсля перетину з iншим шляхом. Якщо a i b — шляхи, що перети-наються, то

p:=a cutbefore b;

дає в результатi частину шляху a вiд його початку до перетину з b, а

p:=a cutafter b;

дає в результатi частину шляху a вiд точки перетину з b до його кiнця. Приклад 3.14iлюструє застосування операторiв cutafter, cutbefore для видiлення iз двохкiл, що перетинаються, частини до i пiсля перетину. Нагадаємо, що для кола початоквiдлiку параметра шляху починається з напрямку вздовж осi абсцис. Повертаючи

44

Page 45: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

обидва кола на 90◦ i користуючись оператором intersectionpoint, знайдемодругу точку перетину двох кiл (першу знайдено у прикладi 3.13).

➠ Приклад 3.14.

beginfig(1);

path p[]; pair s[];

p1:=fullcircle rotated 90 scaled 20mm;

p2:=(fullcircle rotated 90 scaled 20mm)

shifted (0,10mm);

draw p1 withpen pencircle scaled 0.5bp;

draw p2 withpen pencircle scaled 0.5bp;

s1:= p1 intersectionpoint p2;

p3:=p1 cutbefore p2;

p4:=p2 cutafter p1;

draw p3 withpen pencircle scaled 1.5bp

dashed evenly withcolor blue;

draw p4 withpen pencircle scaled 1.5bp

dashed evenly scaled 1.5 withcolor green;

draw s1 withpen pencircle scaled 5bp withcolor red;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Застосування операторiв cutafter, cutbefore для видiлення частини шляху

Оператор interpath застосовується для iнтерполяцiї мiж шляхами однаковоїдовжини. Якщо шляхи p1 i p2 завдовжки n, то в результатi, наприклад,

p3=interpath(m,p1,p2);

отримаємо новий шлях завдовжки n, точки якого визначаються виразом

m*[point t of p1, point t of p2];

45

Page 46: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

РОЗДIЛ 4. ПРОГРАМУВАННЯ ТЕКСТУI ГРАФIКИ У METAPOST

4.1. Текст у METAPOST

У найпростiшому випадку текст у METAPOST— це послiдовнiсть символiв, оточе-на двома подвiйними лапками, тобто величиною типу string. Цей тип описано упiдроздiлi 2.8. Текст розмiщуємо на рисунку за допомогою команд

label.〈suffix〉(〈рядкова величина〉, 〈координати〉)

i

dotlabel.〈suffix〉(〈рядкова величина〉, 〈координати〉)

Друга команда вiдрiзняється вiд першої тим, що крiм виведення тексту 〈рядковавеличина〉 (змiнна типу string) в околi точки з координатами 〈координати〉 (змiннатипу pair), ще ставиться точка в мiсцi з координатами 〈координати〉. Положеннятексту вiдносно точки з координатою 〈координата〉 задається суфiксом 〈suffix〉. Йогоможливi значення такi: rt (праворуч), urt (праворуч вище точки), top (зверху),ulft (лiворуч вище точки), lft (лiворуч), llft (лiворуч нижче точки), bot (знизу),lrt (праворуч нижче точки). Вiдстань вiд точки до тексту визначається значеннямlabeloffset (типу numeric). Якщо суфiкс вiдсутнiй, текст зображується у точцiiз заданими координатами. METAPOST задає labeloffset значення 3bp.

За замовчуванням, текст друкується шрифтом cmr10. Шрифт за замовчуваннямвизначається змiнною defaultfont типу string. Його можна змiнити. Напри-клад,

defaultfont:="tir";

встановлює шрифт Adobe Times-Roman.Шрифт масштабується з урахуванням значення defaultscale. Якщо розмiр

шрифту невiдомий, його можна обрати, використовуючи оператор fontsize такимчином:

defaultscale:=12pt/fontsize defaultfont;

46

Page 47: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Тут ми встановили розмiр шрифту 12pt. Можна обрати розмiр шрифту, не змi-нюючи defaultfont, для певної операцiї виведення тексту, користуючись коман-дою вибору шрифту infont. Шрифт масштабується командою scaled. Команда

label("text",z1);

еквiвалентна командi

label("text" infont defaultfont scaled defaultscale,z1);

Застосування команди infont для виведення тексту тим чи iншим шрифтомiз його масштабуванням очевидне. Наприклад, щоб вивести текст “text” у точцi z1шрифтом cmr7, збiльшеним удвiчi, треба написати

label("text" infont "cmr7" scaled 2,z1);

Крiм dotlabel i label, є команда thelabel, яка створює величину типуpicture, що мiстить текст, але не виводить його на рисунок. На рисунок результатвиводиться командою draw.

Проiлюструємо застосування описаних вище команд для виведення тексту (при-клад 4.1).

aa

a

a a

a aa a

rtlft

top

botA

➠ Приклад 4.1.

beginfig(1);

pair p[]; picture pic;

p1:=(0,35mm); p2:=(0,5mm);

defaultfont:="tir";

defaultscale:=20pt/fontsize defaultfont;

show labeloffset; labeloffset:=20pt;

label("a",p1);

label.top("a",p1); label.bot("a",p1);

label.ulft("a",p1); label.urt("a",p1);

label.llft("a",p1); label.lrt("a",p1);

label.lft("a",p1); label.rt("a",p1);

dotlabel.rt("rt",p2); dotlabel.lft("lft",p2);

dotlabel.top("top",p2); dotlabel.bot("bot",p2);

pic:=thelabel("A",(10mm,5mm));

draw pic scaled 2 rotated 180;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Виведення тексту на рисунок. Використовується шрифт Adobe Times-Roman

47

Page 48: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Зазначимо, що виконання команди

mp file.mp

(тут file.mp — iм’я файла з програмою, що описує рисунок) не досить, щоб отри-мати eps-файл, який можна проглянути, наприклад, програмою gsview, оскiлькивiн не мiстить iнформацiї про шрифти. Отриманий пiсля виконання вказаної вищекоманди файл треба вставити в допомiжний LATEX-файл, застосувати до результатуйого роботи (dvi-файл) команду dvips, а потiм ps-файл за допомогою gsview

перетворити на eps-файл (див. пiдроздiл 3.6).Складнiший текст, наприклад, математичнi формули, можна вставити першим

аргументом команд label i dotlabel, взявши їх у “дужки” btex i etex. Ця кон-струкцiя по сутi є величиною типу picture, до якої можна застосувати перетво-рення (див. список стандартних перетворень у пiдроздiлi 2.9). Текст усерединi btex. . .etex повинен бути написаний згiдно iз синтаксисом TEX.

Якщо ми хочемо користуватися LATEX, на початку файла з описом рисунка слiднаписати блок команд, що починається командою verbatimtex i закiнчується ко-мандою etex. Зазначимо, що всерединi btex . . .etex не можна писати форму-ли у виглядi $$\frac{eˆx}{1+xˆ{2}}$$. Замiсть цього слiд використовувати$\displaystyle\frac{eˆx}{1+xˆ{2}}$ (без \displaystyle чисельник iзнаменник будуть виглядати маленькими).

Змiст файла latex.mp iз прикладом використання LATEX i вiдповiдний йому ри-сунок показано у прикладi 4.2. Тут \usepackage{euscript} використовуєтьсядля пiдключення пакета euscript з калiграфiчними шрифтами (аналог команди\cal). Для порiвняння написання лiтер i стандартної можливостi LATEX, що її на-дає команда \cal, на рисунку подано два варiанти написання однiєї i тiєї самоїлiтери. Результат виконання btex . . .etex — величина типу picture. Крiм ко-манд label чи dotlabel, її можна нарисувати командою draw. Аналогiчно до\usepackage{euscript} можна пiдключати й iншi пакети LATEX.

➠ Приклад 4.2.

verbatimtex

%&latex

\documentclass{article}

\usepackage{euscript}

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

\begin{document}

etex

beginfig(1);

48

Page 49: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

pair p[]; picture pic;

pic:=btex $\frac{e^x}{1+x^2}$ etex;

p1:=(0,30mm); p2:=(0,10mm); p3:=(0,20mm);

label(btex ${\cal F}(x)=\frac{e^x}{1+x^2}$ etex,p1);

label(btex ${\EuScript F}(x)=\displaystyle\frac{e^x}{1+x^2}$

etex,p2);

label(btex Використання \LaTeX{} у \texttt{METAPOST} etex,p3);

draw pic withcolor red;

draw bbox pic withpen pencircle scaled 1pt withcolor green;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Використання команд LATEX для запису формул i тексту в METAPOST

F(x) = ex

1+x2

F(x) =ex

1 + x2

Використання LATEX у METAPOST

ex

1+x2

Щоб отримати eps-файл, треба виконати низку операцiй, яку зручно оформити увиглядi командного файла. Наприклад, для отримання файла text-b.eps iз файлаtext-b.mp, змiст якого показано у прикладi 4.2, створюємо файл text-b.bat

такого змiсту 3:

mp text-b.mp

latex METAPOST-eps.tex

dvips METAPOST-eps.dvi

Якщо на комп’ютерi встановлено стару версiю MikTEX, цей файл може не спрацю-вати. У цьому разi спробуйте замiнити його на такий:

mptotex text-b.mp > text-b.tex

latex text-b.tex

dvitomp text-b.dvi text-b.mpx

mp text-b.mp

latex METAPOST-eps.tex

dvips METAPOST-eps.dvi

3У найновiшiй версiї MikTEX METAPOST замiсть mp викликається командою mpost.

49

Page 50: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Перед запуском командного файла створюємо допомiжний файлMETAPOST-eps.tex (iм’я не має значення) такого змiсту:

\documentclass{article}

\usepackage{graphicx}

\DeclareGraphicsRule{*}{eps}{*}{}

\begin{document}

\thispagestyle{empty}

\includegraphics{text-b.1}

\end{document}

У результатi роботи команд iз файла text-b.bat буде створено файлMETAPOST-eps.ps, який можна проглянути програмою gsview. Iз цiєї програми,користуючись меню file, пункт PS to EPS, перетворюємо METAPOST-eps.ps

на text-b.eps. Його вже можна вставляти в документ, пiдготовлений за допомо-гою LATEX.

4.2. Умовний оператор i оператор циклу

Умовний оператор у METAPOST має вигляд

if 〈умова〉: 〈оператори-так〉 else: 〈оператори-нi〉 fi

(тут 〈умова〉 — вираз, у результатi обчислення якого отримуємо величину типуboolean). Оператори, якi у результатi дають величину типу boolean, описаноу пiдроздiлi 2.2. Залежно вiд значення 〈умова〉, true (умова виконана) чи false

(умова не виконана), виконуються 〈оператори-так〉 чи 〈оператори-нi〉. Можна не ста-вити ; перед i пiсля fi.

Для створення циклу, який здiйснюється, поки не стане справедливою певна умо-ва, зручно застосовувати конструкцiю, що забезпечує нескiнченне повторення циклу

forever: 〈 оператори 〉 endfor;

Щоб перервати цей цикл, у нього треба вставити оператор виходу з циклу

exitif 〈умова〉;

Таким чином, оператор циклу можна записати у виглядi

forever:

〈оператори〉exitif 〈умова виходу з циклу〉

endfor;

50

Page 51: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Iнодi зручно виходити з циклу, якщо результат значення логiчної величини (типboolean), яка керує циклом, дорiвнює false. У цьому разi оператор циклу маєвигляд

forever: exitunless 〈умова〉〈оператори〉

endfor;

У цьому випадку, на вiдмiну вiд попереднього, 〈умова〉 перевiряється на початкуциклу. Приклад 4.3 iлюструє використання циклiв forever: ... endfor i умов-ного оператора if ... fi.

➠ Приклад 4.3.

beginfig(1);

picture pic[];

N:=4;

forever:

if round(N/2)*2=N: draw (unitsquare shifted(-0.5,-0.5))

scaled 5 shifted (5mm*(N-1),10mm)

else: draw fullcircle scaled 5 shifted (5mm*(N-1),10mm) fi;

exitif N=0;

N:=N-1;

endfor;

N:=4;

forever:

exitunless N<>0;

if round(N/2)*2=N: draw (unitsquare shifted(-0.5,-0.5))

scaled 5 shifted (5mm*(N-1),0)

else: draw fullcircle scaled 5 shifted (5mm*(N-1),0) fi;

N:=N-1;

endfor;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Використання циклiв forever: ... endfor i умовного оператора if ... fi

Крiм умовного оператора, цикл можна створити i оператором циклу, в якомузмiнна циклу (лiчильник) типу numeric змiнюється у певних межах. Вiн має вигляд

51

Page 52: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

for 〈лiчильник〉 = 〈початкове значення〉 step 〈крок〉until 〈кiнцеве значення〉:

〈оператори〉endfor;

Спочатку змiнна 〈лiчильник〉 дорiвнює 〈початкове значення〉. При кожному повто-реннi циклу значення 〈лiчильник〉 змiнюється на 〈крок〉, поки воно не перевищує〈кiнцеве значення〉. Як тiльки значення 〈лiчильник〉 стане бiльшим, нiж 〈кiнцевезначення〉, цикл бiльше не виконується.

У випадку, коли 〈крок〉 дорiвнює одиницi, можна користуватися скороченимиформами запису. Так, замiсть

step 1 until

можна писати

upto

Замiсть

step -1 until

можна писати

downto

Приклад 4.4 iлюструє використання операторiв циклу для побудови графiка функцiїf(x) = cosπx. У текст вставлено коментар до основних етапiв побудови графiка. Якi у LATEX, коментар у METAPOST в текст програми вводиться рядком, що починаєтьсязi знака %.

➠ Приклад 4.4.

verbatimtex

%&latex

\documentclass{article}

\usepackage{euscript}

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

\begin{document}

etex

beginfig(1);

picture pic[]; pair coord[], tic_label;

path P, frame, tic_x, tic_y;

52

Page 53: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

pi:=3.1415926; radian := 180/pi;

% визначення функцiї cos

vardef cos primary x = cosd(x*radian) enddef;

% розмiри осей i позначок

width:=50mm; height:=50mm; tic:=3bp;

% задаємо межi змiни x i y, що вiдповiдають width i height

x_axis_min:=-1.1; x_axis_max:=1.1;

y_axis_min:=-1.1; y_axis_max:=1.1;

% початковi значення позначок на осях, кiлькiсть позначок i їх крок

x_min:=-1; x_stp:=0.5; N_x:=5;

y_min:=-1; y_stp:=0.25; N_y:=9;

% одиниця довжини по x i y

ux:=width/(x_axis_max-x_axis_min);

uy:=height/(y_axis_max-y_axis_min);

N:=201;

% рамка, що оточує графiк

frame:=(x_axis_min*ux,y_axis_min*uy)--

(x_axis_min*ux,y_axis_max*uy)--(x_axis_max*ux,y_axis_max*uy)

--(x_axis_max*ux,y_axis_min*uy)--cycle;

% позначка по x i y

tic_x:=origin--(0,tic); tic_y:=origin--(tic,0);

% побудова пар значень x i y,

% що вiдповiдають графiку y=cos(pi*x)

for i:=1 upto N:

xpart(coord[i])= x_axis_min + (i-1)/(N-1)*

(x_axis_max-x_axis_min);

ypart(coord[i])= cos(pi*xpart(coord[i]));

endfor;

% побудова шляху, що вiдповiдає графiку функцiї

P:=(xpart(coord[1])*ux,ypart(coord[1])*uy)

for j:=2 upto N: .. (xpart(coord[j])*ux,ypart(coord[j])*uy)

endfor;

% зображення кривої

draw P withpen pencircle scaled 1bp;

% зображення рамки

draw frame;

% зображення позначок i вiдповiдних значень x i y

for i:=N_x downto 1: tic_label:=((x_min + x_stp*(i-1))*ux,

y_axis_min*uy);

draw tic_x shifted tic_label;

label.bot(decimal((x_min + x_stp*(i-1))),tic_label);

endfor;

for i:=1 step 1 until N_y: tic_label:=(x_axis_min*ux,

(y_min + y_stp*(i-1))*uy);

53

Page 54: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

draw tic_y shifted tic_label;

label.lft(decimal((y_min + y_stp*(i-1))),tic_label);

endfor;

% пiдписи на осях

label(btex $x$ etex,((0.5*(x_axis_max+x_axis_min)*ux),

(y_axis_min*uy-15bp)));

label(btex $f(x)=\cos\pi{}x$ etex

rotated 90,((x_axis_min*ux-30bp),

0.5*(y_axis_max+y_axis_min)*uy));

currentpicture:=currentpicture

shifted(-llcorner currentpicture);

endfig;

end;

Використання операторiв циклу для побудови графiка функцiї f(x) = cosπx

10.50-0.5-1

-1

-0.75

-0.5

-0.25

0

0.25

0.5

0.75

1

x

f(x

)=

cosπx

Оператор циклу for . . . endfor може також виконуватися не тiльки для значень〈лiчильник〉, що змiнюються на одну i ту саму величину 〈крок〉, а й для спискузначень. Наприклад, можна написати

for i = 1, 3, 23, 137: 〈оператори〉 endfor;

Те саме можна реалiзувати, будуючи список за допомогою scantokens:

for i = scantokens("1, 3, 23, 137"): 〈оператори〉 endfor;

Оператор scantokens перетворює змiнну типу string у список (див. пiдроз-дiл 2.8).

54

Page 55: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

4.3. Операцiї обрiзання та витирання

Процедура обрiзання полягає у тому, щоб iз рисунка (задається величиною типуpicture) залишити частину, що лежить усерединi замкненого шляху (задаєтьсявеличиною типу path), а решту видалити. Застосовується операцiя обрiзання так:

clip 〈величина типу picture〉 to 〈величина типу path〉;

Якщо йдеться про весь рисунок, то 〈величина типу picture〉 є currentpicture.Команду clip, наприклад, зручно застосовувати, щоб заштрихувати певну дiлянкурисунка, як показано у прикладi 4.5.

➠ Приклад 4.5.

A

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

beginfig(1);

path P[]; picture pic;

P1:=fullcircle scaled 20mm;

P2:=fullcircle scaled 20mm shifted (0,10mm);

P3:=buildcycle (P1,P2);

for i:=1 upto 18:

draw ((dir 200 scaled 10mm--dir 20 scaled 10mm)

shifted (0,2bp*(i-2)));

endfor;

undraw fullcircle xscaled 10mm yscaled 17mm

withpen pencircle scaled 3bp;

clip currentpicture to P3;

pic:=thelabel(btex $A$ etex,(0,5mm));

draw P1; draw P2;

unfill bbox pic; draw pic;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig; end;

Застосування clip, unfill, undraw у рисунках

Iнодi частину, що лежить усерединi замкненого шляху, треба витерти з рисунка.По сутi, це те саме, що зафарбувати його кольором фону (background, за замовчу-ванням — бiлий). Це можна зробити також iншим способом, застосувавши командуunfill i unfilldraw:

55

Page 56: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

unfill 〈величина типу path〉;

Так само можна побудувати лiнiю кольору фону командою undraw, використовуючиїї як команду draw.

4.4. Локальнi i глобальнi величини

У METAPOST можна ввести програмний блок вигляду

begingroup 〈оператори〉 endgroup

(його можна використати, щоб оголосити частину змiнних у ньому локальними).Окремим випадком програмного блоку є оточення beginfig(n) ... endfig, деn — номер рисунка, який будується програмою. Кожна величина є глобальною, якщовона не визначена як локальна у програмному блоцi. Винятком є величини виглядуz〈суфiкс〉, x〈суфiкс〉, y〈суфiкс〉, якi завжди локальнi всерединi beginfig(n) ...

endfig. Оголошення змiнних локальними у програмному блоцi має вигляд

save 〈список iмен локальних величин, роздiлених комами〉;

Це оголошення записується на початку блоку. Пiсля закiнчення виконання опера-цiй блоку змiннi, оголошенi локальними, набувають своїх значень, якi вони малидо входу в блок (або стають невизначеними, якщо певних значень вони не мали).Приклад 4.6 iлюструє змiну значень величин a, b, c, z1 у ходi виконання програми.До входу в блок заданi значення a, c, z1. У блоцi величини a, b оголошуютьсялокальними. Невизначена ранiше величина b набуває значення; нового значення на-буває a. Глобальна величина c значення не змiнює. Пiсля виходу з блоку значенняa вiдновлюється, а b стає знову невизначеним. Хоча ми й не оголошували величи-ну z1 локальною всерединi beginfig(1) ... endfig, вона автоматично сталалокальною. Видно, що до виконання операцiї z1=(7,9); z1 не визначена, потiмвона набуває нового значення, а пiсля виходу з beginfig(1) ... endfig зна-чення z1 те саме, що й було на початку виконання програми — (5,8). Якщо командаsave застосовується поза межами блоку, змiннi, якi є її аргументами, втрачають своєзначення.

➠ Приклад 4.6.

a=1; c=4; z1=(5,8);

show a,b,c,z1; >> 1

show "____________"; >> b

begingroup >> 4

56

Page 57: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

save a,b; >> (5,8)

a=2; >> "____________"

b=3; >> 2

show a,b,c; >> 3

endgroup; >> 4

show "____________"; >> "____________"

show a,b,c; >> 1

beginfig(1); >> b

show "____________"; >> 4

show z1; >> "____________"

z1=(7,9); >> (x1,y1)

show z1; >> (7,9) [1]

endfig; >> "____________"

show "____________"; >> (5,8) )

show z1;

end;

Праворуч показано змiну значень величин a, b, c, z1 у ходi виконання програми, написаної

лiворуч (змiст файла з розширенням log)

Внутрiшнi змiннi METAPOST усерединi блоку без змiни глобального значенняможна змiнювати командою interim. Приклад 4.7 iлюструє застосування цiєї ко-манди для тимчасової змiни параметрiв стрiлок. Зазначимо, що одиницю довжи-ни при присвоєннi ahlength нового значення ми не вказали, — за замовчуваннямце bp.

➠ Приклад 4.7.

beginfig(1);

path arrow;

arrow:=(0,0)--(15mm,10mm);

begingroup

interim ahlength := 10;

drawarrow arrow shifted (0,15mm);

endgroup;

drawarrow arrow;

endfig;

end;

Застосування interim для локальної змiни внутрiшньої змiнної ahlength

57

Page 58: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Значення групи — це значення останньої величини, яка стоїть перед endgroup.Наприклад, у результатi виконання

a:=begingroup save a; a=5; a**2 endgroup;

a набуде значення 25. Звернiть увагу на вiдсутнiсть крапки з комою пiсля a**2.Якщо її поставити, METAPOST дiагностує помилку.

4.5. Рiвняння в METAPOST

METAPOST дає можливiсть розв’язування лiнiйних рiвнянь та систем рiвнянь.Запис

a=5;

METAPOST розглядає як лiнiйне рiвняння. У результатi a набуває значення 5. Пiсляцього значення a при бажаннi можна змiнити оператором присвоювання, записавши,наприклад,

a:=7;

У результатi a набуває значення 7. Таке присвоєння не впливає на значення iншихвеличин, якi були до нього знайденi з лiнiйних рiвнянь. Наприклад, у результатiвиконання послiдовностi операцiй

a=5;

a=b;

a:=7;

величина a набуває значення 7, b — значення 5. Можна дiзнатися, який зв’язок мiжвеличинами встановлений METAPOST у певнiй точцi програми. Для цього слугуєоператор showdependencies.

Розв’язання лiнiйних рiвнянь iз виведенням у log-файл зв’язкiв мiж величинами,якi знаходить METAPOST при додаваннi нових рiвнянь, наведемо у прикладi 4.8.

➠ Приклад 4.8.

a+b+c+d=12; c=-b-a+10

a+b+c-d=8; >> "__________"

showdependencies; b=0.25a

show "__________"; c=-1.25a+10

2*a-3*b+c=10; >> "__________"

showdependencies; >> 8

58

Page 59: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

show "__________"; >> 2

a-2*b-c=4; >> 0

show a, b, c, d; >> 2 )

end;

Розв’язування лiнiйних рiвнянь у METAPOST. Лiворуч — змiст файла програми, праворуч —

результат виведення у файл iз розширенням log

Рiвняння можна записувати ланцюжком. Наприклад,

a+b=c+d=5;

Можна комбiнувати рiвняння iз присвоюваннями. Наприклад,

a+b=c:=d+e;

еквiвалентне присвоюванню

c:=d+e;

i рiвнянню

a+b=c;

Якщо в рiвняння входять величини типу pair, кожне з них є парою рiвняньдля координат x i y. Якщо в рiвняння для пар входить множником невiдома вели-чина типу numeric (її тип можна не оголошувати, оскiльки за замовчуванням всiнеоголошенi величини мають тип numeric) i її значення нас не цiкавить, щоб невводити явно нову невiдому величину, можна ввести анонiмну невiдому whatever.Треба мати на увазi, що у кожному з рiвнянь це рiзнi невiдомi. Наприклад, нам тре-ба знайти перетин прямих, що проходять через точки p1, q1 та p2, q2. Позначимоточку перетину буквою s. Фрагмент програми, що знаходить s, може мати вигляд(використання конструкцiї a[p1,q1] див. у пiдроздiлi 2.4):

s=a[p1,q1];

s=b[p2,q2];

У цьому разi METAPOST знаходить непотрiбнi нам величини a, b. Цього самогорезультату можна досягти значно компактнiшим способом:

s=whatever[p1,q1]=whatever[p2,q2];

Ще раз зазначимо, що whatever у наведених рiвняннях мають рiзнi значення.Зазначимо ще одне корисне застосування whatever. Нехай x[1] i x[2] ма-

ють певнi значення. Ми хочемо зробити значення x[2] невизначеним, наприклад,

59

Page 60: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

для застосування його у подальших рiвняннях. Якщо написати numeric x[], не-визначеним стане x[1] i x[2]. Щоб досягти бажаного результату, слiд написатиx[2]:=whatever (обов’язково присвоювання, а не x[2]=whatever).

Для iлюстрацiї можливостей розв’язання рiвнянь побудуємо висоту AD у трику-тнику ABC (приклад 4.9).

➠ Приклад 4.9.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

beginfig(1);

pair A, B, C, D;

A:=(0,10mm); B:=(15mm,30mm); C:=(25mm,0);

draw A--B--C--cycle withpen pencircle scaled 1;

alpha:= angle (B-C)-90;

D = whatever[A,(A+dir (alpha))]=whatever[B,C];

dotlabel.lft(btex$A$etex,A);

dotlabel.top(btex$B$etex,B);

dotlabel.lrt(btex$C$etex,C);

dotlabel.rt(btex$D$etex,D);

draw unitsquare scaled 1mm rotated (alpha+90) shifted D;

draw A--D;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Побудова висоти в трикутнику

A

B

C

D

Iнший, простiший спосiб побудови висоти — скористатися командоюreflectedabout (див. приклад 2.5 з iлюстрацiєю використання цiєї команди) дляпобудови точки E (не показана у прикладi 4.9), яка є дзеркальним вiдображенням Aвiдносно BC . Точка D лежить на серединi вiдрiзка AE.

4.6. Читання даних iз файла i запис у файл

Читання даних iз файла здiйснюється командою

〈змiнна типу string〉:= readfrom 〈iм’я файла〉

60

Page 61: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Iм’я файла — це величина типу string. У результатi зчитується один рядок iз фай-ла, який присвоюється змiннiй типу string, що стоїть у лiвiй частинi. Якщо файлне читається, або досягнуто кiнця файла, результат операцiї — EOF, величина типуstring з ASCII-кодом 0. Пiсля досягнення кiнця файла при виконаннi readfromчитання даних починається iз початку файла. У прикладi 2.4 показано, як за до-помогою scantokens iз рядка iз числовими даними, роздiленими комою, можнаотримати окремо кожне значення.

Якщо числовi данi у файлi роздiленi не комою, а пробiлом, їх уже не можнаотримати з рядка операцiєю scantokens. Можливим виходом у цьому разi є аналiзрядка за допомогою операцiй, якi можна виконувати зi змiнними типу string. Замi-на пробiлу пiсля числа (крiм останнього) на кому дозволяє застосувати scantokensдля отримання числових даних. Iнший можливий вихiд — включити пакет graph,написаний Д. Хоббi [?] для побудови графiкiв. Пакет пiдключається командою

input graph;

Наявна в ньому команда gdata для читання даних iз файла сприймає цi данi, якщовони роздiленi пробiлами (i дає помилку, якщо їх роздiлити комами). Цей спосiбчитання файлiв видається зручнiшим, оскiльки коми завжди можна прибрати текс-товим редактором. Треба мати на увазi, що значення даних не повиннi перевищувати4096 i дробова частина числа вiд цiлої повинна вiддiлятися комою. Попереднє пiд-готування даних, якщо вони не задовольняють цi вимоги, здiйснюють за допомогоюiнших програм — ORIGIN, EXCEL, MATLAB i т. д. Загальна форма застосування gdataдля читання файлiв має вигляд

gdata(〈iм’я файла〉, 〈iм’я величини〉, 〈команди〉)

Нехай, наприклад, 〈iм’я величини〉 — це v. Тодi кожний рядок даних аналiзується iокремi данi присвоюються величинам v1, v2, . . . (змiннi типу string). При читан-нi кожного рядка виконуються 〈команди〉. У процесi виконання цих команд величиниv1, v2, . . . можна проаналiзувати за допомогою scantokens, i, якщо вони є запи-сом чисел у виглядi величин типу string, присвоїти цi числа даним типу numeric.Нехай маємо файл testgdata.dat такого змiсту:

123 46.7 5.2

12.5 3 2.1

У прикладi 4.10 показано, як можна прочитати i записати числовi данi в масиви,якi вiдповiдають колонкам файла testgdata.dat. У результатi роботи програмиформуються iндекснi змiннi A[i], B[i], C[i] зi значенням iндексу, що набуваєзначень i=1, 2, якi вiдповiдають номеру рядка.

61

Page 62: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

➠ Приклад 4.10.

input graph;

N:=0; >> 1

gdata ("testgdata.dat", y, N:=N+1; >> "123"

A[N]:=(scantokens y[1]); >> 123

B[N]:=(scantokens y[2]); >> 46.7

C[N]:=(scantokens y[3]); >> 5.2

show N; >> 2

show y1; >> "12.5"

show A[N];show B[N];show C[N]; >> 12.5

) >> 3

end; >> 2.1 )

Читання даних iз файла за допомогою команди gdata. Данi повиннi бути роздiленi пробi-

лами. Лiворуч — змiст файла програми, праворуч — результат виведення у файл iз розшире-

нням log

Можливий також запис даних у файл за допомогою команди

write 〈величина типу string〉 to 〈iм’я файла〉;

Якщо файл не iснував, METAPOST його створює. При закiнченнi роботи програмиMETAPOST файл закриває. Його можна також закрити командою

write EOF to 〈iм’я файла〉;

4.7. Макроси

Макроси в METAPOST — це форма запису кiлькох команд iз метою їх багато-кратного використання. Макроси можуть мати параметри (подiбно до функцiй чипiдпрограм) або не мати їх. У найпростiшому випадку макрос має вигляд

def 〈iм’я макроса〉 = 〈послiдовнiсть операцiй〉 enddef;

Як тiльки METAPOST зустрiчає 〈iм’я макроса〉, вiн замiняє його на 〈послiдовнiстьоперацiй〉.

Простий макрос iз параметрами має вигляд

def 〈iм’я макроса〉 (〈параметри〉)=〈послiдовнiсть операцiй〉 enddef;

62

Page 63: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

При застосуваннi цього макроса параметри замiняються на аргументи, iз якими мийого викликаємо. Значення макроса — це значення його останньої операцiї. Символ ;перед enddef не обов’язковий.

У прикладi 4.11 показано макрос, який складає два числа.

➠ Приклад 4.11.

def sum (expr a,b,c) =c= a+b; enddef;

u:=sum(3,7,v);

show u; >> 10

show v; >> 10 )

end;

Макрос iз параметрами. Лiворуч — змiст файла програми, праворуч — результат виведення

у файл iз розширенням log

Ключове слово expr означає, що параметрами можуть бути змiннi будь-якоготипу. Як видно, результат операцiї може присвоюватися як макросу, так i одному зпараметрiв. Зазначимо, що при визначеннi макроса у його командах 〈послiдовнiстьоперацiй〉 не можна присвоювати значення параметрам оператором присвоєння :=.Слiд використовувати тiльки рiвняння, у ходi розв’язання яких METAPOST знайдезначення невiдомого параметра. Не обов’язково значення всiх параметрiв знаходятьу тiлi макроса; частину їх можна знайти пiзнiше, але до застосування цих парамет-рiв при побудовi рисунка. У прикладi 4.12 показано саме такий випадок: макрос зазаданою точкою a шукає симетричну їй вiдносно початку координат точку b. Призверненнi до макроса ми можемо не вказувати значення a, а задати його пiзнiше.Для цього записуємо додаткове лiнiйне рiвняння (у нашому випадку A=(1,1)), якеMETAPOST додає до вже вiдомих йому зв’язкiв мiж величинами.

➠ Приклад 4.12.

def mir (expr a,b) = a+b=origin; enddef;

pair A,B;

mir(A,B);

showdependencies; xpart B=-xpart A

A=(1,1); ypart B=-ypart A

show B; >> (-1,-1) )

end;

Макрос iз параметрами. Лiворуч — змiст файла програми, праворуч — результат виводу

у файл iз розширенням log

63

Page 64: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Крiм ключового слова expr, для характеристики типу параметрiв можна ви-користовувати ключовi слова text (текст) i suffix (суфiкс). Текстовий параметрMETAPOST просто читає як набiр команд. Це дозволяє передати ту чи iншу команду втiло макроса. Якщо ми маємо параметри рiзних типiв, кожна сукупнiсть параметрiвзаписується у своїх дужках при означеннi макроса. Виклик макроса також може бу-ти записаний у виглядi послiдовностi параметрiв в одних дужках. Винятком iз цьогоправила є така вимога: пiсля текстового параметра має стояти дужка. Приклад одно-часного використання текстового параметра i параметра-виразу (expr) наведено вприкладi 4.13.

➠ Приклад 4.13.

def oper(expr a)(text b) = b a enddef;

show oper(36,sqrt); >> 6

show oper(-30)(abs); >> 30

show oper(30,sind); >> 0.5

show oper((30,30),angle); >> 45 )

end;

Макрос iз параметрами рiзного типу. Лiворуч — змiст файла програми, праворуч — резуль-

тат виведення у файл iз розширенням log

Параметр типу suffix має переваги перед expr. Зокрема, iз його допомогоюможна змiнити параметр макроса. Це iлюструє приклад 4.14.

➠ Приклад 4.14.

def inc(suffix a) = begingroup a:=a+1; a endgroup enddef;

s:=20;

d:=inc(s);

show d; >> 21

show s; >> 21 )

end;

Макрос iз параметром типу suffix

Якщо замiсть suffix написати expr, METAPOST дiагностує помилку. Зазначи-мо також, що помилково в цьому разi писати, наприклад, inc(20). Аргументомinc повинно бути iм’я змiнної. Ще одна iлюстрацiя використання параметра типуsuffix — приклад 4.15.

64

Page 65: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

➠ Приклад 4.15.

def sqrs(suffix a) = >> 1

for ii=1 upto 5: a[ii]=ii*ii; endfor; >> 4

enddef; >> 9

sqrs(A); >> 16

for ii=1 upto 5: show A[ii]; endfor; >> 25 )

end;

Ще один макрос iз параметром типу suffix

У цьому разi тип параметра дозволяє виконувати операцiї з указаним параме-тром iз рiзними суфiксами. У наведеному прикладi створюється набiр величинA[1], . . . , A[5], якi дорiвнюють квадрату вiдповiдного суфiкса.

Крiм макросiв, якi визначаються командою def, у METAPOST можна визначитимакроси, що визначаються командою vardef. Останнi ближчi до функцiй i пiд-програм, нiж def-макроси. У макросах, визначених командою vardef, на вiдмiнувiд def-макросiв, тiло макроса автоматично стає блоком, тобто воно вставляється вдужки begingroup ... endgroup. Крiм того, у цих макросах дозволено вико-нувати операцiї присвоювання. Зазначимо, що результат макроса визначає останняоперацiя перед enddef, пiсля якої не повинно бути знака ;. Приклад 4.16 iлюструєvardef-макрос.

➠ Приклад 4.16.

vardef perimeter(expr a,b,c) =

(a+b+c)

enddef;

show perimeter(3,4,5); >> 12 )

end;

Розрахунок периметра трикутника з використанням vardef-макроса

Якщо перед enddef поставити крапку з комою (;), METAPOST дiагностує помилку.

Макрос, що визначається командою vardef, може в iменi мати iндекс, якийзаписується у квадратних дужках []. Залежно вiд значення iндексу макрос можедавати рiзнi результати. Щоб передати значення iндексу в тiло макроса, використо-вуються параметри суфiкса #@ i @, де @ — останнiй токен (якщо це число (необо-в’язково однозначне), то воно присвоюється @) у макросi при його виклику, #@ — усiпопереднi токени. Приклад 4.17 пояснює сказане.

65

Page 66: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

➠ Приклад 4.17.

for ii=-12 upto 12: a[ii]=ii*ii;endfor;

b:=10;

vardef a[]b(expr c) = show #@;show @; >> 0

#@+b+c >> 10

enddef; >> 15

show a0b(5); >> 144

show a12b(2); >> 10

>> 156

vardef show_a[] = show #@;show @; >> show_a

show(a@); enddef; >> -10

show_a[-10]; >> 100 )

end;

Iлюстрацiя vardef-макроса, в iм’я якого входить iндекс. Праворуч — змiст log-файла

Перший рядок визначає масив величин з iндексом a[ii], де iндекс змiнюєтьсявiд −12 до 12. Другий рядок задає значення b. Далi означено макрос з iндексомa[]b(expr c). При першому звертаннi до макроса, a0b(5), у його тiлi вини-кає можливiсть доступу до двох величин — a[0] i b. Перша з них дорiвнює 0,друга — 10, згiдно з обчисленнями до початку звертання до макроса. Цi значеннявиводяться в log-файл. Сюди ж виводиться i сума a[0]+b+c. Перше звертання домакроса йде з параметром 5, який присвоюється c. У результатi отримуємо 15 длясуми a[0]+b+c, як це показано у правiй колонцi (змiст log-файла). При другомузвертаннi до макроса a[]b(expr c) значення iндексу дорiвнює 12, а параметра —2. Результати, переданi в log-файл, наведено праворуч. У цьому ж прикладi миозначили ще один макрос — show_a[], який не має параметрiв. Його мета — по-казати, як METAPOST розбиває iм’я макроса на двi частини i як можна використатизначення iндексу, що у цьому разi передається у тiло макроса. При звертаннi до ньо-го з iндексом −10 у log-файл командою show #@ записується частина його iменiдо iндексу. Iндекс iменi макроса записується командою show @. Значення iндексувикористовується, щоб вивести величину a[ii] зi значенням ii, що дорiвнює @

(останнiй рядок log-файла).Обираючи мiж двома типами макросiв, def i vardef, треба мати на увазi таке:

• vardef-макроси автоматично включають тiло макроса в begingroup iendgroup;

• iм’я vardef-макроса може мiстити iндекси;• у vardef-макроса є можливiсть оперувати iз суфiксом i частиною iменi до

суфiкса.

66

Page 67: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

РОЗДIЛ 5. ПОБУДОВА ГРАФIКIВ У METAPOST

ЗА ДОПОМОГОЮ МАКРОСIВ GRAPH

Користуючись стандартними операцiями METAPOST, можна будувати графiкифункцiй (див. приклад 4.4, де значення функцiї cos(x) обчислювалось за допомо-гою METAPOST). Можливiсть читання даних iз файлiв, яку надає METAPOST (див.роздiл 4.6) значно розширює множину функцiональних залежностей, яку можна зо-бразити графiчно. METAPOST має набiр макросiв graph, який включається у про-грамний файл командою

input graph;

i дозволяє значно полегшити цю роботу. Звичайно, за умови спецiальних вимог довигляду графiка, якi не можна задовольнити за допомогою graph, на користувачiлежить турбота зi створення вiдповiдного рисунка, як це було зроблено за побудовизалежностi cosπx у прикладi 4.4.

5.1. Приклад побудови графiка

Пiсля пiдключення файла graph до програми приступаємо до побудови графiка.У першу чергу створюємо опис рисунка, який має вигляд

beginfig(〈номер рисунка〉);〈команди〉endfig;

Пiсля останньої команди endfig; (вона одна, якщо рисунок один) записуємо ко-манду end кiнця файла.

Приклад 5.1 показує застосування graph для побудови графiка функцiї. ФайлBessel0.dat, який мiстить двi колонки — аргумент i функцiю, роздiленi пробi-лом, — не наводимо.

➠ Приклад 5.1.

verbatimtex

%&latex

67

Page 68: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

\documentclass{article}

\begin{document}

etex

input graph;

beginfig(1);

draw begingraph(50mm,30mm);

gdraw "Bessel0.dat";

glabel.bot(btex$x$etex,OUT);

glabel.lft(btex$J_{0}(x)$etex

rotated 90,OUT);

endgraph;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Застосування graph для побудови графiка функцiї Бесселя нульового порядку

0 2 4 6 8 10

−0.5

0

0.5

1

x

J0(x

)

Розглянемо дiю окремих команд, використаних у прикладi 5.1.

begingraph(〈ширина〉, 〈висота〉);

задає розмiри графiка без урахування написiв на осях. Результат її виконання — ве-личина типу picture, тому перед нею стоїть команда draw. Далi у програмi йдекоманда

gdraw 〈величина〉 〈список опцiй〉

Якщо 〈величина〉 типу string, то вона розглядається як iм’я файла, якщо типуpath, то вона розглядається як сукупнiсть абсцис i ординат функцiї, яку треба побу-дувати. Список опцiй може бути вiдсутнiй, як у наведеному прикладi. У загальномувипадку можна вказати перо, яким буде побудовано залежнiсть, колiр та можливiстьвиконання штрихової лiнiї. Крiм того, є можливiсть замiсть кривої чи ламаної, щоз’єднує точки, побудувати самi точки, не сполучаючи їх мiж собою. Для цього тре-ба задати опцiю plot i символ, яким будуються точки. Iншими словами, синтаксис〈список опцiй〉 такий:

withpen 〈вираз типу pen〉 | withcolor 〈вираз типу color〉| dashed 〈вираз типу picture〉 | plot 〈вираз типу picture〉

Наприклад, щоб позначити точки кружечками дiаметром 2bp червоного кольору,слiд написати опцiю у виглядi

plot image(fill fullcircle scaled 2 withcolor red);

68

Page 69: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Зауважимо, що команда gdraw 〈iм’я файла〉 сполучає точки вiдрiзками прямих, тому,якщо точок небагато, графiк виглядатиме неякiсно. Щоб запобiгти цьому, зчитуютьданi з файла командою gdata (див. роздiл 4.6), а потiм будують шлях, використову-ючи для з’єднання точок команду .. (див. роздiл 3).

Далi у програмi, наведенiй у прикладi 5.1, йде команда glabel — позначка.У загальному випадку вона має вигляд

glabel.〈суфiкс〉(〈позначка〉, 〈мiсце〉) 〈список опцiй〉

Параметр 〈мiсце〉 вказує точку, вiдносно якої буде розмiщено позначку, а 〈суфiкс〉 по-казує положення позначки вiдносно цiєї точки. Можливi суфiкси описано в пiдроздiлi4.1; нагадаємо їх без коментарiв: lft, rt, top, bot, ulft, llft, urt, lrt. Самапозначка задається величиною типу string або picture (нагадаємо, що командиbtex ... etex у результатi дають величину типу picture). Параметр 〈мiсце〉може бути величиною типу pair або послiдовнiстю двох чисел (x- i y-координати).У цьому випадку 〈мiсце〉 — координати точки у системi вiдлiку координат графiка.Крiм того, 〈мiсце〉 може бути величиною типу numeric. У цьому разi точка, вiдно-сно якої ставиться позначка, — це точка останнього графiка, виведеного командоюgdraw, що вiдповiдає значенню параметра шляху 〈мiсце〉; вiдповiднiсть параметрашляху значенню координати описано в пiдроздiлi 3.6. Ще одна можливiсть указатиположення точки, вiдносно якої ставиться позначка, задати 〈мiсце〉 як OUT. Останнєi зроблено у прикладi 5.1. У цьому разi METAPOST ставить позначку вiдносно всьогографiка.

Крiм glabel, є команда gdotlabel, яка вiдрiзняється вiд першої тим, що крiмпозначки, вказується i точка, вiдносно якої позначка ставиться. Зазначимо також, щокрiм gdraw, аналога команди draw, є gfill — аналог команди fill. Як i fill,gfill замальовує дiлянку рисунка, заданого замкненим шляхом, але, на вiдмiну вiдfill, за одиницю масштабу тут береться не 1bp, а двi одиницi довжини — уздовжосi абсцис i ординат.

5.2. Дiапазон абсцис i ординат

За замовчуванням система координат обирається таким чином, щоб графiк за-ймав близько 88 % дiапазону значень за осями. Можна систему координат задати вявному виглядi командою setrange, яка у загальному випадку має вигляд

setrange(〈координати〉, 〈координати〉);

(де 〈координати〉 — величина типу pair або послiдовнiсть величин типу numericабо string). Спочатку задаються мiнiмальнi значення координат xmin, ymin, а потiм

69

Page 70: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

максимальнi xmax, ymax. Наприклад, можна так установити систему координат, щомiнiмальнi значення x i y вiдповiдають початку координат, а максимальнi значенняMETAPOST задає сам:

setrange(origin,whatever,whatever);

Замiсть whatever можна було б використати будь-яку невизначену величину,але, щоб не створювати нову, краще використати анонiмну невiдому величинуwhatever, визначену в METAPOST.

Як зазначалося, METAPOST працює iз числами, меншими за 4096. Якщо зустрiча-ється бiльше число, METAPOST записує попередження в log-файл. Водночас роботаMETAPOST може продовжуватися i з бiльшими числами (якщо це стосується промi-жних результатiв, до побудови рисунка), поки вони меншi за 32768. Працюючи iзgraph, ми маємо можливiсть працювати i з великими числами, у тому числi з да-ними, записаними у файлi даних у експоненцiальнiй формi, наприклад, 1e5 замiсть100000. У цьому разi ми користуємося величинами типу string, щоб задати межiкоординат. Наприклад, якщо x i y лежать у межах вiд 0 до 1 · 105, слiд написатикоманду

setrange(origin,"1e5","1e5");

5.3. Логарифмiчна система координат

Користуючись graph, можна задати систему координат — лiнiйну чи логарифмi-чну. Це робиться командою setcoords, яка записується так:

setcoords(〈тип координати〉, 〈тип координати〉);

Тут 〈тип координати〉 має вигляд

log | linear | −log| −linear

Знак мiнус приводить до того, що напрямок координатної осi змiнюється на про-тилежний. Перший аргумент команди setcoords стосується осi абсцис, другий —ординат. Наприклад, логарифмiчний масштаб уздовж осi ординат i лiнiйний уздовжосi абсцис задається командою

setcoords(linear,log);

(яку треба написати пiсля команди begingraph i до команд будь-якого виводу нарисунок (gdraw, glabel тощо)).

У прикладi 5.2 показано виведення позначок на рисунок iз логарифмiчним мас-штабом уздовж осi ординат.

70

Page 71: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

➠ Приклад 5.2.

% 0 1. Перше читання файла

% 2 7.389056099

% 6 403.4287935

% 10 22026.46579

% 12 162754.7914

% 2 7.389056099 Друге читання файла

% 6 403.4287935

% 10 22026.46579

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

input graph;

path p[];

beginfig(1);

draw begingraph(50mm,30mm);

setcoords(linear,log);

setrange(0,1,12,"3e5");

gdraw "MP-log.mp";

gdraw "MP-log.mp" plot image(fill

fullcircle scaled 4 withcolor red);

glabel.bot(btex\large $x$etex,OUT);

glabel.lft(btex\large $e^{x}$etex rotated 90,OUT);

glabel.ulft(btex $1$etex,0);

gdotlabel.top(btex Example etex, 2,"10000");

endgraph;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Виведення позначок на рисунок i читання даних iз файла

1

Example

0 2 4 6 8 10 12

10

100

1000

104

105

x

ex

Зазначимо, що в цьому прикладi застосовується також цiкава можливiстьMETAPOST: читання даних iз файла програми. Якщо рядок починається iз симво-лу %, вiн сприймається METAPOST як коментар й iгнорується ним. Водночас командаgdraw не бачить цього символу, якщо з нього починається рядок. Вона закiнчує

71

Page 72: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

читати файл, коли натрапляє на пустий рядок. Повторне виконання gdraw приво-дить до подальшого читання файла (до пустого рядка чи до кiнця файла) i побудо-ви нового графiка. Це дозволяє, за потреби, сумiстити данi з програмою в одномуфайлi, як це зроблено на рис. 5.2. Оскiльки gdraw читає двi колонки даних iз фай-ла, за другою колонкою можна написати будь-який коментар, який не сприймаєтьсяgdraw. Ми також вставили двi позначки у поле графiка, використовуючи рiзнi мо-жливостi METAPOST — пряме задання координати точки, вiдносно якої ставитьсяпозначка Example i позначка 1 вiдносно точки, заданої параметром шляху. Ми вка-зали параметр шляху 0 (команда glabel.ulft(btex $1$etex,0);), оскiлькивiн вiдповiдає першiй точцi на шляху, отриманiй при другому читаннi файла (див.пiдроздiл 3.6).

5.4. Кiлька координатних осей

Iнодi на одному рисунку треба зобразити двi залежностi, у яких значення ординатзначно вiдрiзняються. Крiм того, у деяких випадках одну з цих залежностей требазобразити в логарифмiчному масштабi. Таку ситуацiю iлюструє приклад 5.3. Тутзображено двi залежностi, заданi шляхами p1 i p2 (змiннi типу path). Ординатоюдругої залежностi є права вiсь координат.

➠ Приклад 5.3.

verbatimtex

%&latex

\documentclass{article}

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

\begin{document}

etex

input graph;

path p[];

p1:=(0,1)--(0.5,4)--(1,6)--(1.5,7)--(2,6);

p2:=(0,9)--(0.5,10.5)--(1,9)--(1.5,6)--(2,1.5);

beginfig(1);

draw begingraph(50mm,30mm);

setcoords(linear,linear);

setrange(0,1,2,8);

autogrid(,itick.lft) withcolor 0.6white;

gdraw p1 withpen pencircle scaled 1;

setcoords(linear,log); setrange(0,1,2,11);

72

Page 73: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

autogrid(itick.bot,itick.rt) withcolor 0.6white;

gdraw p2;

glabel.bot(btex$x$etex,OUT);

glabel.lft(btex\parbox{12mm}{$f_1(x)$\newline

(товста\newline лiнiя)} etex,OUT);

glabel.rt(btex\parbox{10mm}{$f_2(x)$\newline

(тонка\newline лiнiя)}etex,OUT);

endgraph;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Двi осi ординат на одному рисунку

2

4

6

8

0 0.5 1 1.5 21

2

5

10

x

f2(x)(тонкалiнiя)

f1(x)(жирналiнiя)

Позначки на осях у автоматичному режимi встановлюються командоюautogrid, що має вигляд

autogrid(〈команда позначок〉, 〈команда позначок〉) 〈опцiї〉

Тут 〈опцiї〉 задають колiр i товщину позначок на осях, перша 〈команда позначок〉вiдноситься до осi абсцис, друга — ординат. Синтаксис цiєї команди такий:

〈пусто〉 | 〈координатна сiтка або позначка на осi〉.〈суфiкс〉

(де 〈суфiкс〉 може набувати значень: lft, rt, top, bot). Якщо треба накреслитикоординатну сiтку, то 〈координатна сiтка або позначка на осi〉 — це grid, якщож треба вказати напрямок позначок на осях, то 〈координатна сiтка або позначкана осi〉 може набувати значень itick (позначки всередину, як у прикладi 5.3) чиotick (позначки назовнi, як у прикладi 5.2). Якщо один з аргументiв autogrid

(або обидва) опущено, то немає позначок на осях вiдповiдної координати.Повернемося до прикладу 5.3. Команда

autogrid(,itick.lft) withcolor 0.6white;

73

Page 74: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

не зображає позначки i вiдповiднi їм значення абсциси на осi абсцис i зображаєпозначки по осi ординат для побудови графiка f1(x). Пiсля виведення на рисунокграфiка цiєї функцiї командою

setcoords(linear,log);

змiнюємо масштаб ординат на логарифмiчний i командою

setrange(0,1,2,11);

встановлюємо мiнiмальнi й максимальнi значення абсцис i ординат для кожного на-ступного графiка. Команда

autogrid(itick.bot,itick.rt) withcolor 0.6white;

встановлює позначки сiрого кольору, направленi всередину. Команда

gdraw p2;

рисує графiк функцiї f2(x).Команди

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

у преамбулi потрiбнi, щоб можна було робити написи кирилицею.

5.5. Безпосереднє задання позначок на осях

У розглянутих вище прикладах рисункiв, побудованих за допомогою graph, по-ложення позначок на осях i їх форматування задавалося в автоматичному режимi.Якщо це не задовольняє користувача, їх можна виставити вручну. У цьому випадкузамiсть команди autogrid користуємося командою

〈сiтка або позначка〉.〈суфiкс〉(〈формат позначки〉, 〈мiсце〉) 〈опцiї〉

Якщо ми хочемо вивести координатну сiтку, то застосовуємо такi значення 〈сiткаабо позначка〉 — це grid, якщо позначки по осях, то 〈сiтка або позначка〉 — цеitick або otick, залежно вiд того, позначки спрямованi всередину чи назовнi. Якi в розглянутiй вище командi autogrid, суфiкс показує, де розмiщенi позначки iвiдповiднi їм числовi значення. Команда 〈формат позначки〉 має вигляд

format(〈величина типу string〉, 〈величина типу numeric

або string〉

74

Page 75: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Команда format задає вигляд, у якому треба вивести на графiк числове значення〈величина типу numeric або string〉, що вiдповiдає позначцi. Вигляд цього числавизначається рядком форматування 〈величина типу string〉, який починається з %.Пiсля знака % йде цiле число, яке задає точнiсть (за замовчуванням — 3), потiм одназ лiтер, що задає форму запису значення, — e (число iз плаваючою точкою), f (числоiз фiксованою точкою), g (якщо можливо, число iз фiксованою точкою, iнакше —число iз плаваючою точкою). Позначка ставиться у точцi з координатою 〈мiсце〉.Вона може мати значення типу numeric або string (якщо величина перевищуєзначення, якi METAPOST може сприймати як тип numeric).

На графiку функцiї Бесселя нульового порядку (приклад 5.4) показано побудовукоординатної сiтки i позначок у заданих точках.

➠ Приклад 5.4.

−5×10−1

0×103

2.5×10−1

5×10−1

100

0 1 2.5 4 6 8.25 10x

J0(x

)

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

input graph;

beginfig(1);

draw begingraph(50mm,30mm);

setrange(0,whatever,whatever,

whatever,);

gdraw "Bessel0.dat" withpen

pencircle scaled 1bp;

for y=-0.5,0,0.25,0.5,1:

grid.lft(format("%e",y),y) withcolor 0.7white;

endfor;

for x=0,1,2.5,4,6,8.25,10:

otick.bot(format("%f",x),x) withcolor 0.7white;

endfor;

frame.llft;

frame.urt dashed evenly;

glabel.bot(btex$\hspace*{12mm}x$etex,OUT);

glabel.lft(btex$J_{0}(x)$etex rotated 90,OUT);

endgraph;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;;

Побудова координатної сiтки i позначок у заданих точках

75

Page 76: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Програма, яка будує показаний у прикладi 5.4 графiк, зчитує данi з файлаBessel0.dat. На графiку показано також можливостi команди frame, яка маєвигляд

frame.〈суфiкс〉 〈опцiї〉

Тут 〈суфiкс〉 показує, як обрамовувати графiк, 〈опцiї〉 вказує параметри лiнiй: штри-хування, колiр, товщину. Для центрування пiдпису осi абсцис вiдносно осi абсцис, ане всього графiка, ми застосували команду \hspace* з LATEX.

Зазначимо, що команду format можна застосовувати не тiльки для виводу чиселна осях графiкiв, а й для виведення позначок на графiку з допомогою glabel,gdotlabel, label, dotlabel.

Вигляд, у якому команда format друкує числа, визначається зразком, котрий зазамовчуванням має вигляд

init_numbers(btex$-$etex, btex$1$etex,btex$\times{}10$etex,

btex$^{-}$etex,btex$^{2}$etex);

Перший аргумент показує, як друкувати знак “мiнус” перед вiд’ємним числом, дру-гий дає зразок однорозрядної мантиси, третiй — як записати частину числа мiж ман-тисою i показником степеня 10, звичайно ×10, четвертий показує, як записати знакперед вiд’ємним показником степеня, п’ятий — зразок однорозрядного показникастепеня. За бажанням можна змiнити зразок друку чисел. Наприклад, задати iншийрозмiр шрифту. Якщо ми хочемо, щоб значення позначок на осях друкувалися шри-фтом, що вiдповiдає \footnotesize, слiд написати команду

init_numbers(btex\footnotesize$-$etex, btex\footnotesize$1$etex,

btex\footnotesize$\times{}10$etex,

btex\footnotesize$^{-}$etex, btex\footnotesize$^{2}$etex);

5.6. Читання даних iз файла i обробка даних

Читання даних iз файла за допомогою команди gdata, якою можна користува-тися, якщо пiдключено набiр макросiв graph, наведено у пiдроздiлi 4.6. Нагадаємо,що колонки з даними роздiлено пробiлами (не комами). Розглянемо додатковi мо-жливостi, якi дає ця команда при обробцi даних. Нагадаємо синтаксис цiєї команди:

gdata(〈iм’я файла〉, 〈iм’я величини〉, 〈команди〉);

Нехай, наприклад, 〈iм’я величини〉 — це v. Тодi кожен рядок даних аналiзується йокремi данi присвоюються величинам v1, v2, v3, . . . (змiннi типу string). Причитаннi кожного рядка виконуються 〈команди〉.

76

Page 77: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Команда gdata дає можливiсть побудови шляхiв (величин типу path) при чи-таннi файла. Нагадаємо, що команда gdraw, яка читає файл, сприймає тiльки двiколонки. Водночас в одному файлi може бути затабульовано кiлька функцiй. Бажаномати можливiсть отримати з нього iнформацiю i записати у виглядi шляхiв, в якихx-координати — аргумент, y-координати — функцiї. Це можна зробити командоюaugment, яка має вигляд

augment.〈величина типу path〉(〈координати〉)

Тут 〈координати〉 — величина типу pair або комбiнацiя величин типу numeric

та string, 〈величина типу path〉 — шлях, який будуватиметься. Якщо цей шляхне iснував, при першому виконаннi augment виникає шлях нульової довжини зуказаними координатами, а при подальшому виконаннi augment додається новийсегмент шляху. Сегмент приєднується оператором --, так що у результатi його побу-дови командою gdraw отримаємо ламану лiнiю. Якщо необхiдно, можна побудуватиi шлях, у якому сегменти пов’язанi .., що дає плавну криву, але iншими засобами.У бiльшостi практичних випадкiв точки на графiку лежать досить щiльно, i ламанає достатньо якiсним представленням функцiональної залежностi.

У прикладi 5.5 показано побудову кiлькох функцiй Бесселя з одного файла, уякому перша колонка — аргумент, друга — функцiя Бесселя нульового порядку, тре-тя — функцiя Бесселя першого порядку, четверта — функцiя Бесселя другого порядку,п’ята — функцiя Бесселя третього порядку.

0

12

3

0 2 4 6 8 10

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

x

Jn(x

)

➠ Приклад 5.5.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

input graph;

path p[];

beginfig(1);

draw begingraph(50mm,30mm);

setrange(0,whatever,10,1.05);

gdata("besseln.dat",s,

augment.p1(s1,s2);

augment.p2(s1,s3);

augment.p3(s1,s4);augment.p4(s1,s5);)

gdraw p1 withpen pencircle scaled 1;

glabel.rt(btex$0$etex,5);

gdraw p2 withpen pencircle scaled 1 dashed evenly

77

Page 78: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

withcolor blue;

glabel.top(btex$1$etex,18);

gdraw p3 withpen pencircle scaled 0.5 withcolor red;

glabel.top(btex$2$etex,32);

gdraw p4 withpen pencircle scaled 0.5 dashed evenly

withcolor green;

glabel.urt(btex$3$etex,48);

p5:=(0,0)--(10,0);

gdraw p5 withpen pencircle scaled 0.5;

Gmarks:=5;

glabel.bot(btex\hspace*{9mm}$x$etex,OUT);

glabel.lft(btex$J_n(x)$etex rotated 90,OUT);

endgraph;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Побудова графiкiв функцiй Бесселя нульового, першого, другого i третього порядкiв

Константа Gmarks установлює мiнiмальну кiлькiсть позначок на осях дляautogrid. За замовчуванням вона дорiвнює 4. Якщо її не змiнити на 5, як у наве-денiй програмi, то по осi ординат матимемо 4 позначки.

5.7. Арифметика великих чисел

Як зазначалося, числа у METAPOST повиннi бути меншими за 32768. Щоб вийтиз цього обмеження, команди пакета макросiв graph сприймають також числа у ви-глядi величин типу string, якi є записом числа, наприклад, "5e12" — запис числа5·1012. У такому виглядi можуть бути поданi числа вiд 1.61·10−28 до 3.88·1055 . Iнодi,крiм запису числа у такiй формi, iз ним треба робити i певнi арифметичнi операцiї.Таку можливiсть надає набiр макросiв sarith, який визначає операцiї додаванняSadd, вiднiмання Ssub, множення Smul i дiлення Sdiv. Вони працюють як iз чи-слами, так i з величинами типу string, що представляють числа. Набiр макросiвsarith пiдключається командою

input sarith;

Крiм указаних бiнарних операторiв, визначенi також унарнi —

Sabs 〈величина типу string〉

78

Page 79: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

(дає рядок, що представляє абсолютну величину числа, записаного у формistring), i

Scvnum 〈величина типу string〉

(цей оператор у результатi дає число, що вiдповiдає рядку 〈величина типу string〉,якщо це число не викликає переповнення (менше за 32768)).

Для великих чисел, записаних у формi string, визначено операцiї порiвняння,якi в результатi дають логiчнi величини true або false. Так, якщо s1 i s2 —рядки, що репрезентують числа вiдповiдно n1 i n2, то

s1 Sleq s2 дорiвнює true, якщо n1 ≤ n2,

s1 Sneq s2 дорiвнює true, якщо n1 6= n2.

Приклад 5.6 iлюструє застосування вказаних команд. Тут ми присвоїли змiннiйwarningcheck нульове значення, щоб METAPOST щоразу, коли число перевищує4096, не записував попередження в log-файл. У нашому випадку такого значеннянабуває m1.

➠ Приклад 5.6.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

input sarith;

string n[]; numeric m[];

warningcheck:=0;

n1:= "2e20"; n2:= "3e21";

show n1; show n2; >> "2e20"

show n1 Sleq n2; >> "3e21"

show n2 Sneq n2; >> true

n3:= n1 Sadd n2; n4:= n1 Ssub n2; >> false

n5= n3 Sdiv "16"; >> "3200.00014e18"

n6= n5 Smul "-12e-17"; >> "-2800.00012e18"

n7= Sabs(n6); >> "2000.0002e17"

show n3; show n4; show n5; >> "-2399.99998e1"

show n6; show n7; >> "2399.99985e1"

m1:= Scvnum n7; show m1; >> 23999.9993 )

end;

Iлюстрацiя роботи METAPOST iз великими числами з допомогою пакета sarith. Право-

руч — програма, лiворуч — фрагмент log-файла

79

Page 80: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

У METAPOST є можливiсть читати данi з великими числами. Для цього викорис-товується функцiя

Mreadpath(〈iм’я файла〉)

яка записує данi з файла у виглядi шляху. Щоб потiм можна було скористатися коман-дами gdraw або gfill, треба повiдомити про це METAPOST, присвоївши внутрi-шнiй змiннiй Gpaths значення log (у звичайному режимi воно дорiвнює linear).Нехай файл носить iм’я "test.dat", тодi вiдповiдна команда побудови графiкаматиме вигляд

interim Gpaths:=log;

gdraw Mreadpath("test.dat");

Приклад 5.7 iлюструє роботу з файлом, котрий мiстить данi, якi є великими числами.Для наочностi данi записано у файл програми.

2×105

3×105

4×105

5×105

2×1010

2.5×1010

3×1010

3.5×1010

4×1010

➠ Приклад 5.7.

% 2e5 3e10

% 3e5 4e10

% 4e5 4e10

% 5e5 2e10

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

input graph;

input sarith;

beginfig(1);

draw begingraph(50mm,40mm);

interim Gpaths:=log;

gdraw Mreadpath("MP-sarith.mp");

endgraph;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Побудова графiка iз файла даних, який мiстить великi числа

80

Page 81: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

РОЗДIЛ 6. ПРИКЛАДИ РИСУНКIВ,СТВОРЕНИХ ЗА ДОПОМОГОЮ METAPOST

У цьому роздiлi наведено приклади рисункiв, створених за допомогоюMETAPOST. Цi рисунки не обов’язково оптимальнi з погляду програмування. У пер-шу чергу, наводячи їх, ми маємо на метi показати приклади роботи з командамиMETAPOST. Беручи до уваги бажанiсть компактного i зрозумiлого коду програми, минадаємо перевагу прозоростi втiлення iдеї побудови. Крiм того, намагаємося якомогаширше використовувати рiзнi засоби METAPOST.

6.1. Геометрiя

Проiлюструємо застосування METAPOST у геометрiї на прикладах побудови три-кутникiв.

Задача 1. Побудувати трикутник ABC iз сторонами AB = 4 см, BC = 6 см,AC = 5 см. Сторона AC лежить горизонтально, точка B вище точок A i C .

Коментар до програми. Будуємо спочатку сторону AC . Потiм, iз точок A i Cпроводимо дуги у верхнiй частинi рисунка радiусами AB i BC вiдповiдно (звер-нiть увагу, що halfcircle — пiвколо одиничного дiаметра). Там, де вони пере-тинаються (команда intersectiontimes), i буде лежати точка B. Для наочностiми зобразили цi дуги на рис. 6.1 (вони формуються командами subpath iз пiв-кiл P1 i P2).

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

AC:=5cm;

AB:=4cm;

BC:=6cm;

pair A, B, C, time;

path P[];

A:=origin;

C:=(AC,0);

81

Page 82: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

P1:= halfcircle scaled(2*AB);

P2:= halfcircle scaled(2*BC) shifted C;

% "час" перетину пiвкiл P1 i P2

time:= P1 intersectiontimes P2;

% точка перетину пiвкiл P1 i P2

B:= point (xpart time) of P1;

% фрагменти пiвкiл P1 i P2 поблизу перетину

P3:= subpath((xpart(time)-0.25),(xpart(time)+0.25)) of P1;

P4:= subpath((ypart(time)-0.25),(ypart(time)+0.25)) of P2;

beginfig(1);

drawoptions(withpen pencircle scaled 1);

draw P3 dashed evenly withcolor 0.7white;

draw P4 dashed evenly withcolor 0.7white;

% побудова трикутника

draw A--B--C--cycle;

dotlabel.lft(btex$A$etex,A);

dotlabel.top(btex$B$etex,B);

dotlabel.lrt(btex$C$etex,C);

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

A

B

C

Рис. 6.1. Побудова трикутника за трьома сторонами

Задача 2. Побудувати коло, вписане у трикутник ABC . Координати точок A, B,C: (0, 0), (1 см, 3 см), (5 см, 0).

Коментар до програми. При побудовi користуємося тим, що центр вписаногокола лежить на перетинi бiсектрис кутiв трикутника. Задача трохи спрощується тим,

82

Page 83: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

що сторона AC розмiщена горизонтально i кут, який вона утворює з горизонталлювiдомий — 0◦, а також тим, що точка A збiгається з початком координат. Пiсля знахо-дження перетину двох бiсектрис (точка O), опускаємо з неї перпендикуляр на одну зiсторiн (точка G). Довжина його i буде радiусом вписаного кола. Результат виконанняпрограми наведено на рис. 6.2.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

pair A, B, C, O, D, E, F, G;

path P[];

A:=origin;

B:=(1cm,4cm);

C:=(5cm,0);

% кут A

alpha:= angle(B);

% кут C

gamma:= 180-angle(B-C);

% перетин двох бiсектрис

O = whatever[A, dir(0.5*alpha)] =

whatever[C, (dir(180-0.5*gamma) shifted C)];

% перетин бiсектрис зi сторонами

D = whatever[A, O] = whatever[C, B];

E = whatever[B, O] = whatever[C, A];

F = whatever[C, O] = whatever[B, A];

% проекцiя O на AB

G:= (unitvector(B-A) dotprod (O-A))*unitvector(B-A);

% побудова рисунка

beginfig(1);

drawoptions(withpen pencircle scaled 1);

% побудова трикутника

draw A--B--C--cycle;

% побудова вписаного кола

draw fullcircle scaled (2*abs(G-O)) shifted O;

% побудова бiсектриси

drawoptions(withpen pencircle scaled 0.5 dashed evenly);

83

Page 84: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

draw A--D;

draw B--E;

draw C--F;

draw G--O;

dotlabel.lft(btex$A$etex,A);

dotlabel.top(btex$B$etex,B);

dotlabel.lrt(btex$C$etex,C);

dotlabel.lft(btex$G$etex,G);

dotlabel.urt("",O);

label(btex$O$etex,O shifted(3,8));

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

A

B

C

G O

Рис. 6.2. Побудова вписаного у трикутник кола

Задача 3. Побудувати висоту в прямокутному трикутнику ABC . Координати то-чок A, B, C: (0, 0), (4 см, 3 см), (4 см, 0). Промаркувати однаковi кути i прямий кут,який утворює висота з гiпотенузою.

Коментар до програми. Знаходимо проекцiю точки C на гiпотенузу AB (точкуD). Сполучаючи C i D, отримуємо висоту. Щоб позначити кути трикутникiв, пи-шемо макрос mark_angle (зазначимо, що в [?] для цiєї мети пропонується iншиймакрос). Iндекс у макросi показує, скiльки дуг при позначеннi кута проводити. Длямаркування прямого кута використовуємо частину квадрата, збiльшеного i поверну-того вiдповiдним чином. Результат виконання програми наведено на рис. 6.3.

verbatimtex

%&latex

\documentclass{article}

84

Page 85: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

\begin{document}

etex

pair A, B, C, D;

path P[];

A:=origin;

B:=(4cm,3cm);

C:=(4cm,0);

% проекцiя C на AB

D:= (unitvector(B-A) dotprod (C-A))*unitvector(B-A);

vardef mark_angle[](expr a,b,c) =

angle_c:= angle(c-a); angle_b:= angle(b-a);

time_c:=angle_c/45; time_b:=angle_b/45;

for ii =1 upto @:

P[ii]:=subpath (time_c,time_b) of

fullcircle scaled (17+3*ii);

draw P[ii] shifted a;

endfor;

enddef;

beginfig(1);

% маркування прямого кута

draw subpath (1,3) of (unitsquare scaled 8)

rotated angle (C-D) shifted D;

% маркування гострих кутiв

mark_angle1(C,A,D);

mark_angle1(B,D,C);

mark_angle2(A,B,C);

mark_angle2(C,D,B);

% побудова трикутника

draw A--B--C--cycle withpen pencircle scaled 1;

% побудова висоти

draw C--D;

dotlabel.lft(btex$A$etex,A);

dotlabel.top(btex$B$etex,B);

dotlabel.lrt(btex$C$etex,C);

dotlabel.ulft(btex$D$etex,D);

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

85

Page 86: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

A

B

C

D

Рис. 6.3. Побудова висоти в прямокутному трикутнику. Однаковi кути позначено однаковимисимволами

6.2. Графiки функцiй

Описуючи пакет graph, ми навели приклад побудови кiлькох графiкiв на одно-му рисунку (див. приклад 5.5). Побудову кiлькох шляхiв (величини типу path), щовiдповiдають кiльком функцiям, здiйснювали командою augment. Недолiк цiєї ко-манди — побудова змiнної типу path iз сукупностi величин типу pair, з’єднанихоператорами --. У результатi при побудовi графiкiв функцiй командами gdraw абоdraw отримуємо ламанi лiнiї, якi неякiсно вiдображають функцiональну залежнiсть,якщо крок змiни аргументу недостатньо малий. Особливо актуально це при числовихрозрахунках функцiональної залежностi, коли технiчно неможливо провести обчис-лення з малим кроком. У графiчних програмах, наприклад, у ORIGIN, є можливiстьпровести плавну криву через точки, у яких задано значення функцiї. У METAPOST

аналогiчну можливiсть надає оператор .., який забезпечує проведення плавної кри-вої Безьє через заданi точки. У задачi 4 ми покажемо, як побудувати шляхи, у якихвеличини типу pair з’єднанi операторами --. Для побудови графiка використа-ємо можливостi макросiв graph, маючи на увазi, що для бiльшостi користувачiвMETAPOST можливостей, якi надає цей пакет, достатньо.

Задача 4. Прочитати данi з файла, що мiстить значення функцiй sinx i cos xу дiапазонi x вiд 0 до π з кроком 0.1π. Побудувати шляхи, що вiдповiдають цимданим, за допомогою оператора .. i вiдповiднi їм кривi. Отримати також точки,що вiдповiдають даним у файлi. Для зображення кривих i координат використатимакроси graph.

Коментар до програми. Данi з кожного рядка командою scantokens перетво-рюємо з типу string у numeric i присвоюємо змiнним типу pair (XY[1].[]та XY[2].[]) значення абсциси i ординати для функцiй sinx i cos x. Данi у файлiроздiлено пробiлами. Потiм ми з них будуємо шляхи, якi при виведеннi на рисунокдають кривi Безьє. Звернiть увагу на вiдсутнiсть крапки з комою в кiнцi рядка

86

Page 87: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

for ii:=1 upto 2: p[ii]:=XY[ii].[1]

i перед endfor у рядку

for j:=2 upto N: .. XY[ii].[j] endfor;

Шлях p3 введено, щоб зобразити вiсь абсцис. Стосовно iнших деталей програмидив. коментарi в текстi програми та коментарi до прикладу 5.5. Результат виконанняпрограми наведено на рис. 6.4.

Запишемо змiст файла MP-sincos.dat, у якому наведено данi для побудовиграфiкiв функцiй i текст програми:

0. 0. 1.

0.3141592654 0.3090169944 0.9510565163

0.6283185308 0.5877852524 0.8090169943

0.9424777962 0.8090169944 0.5877852522

1.256637062 0.9510565165 0.3090169938

1.570796327 1. 0.

1.884955592 0.9510565163 -0.3090169942

2.199114858 0.8090169941 -0.5877852527

2.513274123 0.5877852522 -0.8090169945

2.827433389 0.3090169936 -0.9510565165

3.141592654 0. -1.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

input graph;

path p[];

pair XY[].[];

beginfig(1);

% задаємо розмiри графiка

draw begingraph(50mm,40mm);

setrange(0,-1.05,3.141592654,1.05);

% N нумерує рядки у файлi "MP-sincos.dat"

N:=0;

% зчитування даних iз файла i запис їх у виглядi масивiв pair

gdata("MP-sincos.dat",s,

A:=scantokens(s1); B:=scantokens(s2); C:=scantokens(s3);

N:=N+1; XY[1].[N]:=(A,B); XY[2].[N]:=(A,C););

% формування двох шляхiв, що описують функцiї sin(x) i cos(x)

87

Page 88: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

for ii:=1 upto 2: p[ii]:=XY[ii].[1]

for j:=2 upto N: .. XY[ii].[j] endfor;

endfor;

% графiк sin(x) i точки, що вiдповiдають даним iз файла

gdraw p1 withpen pencircle scaled 1;

gdraw p1 plot image(fill fullcircle scaled 2);

% графiк cos(x) i точки, що вiдповiдають даним iз файла

gdraw p2 withpen pencircle scaled 1;

gdraw p2 plot image(fill fullcircle scaled 2);

% вiсь абсцис

p3:=(0,0)--(3.141592654,0);

gdraw p3 withpen pencircle scaled 0.5;

% написи на графiку

glabel(btex$\sin{}x$etex,(2.6,0.8));

glabel(btex$\cos{}x$etex,(2.6,-0.6));

glabel.bot(btex\hspace*{9mm}$x$etex,OUT);

glabel.lft(btex$f(x)$etex rotated 90,OUT);

Gmarks:=5;

endgraph;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

sinx

cosx

0 0.5 1 1.5 2 2.5 3

−1

−0.5

0

0.5

1

x

f(x

)

Рис. 6.4. Побудова графiкiв sin x i cos x. Точки з файла даних сполученi кривими Безьє

На рис. 6.4, створеному за допомогою graph, вiдсутнi промiжнi позначки наосях. У наступному прикладi ми побудуємо цi самi графiки, але з додатковими позна-чками. Iз макросiв graph скористаємося лише gdata для читання файла i formatдля форматування позначок.

88

Page 89: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Задача 5. Прочитати данi з файла, що мiстить значення функцiй sinx i cos xу дiапазонi x вiд 0 до π з кроком 0.1π. Побудувати шляхи, що вiдповiдають цимданим, за допомогою оператора .. i вiдповiднi їм кривi. Побудувати також точки,що вiдповiдають даним у файлi (рiзними для рiзних кривих маркерами). Поставитивеликi позначки на осях iз пiдписами значень при x = 0, 1, 2, 3 i y = −1, 0, 1 i ма-лими позначками iз кроком 0.2 вздовж осi абсцис i з кроком 0.1 уздовж осi ординат.Значення позначок на осях надрукувати шрифтом, що вiдповiдає \footnotesize.

Коментар до програми. Данi з файла MP-sincos.dat зчитуємо командоюgdata i присвоюємо змiнним типу pair (XY[1].[] та XY[2].[]) значення аб-сциси i ординати для функцiй sinx (друга колонка) i cos x (третя колонка). Потiмiз них будуємо шляхи, якi при виведеннi на рисунок дають кривi Безьє. У пiдписахосей використовуємо \hphantom, щоб розмiстити їх бiля кiнцiв осей (без цiєї ко-манди пiдписи вийдуть за межi осей). Iншi деталi наведено у коментарях до текступрограми. Результат виконання програми зображено на рис. 6.5.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

input graph;

path p[], frame_xy; pair XY[].[], XY_llft;

picture tic_X_major, tic_Y_major, tic_X_minor, tic_Y_minor,

mark_circle, mark_square;

% значки для маркування точок на графiках

mark_circle:=image(fill fullcircle scaled 3;

fill fullcircle scaled 1.5 withcolor white);

mark_square:=image(fill unitsquare shifted (-0.5,-0.5) scaled 3;

fill unitsquare shifted (-0.5,-0.5) rotated 45

scaled 2 withcolor white;);

% задаємо розмiри графiка

width:=50mm; height:=40mm;

% їм вiдповiдають мiнiмальнi i максимальнi x i y

x_axis_min:=0;

x_axis_max:=3.141592654;

y_axis_min:=-1.05;

y_axis_max:=1.05;

% координати нижнього лiвого кута графiка

x_llft:=5mm;

y_llft:=50mm;

% довжини великих i малих позначок (>0 - всередину, <0 - назовнi)

tic_major:=-4bp; tic_minor:=-2bp;

89

Page 90: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

% мiнiмальнi значення координат перших позначок, крок

% i кiлькiсть позначок

X_major_min:=0; X_major_stp:=1; n_X_major:=4;

Y_major_min:=-1; Y_major_stp:=0.5; n_Y_major:=5;

X_minor_min:=0; X_minor_stp:=0.2; n_X_minor:=15;

Y_minor_min:=-1; Y_minor_stp:=0.1; n_Y_minor:=21;

% макроси перетворення x i y в координати на рисунку

vardef x_plot(expr x)=(x-x_axis_min)*ux+x_llft enddef;

vardef y_plot(expr y)=(y-y_axis_min)*uy+y_llft enddef;

% одиницi довжини для графiка (масштаб)

ux:=width/(x_axis_max-x_axis_min);

uy:=height/(y_axis_max-y_axis_min);

% рамка, у якiй буде побудовано графiк

frame_xy:=((0,0)--(0,height)--(width,height)--(width,0)--cycle)

shifted (x_llft,y_llft);

% зображення великих позначок

tic_X_major:=image(draw origin--(0,tic_major));

tic_Y_major:=image(draw origin--(tic_major,0));

% зображення малих позначок

tic_X_minor:=image(draw origin--(0,tic_minor));

tic_Y_minor:=image(draw origin--(tic_minor,0));

beginfig(1);

% вiсь абсцис

draw (x_plot(x_axis_min),y_plot(0))--

(x_plot(x_axis_max),y_plot(0));

% нумерування рядкiв у файлi "MP-sincos.dat" змiнною N

N:=0;

% зчитування даних iз файла i запис їх у виглядi масивiв pair

gdata("MP-sincos.dat",s,

A:=scantokens(s1); B:=scantokens(s2); C:=scantokens(s3);

N:=N+1; XY[1].[N]:=(x_plot(A),y_plot(B));

XY[2].[N]:=(x_plot(A),y_plot(C)););

% формування двох шляхiв, якi описують функцiї sin(x) i cos(x)

for ii:=1 upto 2: p[ii]:=XY[ii].[1]

for j:=2 upto N: .. XY[ii].[j] endfor;

endfor;

draw p1 withpen pencircle scaled 1;

draw p2 withpen pencircle scaled 1;

for ii:=0 upto N: label(mark_circle, point ii of p1); endfor;

for ii:=0 upto N: label(mark_square, point ii of p2); endfor;

% обрiзаємо все поза межами рамки графiкiв

clip currentpicture to frame_xy;

% рисуємо рамку графiка

90

Page 91: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

draw frame_xy;

% задаємо розмiр \footnotesize

% для друку позначок командою format

init_numbers(btex\footnotesize$-$etex,btex\footnotesize$1$etex,

btex\footnotesize$\times{}10$etex,

btex\footnotesize$^{-}$etex,btex\footnotesize$^{2}$etex);

% розставляємо великi позначки на осях

for ii:= 1 upto n_X_major: xxx:=X_major_min +

X_major_stp*(ii-1);

xx:=x_plot(xxx); yy:=y_plot(y_axis_min);

label.bot(format("%g",xxx),(xx,(yy+0.5*(tic_major-

abs(tic_major)))));

draw tic_X_major shifted (xx,yy);

endfor;

for ii:= 1 upto n_Y_major: xx:=x_plot(x_axis_min);

yyy:=Y_major_min + Y_major_stp*(ii-1); yy:=y_plot(yyy);

label.lft(format("%g",yyy),((xx+0.5*(tic_major-

abs(tic_major))),yy));

draw tic_Y_major shifted (xx,yy);

endfor;

% розставляємо малi позначки на осях

for ii:= 1 upto n_X_minor: xx:=x_plot(X_minor_min +

X_minor_stp*(ii-1));

yy:=y_plot(y_axis_min);

draw tic_X_minor shifted (xx,yy);

endfor;

for ii:= 1 upto n_Y_minor: xx:=x_plot(x_axis_min);

yy:=y_plot(Y_minor_min + Y_minor_stp*(ii-1));

draw tic_Y_minor shifted (xx,yy);

endfor;

% написи на графiку

label(btex$\sin{}x$etex,(x_plot(2.6),y_plot(0.8)));

label(btex$\cos{}x$etex,(x_plot(2.6),y_plot(-0.6)));

% координити нижнього лiвого кута рисунка

(X_current,Y_current) =llcorner currentpicture;

label.bot(btex$x\hphantom{x}$etex,(x_plot(x_axis_max),

Y_current));

label.lft(btex$f(x)\hphantom{f(x)}$etex rotated 90,

(X_current,y_plot(y_axis_max)));

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

91

Page 92: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

0 1 2 3

−1

−0.5

0

0.5

1

sinx

cosx

x

f(x

)

Рис. 6.5. Побудова графiкiв sin x i cosx. Рисунок вiдрiзняється вiд рис. 6.4 позначками на осях, марке-рами точок на кривих, розмiром шрифту, яким надруковано значення позначок, i розмiщенням пiдписiвна координатних осях

Наступна задача показує, як за допомогою METAPOST можна диференцiюватифункцiю. У його основi лежить команда direction, яка задає напрямок дотичноїу вибранiй точцi шляху. Ця можливiсть може бути корисною, якщо числовими роз-рахунками знайдено залежнiсть фiзичної величини вiд параметра, i бажано отриматипохiдну цiєї величини (першу, другу i т. д.) за параметром.

Задача 6. Побудувати графiк функцiї f(x) = e−x2

. Використовуючи його, побу-дувати f ′(x) в окремiй системi координат i порiвняти iз графiком f ′(x) = −2xe−x2

.Для зображення кривих i координат використати макроси graph.

Коментар до програми. Щоб отримати графiчним способом похiдну функцiїf(x), користуємося командою direction, яка дає вектор у напрямку дотичноїдо кривої, а потiм знаходимо кут angle мiж цим вектором i вiссю абсцис. Далiотримуємо тангенс цього кута, який i дорiвнює похiднiй. Щоб побудувати два гра-фiки, перший iз них запам’ятовуємо як величину типу picture, стираємо рисунок,будуємо другий i додаємо перший зi зсувом вiдносно другого. Iншi деталi наведе-но у коментарях усерединi програми. Результат виконання програми зображено нарис. 6.6.

verbatimtex

%&latex

\documentclass{article}

% пiдключаємо кириличнi шрифти

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

\begin{document}

etex

92

Page 93: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

input graph;

path p[]; pair F[].[];

picture A;

% макрос для обчислення експоненти

vardef exp primary x = ((mexp 256)**x) enddef;

beginfig(1);

% задаємо розмiри графiка

draw begingraph(50mm,40mm);

w:=3;

% межi осей координат

setrange(-w,0,w,1.05);

% N - кiлькiсть точок вiд -w до w

N:=21;

% значення функцiї i похiдної

for ii:=1 upto N:

x:=(2*w)/(N-1)*(ii-1)-w; F[1].[ii]:=(x,exp(-(x**2)));

F[2].[ii]:=(x,-2*x*exp(-(x**2)));

endfor;

% формуємо два шляхи, якi описують функцiю f(x) i похiдну f(x),

% а також шлях, що описує похiдну, обчислену за нахилом f(x)

for ii:=1 upto 2: p[ii]:=F[ii].[1]

for j:=2 upto N: .. F[ii].[j] endfor;

endfor;

for ii:=1 upto N: alpha:= angle(direction (ii-1) of p[1]);

F[3].[ii]:=(xpart (point (ii-1) of p[1]),

(sind(alpha)/cosd(alpha)));

endfor;

% формування шляху --- аналiтично обчисленої похiдної

p[3]:=F[3].[1] for j:=2 upto N: .. F[3].[j] endfor;

% графiк f(x) i точки, за якими вiн побудований

gdraw p1 withpen pencircle scaled 1;

gdraw p1 plot image(fill fullcircle scaled 2);

% пiдписи на осях

glabel.bot(btex\hspace*{56mm}$x$etex,OUT);

glabel.lft(btex$\rule[-43mm]{0bp}{1bp}{f(x)}$

etex,OUT);

% маркуємо побудований графiк буквою а

label.top(btex\large\emph{а}etex,(25mm,-15mm));

endgraph;

% зберiгаємо побудований графiк пiд iменем A

A:=currentpicture;

% стираємо все з рисунка

93

Page 94: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

currentpicture:=nullpicture;

% будуємо графiк для похiдної аналогiчно попередньому

draw begingraph(50mm,40mm);

setrange(-w,-1.05,w,1.05);

gdraw p3 withpen pencircle scaled 1;

gdraw p2 plot image(fill fullcircle scaled 2);

% вiсь абсцис

p4:=(-w,0)--(w,0); gdraw(p4);

% пiдписи на осях

glabel.bot(btex\hspace*{59mm}$x$etex,OUT);

% \makebox установлює формально нульову ширину пiдпису

% (див. документацiю LaTeX)

glabel.lft(btex\makebox[0pt]{$\rule[-43mm]{0bp}{1bp}f’(x)$}

etex,OUT);

% маркуємо побудований графiк буквою б

label.top(btex\large\emph{б}etex,(25mm,-15mm));

endgraph;

draw A shifted (-73mm,0);

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

б

−3 −2 −1 0 1 2 3

−1

−0.5

0

0.5

1

x

f ′(x)

а

−3 −2 −1 0 1 2 3

0

0.2

0.4

0.6

0.8

1

x

f(x)

Рис. 6.6. Графiки f(x) = e−x2

(а) i f ′(x) (б). Показанi на рисунку точки вiдповiдають значеннямфункцiї i похiдної, обчисленим аналiтично. Суцiльнi лiнiї у випадку (а) проведено через цi точки.Суцiльнi лiнiї у випадку (б) проведено через точки, отриманi графiчним обчисленням похiдної функцiїf(x) за допомогою команд direction (дає вектор у напрямку дотичної до кривої) i angle (знаходитькут, що вiдповiдає напрямку вектора)

94

Page 95: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

6.3. Механiка

У цьому пiдроздiлi ми проiлюструємо можливостi METAPOST на прикладах ри-сункiв до задач iз механiки. Перша задача стосується кiнематики.

Задача 7. Побудувати траєкторiю руху тiла, кинутого пiд кутом до горизонту.Позначити кут, пiд яким кинули тiло до горизонту, намалювати тiло в однiй iз точокпольоту i показати напрямок швидкостi у цiй точцi. Написати формулу траєкторiїруху тiла. Параметри: максимальна висота пiдйому H i кут α, пiд яким тiло кинулидо горизонту. Позначити також максимальну висоту i дальнiсть польоту тiла.

Коментар до програми. Координати руху тiла, кинутого пiд кутом α до горизонтузi швидкiстю v0, залежать вiд часу за формулами

x = v0t cosα,

y = v0t sinα− 1

2gt2.

Тут ми вибрали нульовi початковi координати тiла. Максимальна висота пiдйомуH = v2

0sin2α/2g досягається при t = v0 sinα/g, максимальна дальнiсть польоту

S = v20sin 2α/g = 4H/ tgα — при t = 2v0 sinα/g. Рiвняння траєкторiї має вигляд

y = x tgα(

1− x

4Htgα

)

.

У програмi побудови траєкторiї ми використовуємо її рiвняння в наведеному вищевиглядi. Iншi деталi розглянуто у коментарях усерединi програми. Результат її вико-нання наведено на рис. 6.7.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

path p, frame_xy; pair XY[];

% задаємо розмiри графiка

width:=65mm; height:=30mm;

% їм вiдповiдають максимальнi x i y (мiнiмальнi дорiвнюють нулю)

y_axis_max:=1.5;

x_axis_max:=y_axis_max*(width/height);

% задаємо одиницi довжини для графiка (масштаб)

ux:=width/x_axis_max;

uy:=height/y_axis_max;

% рамка, у якiй буде побудовано графiк

95

Page 96: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

frame_xy:=(0,0)--(0,height)--(width,height)--(width,0)--cycle;

beginfig(1);

% N -- кiлькiсть точок

N:=20;

% кут, максимальна дальнiсть, крок за x

alpha:=55; S:=(4*cosd(alpha))/sind(alpha); dx:=S/(N-1);

% формуємо масив точок на траєкторiї

for ii:=1 upto N:

x:=dx*(ii-1); xx:=x*(sind(alpha)/cosd(alpha));

XY[ii]:=(x*ux,xx*(1-(xx/4))*uy);

endfor;

% формуємо шлях, що описує траєкторiю

p:=XY[1] for j:=2 upto N: .. XY[j] endfor;

draw p withpen pencircle scaled 1;

clip currentpicture to frame_xy;

% вiсь абсцис iз "гострими" кiнцями стрiлок

linejoin:=mitered;

drawarrow (0,0)--(x_axis_max*ux,0);

% вiсь ординат

drawarrow (0,0)--(0,y_axis_max*uy);

draw (-2bp,uy)--(2bp,uy);

draw (S*ux,-2bp)--(S*ux,2bp);

% написи на графiку

label.lft(btex$y$etex,(0,0.9*height));

label.bot(btex$x$etex,(0.96*width,0));

label.lft(btex$H$etex,(-2bp,uy));

label.bot(btex$S$etex,(S*ux,-2bp));

draw (0,0)--dir alpha scaled 15mm dashed evenly scaled 0.5;

% помiчаємо кут дугою

time_arc:=alpha/45;

draw subpath (0,time_arc) of halfcircle scaled 16mm;

label.urt(btex$\alpha$etex,dir (alpha/2) scaled 8mm);

% тiло на траєкторiї

z1=point 5*N/8 of p;

fill fullcircle scaled 1.5mm shifted z1 withcolor 0.7white;

% напрямок швидкостi

z2=unitvector(direction 5*N/8 of p) scaled 10mm shifted z1;

drawarrow z1--z2;

label.urt(btex$v$etex,0.5[z1,z2]);

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

96

Page 97: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

y

x

H

S

α

v

y = x tg α

(

1 −

x tg α

4H

)

Рис. 6.7. Рух тiла, кинутого пiд кутом до горизонту

Наведемо iлюстрацiї до двох задач iз динамiки.

Задача 8. Тiло ковзає вниз по похилiй площинi. Побудувати сили, якi на ньогодiють.

Коментар до програми. Щоб кiнцi стрiлок i кути при похилiй площинi були беззаокруглень, користуємося командою

linejoin:=mitered;

Далi застосовуємо buildcycle, щоб обмежити область штрихування. Решту ко-ментарiв наведено у програмi. Результат виконання програми зображено на рис. 6.8.

verbatimtex

%&latex

\documentclass{article}

% babel дає можливiсть писати кирилицею

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

\usepackage{amsmath}

\begin{document}

etex

path p[]; pair q[];

% задаємо розмiри похилої площини

width:=50mm;

height:=20mm;

l:=width++height;

% задаємо розмiри тiла

b_width:=10mm; b_height:=5mm;

q1:=origin; q2:=(width,0); q3:=(width,height);

% обчислюємо кут нахилу площини

alpha:= angle(q3);

beginfig(1);

% "гострi" кути при з’єднаннi лiнiй

97

Page 98: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

linejoin:=mitered;

linecap:=butt;

% похила площина

p1:=q1--q2--q3--cycle;

p2:=(q1--q3) shifted (dir(alpha-90) scaled 2mm);

% допомiжний шлях для побудови p4 --- областi штрихування

p3:=0.5[q1,q2]--q1--q3--0.5[q3,q2];

p4:= buildcycle (p3,p2);

% штрихуємо

beta:=alpha+150;

for ii:=0 upto 70: q4:=(ii*3mm,0); q5:=q4 shifted

(dir(beta)*10*height);

draw (q4--q5) withcolor 0.5white; endfor;

clip currentpicture to p4;

draw p1 withpen pencircle scaled 1 withcolor 0.5white;

% тiло

p5:=unitsquare xscaled b_width yscaled b_height rotated alpha

shifted dir(alpha+90) scaled 1 shifted (dir(alpha)

scaled 0.6*l);

% центр тiла

q6:=(0.5*b_width,0.5*b_height)rotated alpha

shifted dir(alpha+90) scaled 1 shifted (dir(alpha)

scaled 0.6*l);

% фарбуємо тiло сiрим кольором

fill p5 withcolor 0.85white;

draw p5 withpen pencircle scaled 1 withcolor 0.5white;

% точка прикладення реакцiї опори

q7:=whatever[point 0 of p5,point 1 of p5]=whatever[q6,q6

shifted (0,10)];

% малюємо сили

mg:=10mm; N:=mg*cosd(alpha); mu=0.4; F:=mu*N;

p6:=((0,0)--(0,-mg)) shifted q6;

drawarrow p6 withpen pencircle scaled 2.0 withcolor white;

drawarrow p6 withpen pencircle scaled 1.5;

fill fullcircle scaled 2.5 shifted q6;

label.rt (btex\small$mg$etex,0.7[point 0 of p6,point 1 of p6]);

p7:=((0,0)--(0,N)) rotated alpha shifted q7;

drawarrow p7 withpen pencircle scaled 2 withcolor white;

drawarrow p7 withpen pencircle scaled 1.5;

label.urt(btex\small$N$etex,0.7[point 0 of p7,point 1 of p7]);

q8:=point 1 of p5;

p8:=((0,0)--(F,0)) rotated alpha shifted q8;

drawarrow p8 withpen pencircle scaled 2 withcolor white;

drawarrow p8 withpen pencircle scaled 1.5;

98

Page 99: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

label.urt(btex\small$F_{\text{тертя}}$etex rotated alpha,

0.2[point 0 of p8,point 1 of p8]);

% кут при основi

time_arc:=alpha/45;

draw subpath (0,time_arc) of halfcircle scaled 25mm;

label.rt(btex$\alpha$etex,dir (alpha/2) scaled 12mm);

endfig;

end;

mg

NFте

ртя

α

Рис. 6.8. Тiло, що ковзає вниз по похилiй площинi

Задача 9. Зобразити iлюстрацiю до задачi про рух тiл, пов’язаних ниткою, пере-кинутою через нерухомий блок.

Коментар до програми. Скористуємося linecap:=butt, щоб прибрати зао-круглення на кiнцях пiдвiсу, котрий сполучає основу, до якої пiдвiшено блок, i вiсьблоку. Щоб знайти точку на серединi зовнiшнього боку тягарцiв, використовуємоспочатку команду subpath, щоб видiлити цю зовнiшню сторону, а потiм командоюpoint знаходимо середину. Лiворуч i праворуч середин зовнiшнiх бокiв тягарцiвзапишемо m1 i m2. Iншi коментарi наведено у програмi.

Результат виконання програми зображено на рис. 6.9.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

path p[]; pair q[];

% задаємо розмiр основи, радiус блока i вiдстань до осi

width:=50mm; h:=15mm; r:=6mm;

% задаємо радiуси i висоту тягарцiв

R1:=3mm;

H1:= 10mm;

R2:=2mm;

H2:= 12mm;

99

Page 100: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

% задаємо довжини ниток

l1:=40mm; l2:=50mm;

beginfig(1);

% штрихування

for ii:=-20 upto 20: q1:=(ii*1.5mm,0); q2:=q1

shifted (dir(60)*5mm);

draw (q1--q2) withcolor 0.5white; endfor;

% обмеження областi штрихування

p1:=unitsquare xscaled width yscaled 3mm

shifted (-0.5*width,0);

clip currentpicture to p1;

% основа

p2:=(-0.5*width,0)--(0.5*width,0);

draw p2 withpen pencircle scaled 1;

% блок

q3:=(0,-h);

p3:=fullcircle scaled (2*r) shifted q3;

p4:=fullcircle scaled (1.4*r) shifted q3;

draw p3 withpen pencircle scaled 1.5;

draw p4 withpen pencircle scaled 6 withcolor 0.6white;

% нитки

q4:=q3 shifted(-r,0); q5:=q3 shifted(r,0);

q6:=q4 shifted(0,-l1); q7:=q5 shifted(0,-l2);

draw q4--q6 withpen pencircle scaled 1;

draw q5--q7 withpen pencircle scaled 1;

% втулка блока i пiдвiс

linecap:=butt;

draw origin--q3 withpen pencircle scaled 3;

fill fullcircle scaled 7 shifted q3;

% тягарцi

p5:=unitsquare xscaled (2*R1) yscaled H1 shifted (-R1,0)

rotated 180;

p6:=unitsquare xscaled (2*R2) yscaled H2 shifted (-R2,0)

rotated 180;

p5:=p5 shifted q6;

p6:=p6 shifted q7;

filldraw p5 withcolor 0.5white;

filldraw p6 withcolor 0.5white;

label.lft(btex$m_1$etex,point 0.5 of subpath (1,2) of p5);

label.rt(btex$m_2$etex,point 0.5 of subpath (3,4) of p6);

endfig;

end;

100

Page 101: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

m1

m2

Рис. 6.9. Рух тiл, пов’язаних ниткою, перекинутою через нерухомий блок

Задача 10. Зобразити iлюстрацiю до задачi про визначення реакцiї пiдшипникiвна вал iз насадженим на нього шкiвом.

Коментар до програми. У цьому рисунку використаємо колiр зi змiнною iнтен-сивнiстю, що дає вiдчуття об’ємностi рисунка. Щоб досягти такого ефекту, наклада-ємо один шар сiрого кольору певної насиченостi на iнший, змiнюючи площу цьогошару. Значення реакцiй обчислюємо за заданими масами вала i шкiва, використову-ючи рiвняння механiки i можливостi METAPOST. Для рисування пiдшипникiв, вала iшкiва створюємо макроси. Результат виконання програми зображено на рис. 6.10.

verbatimtex

%&latex

\documentclass{article}

% наступний пакет пiдключає ейлерiв шрифт

\usepackage{euscript}

\begin{document}

\newcommand{\fnt}{\normalsize}

etex

pair p[],bearing_s,shafting_s,sheave_s;

color bearing_c,shafting_c,sheave_c;

101

Page 102: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

% одиницi вимiрювання

u:=1mm;

% ширина

width:=53u;

% параметри пiдшипникiв

bearing_stp:=0.5u;

bearing_w:=2.5u;

bearing_h:=8u;

bearing_r:=2.0u;

bearing_l:=1bp;

bearing_c:=0.8*white;

bearing_s:=origin;

% параметри вала

shafting_r:=1.5mm;

shafting_w:=width;

shafting_c:=0.95*white;

shafting_s:=origin;

shafting_l:=1bp;

% параметри шкiва

sheave_r:=15u;

sheave_w:=5u;

sheave_c:=0.95*white;

sheave_s:=((0.6width-0.5sheave_w),0u);

sheave_l:=0.5bp;

tic:=5u;

arr_shift:=0.5bp;

% вага вала i шкiва, їх довжини при графiчному зображеннi

m_shaft:=10*u;

m_sheave:=20*u;

arr_F:=2bp;

arr_white_F:=3bp;

r_axis=3bp;

% пiдшипник: два прямокутники на вiдстанi 2*bearing_r

% завширшки width bearing_w, заввишки height bearing_h,

% зафарбованi кольором bearing_c, штрихування iз кроком

% bearing_stp

% ширина межi bearing_l.

% параметр bearing_s задає положення лiвої межi пiдшипника

vardef BEARING(expr bearing_stp, bearing_w, bearing_h, bearing_r,

bearing_l, bearing_c,bearing_s) = save N; save BEAR;

path P[]; pair c;

picture BEAR;

102

Page 103: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

N:=round(bearing_h/bearing_stp);

BEAR:=image(fill unitsquare xscaled bearing_w yscaled bearing_h

withcolor bearing_c;

for ii:=1 upto N: draw (0,bearing_stp*(ii))--

(bearing_w,bearing_stp*(ii)); endfor;

draw unitsquare xscaled bearing_w yscaled bearing_h withpen

pencircle scaled bearing_l);

draw BEAR shifted (0,bearing_r) shifted (bearing_s);

BEAR:= ((BEAR shifted (0,bearing_r)) reflectedabout

(origin,(1bp,0))) shifted bearing_s;

draw BEAR;

enddef;

% вал або шкiв: shafting_r --- радiус, shafting_w --- ширина,

% shafting_c --- колiр бiля центра, shafting_s --- центр

% лiвого краю,

% shafting_l --- ширина лiнiї.

vardef SHAFTING(expr shafting_r, shafting_w, shafting_c,

shafting_s,shafting_l) = save N; save BEAR;

picture shaft;

N:=40;

shaft:=image(for ii:=0 upto N-1:

fill (unitsquare shifted (0,-0.5bp)) xscaled (shafting_w)

yscaled (2*shafting_r*sqrt((N-ii)/N)) withcolor

((shafting_c/N)*ii); endfor;

draw (unitsquare shifted (0,-0.5bp)) xscaled (shafting_w)

yscaled (2*shafting_r)

withpen pencircle scaled shafting_l;);

draw shaft shifted shafting_s;

enddef;

beginfig(1);

% побудова основних точок рисунка

p[1]:=origin;

p[2]:=p[1] shifted bearing_s shifted((width-bearing_w),0);

p[3]:=p[1] shifted((0.5*bearing_w),0);

p[4]:=p[1] shifted((width-0.5*bearing_w),0);

p[5]:=p[1] shifted sheave_s shifted((0.5*sheave_w),0);

p[6]:=p[3] shifted (0,bearing_r+bearing_h);

p[7]:=p[4] shifted (0,bearing_r+bearing_h);

p[8]:=p[5] shifted (0,sheave_r);

p[9]:=p[8] shifted (0,tic);

p[10]:=0.9[p[8],p[9]];

p[11]:=(xpart(p[6]),ypart(p[10]));

103

Page 104: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

p[12]:=(xpart(p[7]),ypart(p[10]));

p[13]:=(xpart(p[6]),ypart(p[9]));

p[14]:=(xpart(p[7]),ypart(p[9]));

p[15]:=p[3] shifted (0,-shafting_r);

p[16]:=p[4] shifted (0,-shafting_r);

p[17]:=(0.5*shafting_w,0);

% точки, якi визначають вагу шкiва i вала

p[18]:=p[5] shifted(0,-m_sheave);

p[19]:=p[17] shifted(0,-m_shaft);

% рiвняння рiвноваги --- сума моментiв дорiвнює нулю

FC*width=xpart(p[5]-p[1])*m_sheave+xpart(p[17]-p[1])*m_shaft;

p[20]=(xpart(p16),FC);

% рiвняння рiвноваги --- сума реакцiй дорiвнює вазi шкiва

% i вала

FA+FC=m_sheave+m_shaft;

p[21]=(xpart(p15),FA);

% побудова пiдшипникiв

BEARING(bearing_stp, bearing_w, bearing_h, bearing_r,

bearing_l, bearing_c, bearing_s);

BEARING(bearing_stp, bearing_w, bearing_h, bearing_r,

bearing_l, bearing_c, p[2]);

% побудова вала

SHAFTING(shafting_r,shafting_w,shafting_c,shafting_s,

shafting_l);

% побудова шкiва

SHAFTING(sheave_r,sheave_w,sheave_c,sheave_s,sheave_l);

% побудова лiнiй i стрiлок

begingroup;

interim linejoin:=mitered;

interim linecap:=butt;

draw p[6]--p[13];

draw p[7]--p[14];

draw p[8]--p[9];

drawdblarrow (p[10]shifted (-arr_shift,0))--(p[11]shifted

(arr_shift,0));

drawdblarrow (p[12]shifted (-arr_shift,0))--(p[10]shifted

(arr_shift,0));

drawarrow p[5]--p[18] withpen pencircle scaled arr_white_F

withcolor white;

drawarrow p[5]--p[18] withpen pencircle scaled arr_F;

drawarrow p[17]--p[19] withpen pencircle scaled arr_white_F

withcolor white;

drawarrow p[17]--p[19] withpen pencircle scaled arr_F;

drawarrow p[16]--p[20] withpen pencircle scaled arr_white_F

104

Page 105: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

withcolor white;

drawarrow p[16]--p[20] withpen pencircle scaled arr_F;

drawarrow p[15]--p[21] withpen pencircle scaled arr_white_F

withcolor white;

drawarrow p[15]--p[21] withpen pencircle scaled arr_F;

endgroup;

% написи на рисунку

label.top(btex\fnt $\EuScript{A}$ etex,p[13]);

label.top(btex\fnt $\EuScript{B}$ etex,p[14]);

label.top(btex\fnt $\EuScript{C}$ etex,p[9]);

label.rt(btex\fnt ${N}_1$ etex,0.7[p[6],p[21]]);

label.lft(btex\fnt ${N}_2$ etex,0.5[p[7],p[20]]);

label.lft(btex\fnt $m{g}$ etex,0.7[p[17],p[19]]);

label.rt(btex\fnt $M{g}$ etex,0.9[p[5],p[18]]);

% щоб побачити точки, якi використовуються при побудовi,

% розкоментуйте наступнi сiм рядкiв

% NN:=21;

% defaultfont:="cmr5";

% for ii = 1 upto NN: fill fullcircle scaled 0.5u shifted p[ii]

% withcolor red; endfor;

% for ii = 1 upto NN: label.top(decimal(ii),p[ii]) withcolor

% blue+red;

% endfor;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

A BC

N1N2

mg

Mg

Рис. 6.10. Визначення реакцiй пiдшипникiв, iз якими вони дiють на вал iз насадженим на нього шкiвом

105

Page 106: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

6.4. Молекулярна фiзика

Задача 11. Проiлюструвати барометричну формулу, моделюючи експоненцiаль-ний розподiл молекул повiтря над поверхнею Землi генератором випадкових чиселuniformdeviate.

Коментар до програми. При моделюваннi користуємося тим, що експоненцiаль-ний розподiл

p(x) = ae−ax

можна отримати, якщо скористатися формулою [?]

τ = −1

alnγ,

де γ — випадкова величина, що характеризується однорiдним розподiлом на iнтерва-лi [0, 1]. У цьому разi τ — випадкова величина, що характеризується експоненцiаль-ними розподiлом.

Iншi коментарi наведено у програмi. Результат виконання програми зображенона рис. 6.11.

path p[]; pair q[];

% задаємо горизонтальний розмiр i висоту над поверхнею Землi

w:=50mm; h:=50mm;

% радiус молекул, 2*N кiлькiсть викликiв uniformdeviate

r:=1; N:=2000;

% висота, на якiй густина молекул падає в e разiв

H:=15mm;

% натуральний логарифм

vardef ln primary x = (if x=0: 0 else: mlog(x)/256 fi) enddef;

beginfig(1);

% штрихування

for ii:=-20 upto 20: q1:=(ii*1.5mm,0); q2:=q1 shifted

(dir(-60)*5mm);

draw (q1--q2) withcolor 0.5white; endfor;

% обмеження областi штрихування

p1:=unitsquare xscaled w yscaled 3mm shifted (-0.5w,-3mm);

clip currentpicture to p1;

% поверхня Землi

q1:=(-0.5w,0); q2:=(0.5w,0);

draw q1--q2 withcolor 0.5white withpen pencircle scaled 1;

for ii:=1 upto N: x:=(uniformdeviate w)-0.5w;

y:=(-ln(uniformdeviate 1))*H;

106

Page 107: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

if (y<h): draw z withpen pencircle scaled 2r; fi;

endfor;

% горизонтальнi лiнiї вiдповiдають зменшенню густини в e разiв

for ii:=1 upto round(h/H):

draw (-0.5w,ii*H)--(0.5w,ii*H) withcolor 0.5white;

endfor;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

Рис. 6.11. Iлюстрацiя барометричної формули, яка описує змiну розподiлу молекул повiтря над поверх-нею Землi. Горизонтальнi лiнiї вiдповiдають зменшенню густини повiтря в e разiв

Задача 12. Зобразити цикл Карно для одноатомного газу у координатах p, V .Коментар до програми. Цикл Карно складається iз двох iзотерм i двох адiабат.

Рiвняння iзотерми iдеального газу має вигляд

pV = const,

де p, V — тиск i об’єм газу, а константа const бiльша для вищої температури. Рiвнянняадiабати має вигляд

pV cp/cV = const,

де cp i cV — теплоємностi газу при сталому тиску i об’ємi. Значення const в обохнаведених рiвняннях, очевидно, рiзнi. Для одноатомного газу cp/cV = 5/3. Щоб

107

Page 108: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

побудувати адiабату в METAPOST, її рiвняння записуємо у виглядi

pe5

3lnV = const.

Будуючи цикл Карно, проводимо спочатку iзотерму зi стану, що характеризуєтьсяоб’ємом V1 i тиском p1, до стану, у якому об’єм газу дорiвнює V2. Знаходимо такожтиск p2, що вiдповiдає цьому об’єму. Далi рисуємо адiабату на промiжку до тогостану, у якому об’єм газу дорiвнює V3, i знаходимо тиск газу p3, що йому вiдпо-вiдає. Потiм треба побудувати другу iзотерму i другу адiабату. Ми знаємо, де вонипочинаються, але не знаємо їх точки перетину. Тому будуємо шлях, що вiдповiдаєдругiй iзотермi i другiй адiабатi, якi сполучають точки з об’ємами V3 i V1. Адiабатапроходить через точку, що вiдповiдає стану з об’ємом V1 i тиском p1, а iзотерма —через точку, що вiдповiдає стану з об’ємом V3 i тиском p3. Використовуємо командиcutbefore i cutafter, щоб iз цих шляхiв видiлити частини до точки перетинудругої адiабати з другою iзотермою i будуємо їх.

Iншi коментарi наведено у програмi. Результат виконання програми зображенона рис. 6.12.

verbatimtex

%&latex

\documentclass{article}

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

\begin{document}

etex

path P[]; pair XY[].[];

% задаємо розмiри графiка

width:=60mm; height:=60mm;

% їм вiдповiдають максимальнi x i y (мiнiмальнi дорiвнюють нулю)

y_axis_max:=1.2; x_axis_max:=y_axis_max*(width/height);

% одиницi довжини для графiка (масштаб)

ux:=width/x_axis_max;

uy:=height/y_axis_max;

% задаємо значення p1, V1, V2, V3

p1:=1; V1:=0.4; V2:=0.7; V3:=1.1;

% макроси експоненти i логарифма

vardef exp primary x = ((mexp 256)**x) enddef;

vardef ln primary x = (if x=0: 0 else: mlog(x)/256 fi) enddef;

beginfig(1);

% N -- кiлькiсть точок

108

Page 109: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

N:=21;

% iзотерма 1

for ii:=1 upto N:

dx:=(V2-V1)/(N-1);

x:=dx*(ii-1)+V1; y:=(p1*V1)/x;

XY[1].[ii]:=(x*ux,y*uy);

endfor;

p2:=y;

% формування шляху, що описує iзотерму 1

P1:=XY[1].[1] for j:=2 upto N: .. XY[1].[j] endfor;

draw P1 withpen pencircle scaled 1;

% адiабата 1

for ii:=1 upto N:

dx:=(V3-V2)/(N-1);

x:=dx*(ii-1)+V2; y:=p2*exp((5/3)*ln(V2/x));

XY[2].[ii]:=(x*ux,y*uy);

endfor;

p3:=y;

% формування шляху, що описує адiабату 1

P2:=XY[2].[1] for j:=2 upto N: .. XY[2].[j] endfor;

draw P2 withpen pencircle scaled 1;

% адiабата 2

for ii:=1 upto N:

dx:=(V3-V1)/(N-1);

x:=dx*(ii-1)+V1; y:=p1*exp((5/3)*ln(V1/x));

XY[3].[ii]:=(x*ux,y*uy);

endfor;

% формування шляху, що описує адiабату 2

P3:=XY[3].[1] for j:=2 upto N: .. XY[3].[j] endfor;

% iзотерма 2

for ii:=1 upto N:

dx:=(V3-V1)/(N-1);

x:=dx*(ii-1)+V1; y:=(p3*V3)/x;

XY[4].[ii]:=(x*ux,y*uy);

endfor;

% формування шляху, що описує iзотерму 2

P4:=XY[4].[1] for j:=2 upto N: .. XY[4].[j] endfor;

% беремо частину шляху P4 до перетину з P3

P5:=P4 cutbefore P3;

% беремо частину шляху P3 пiсля перетину з P4

P6:=P3 cutafter P4;

% будуємо iзотерму 2 й адiабату 2

draw P5 withpen pencircle scaled 1;

draw P6 withpen pencircle scaled 1;

109

Page 110: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

% вiсь абсцис iз "гострими" кiнцями стрiлок

linejoin:=mitered;

drawarrow (0,0)--(x_axis_max*ux,0);

% вiсь ординат

drawarrow (0,0)--(0,y_axis_max*uy);

% написи на графiку

label.lft(btex$p$etex,(0,0.95*height));

label.bot(btex$V$etex,(0.95*width,0));

label.urt(btex$T_1$etex,point 10 of P1);

label.bot(btex$T_2$etex,point (0.5*length(P5)) of P5);

label(btex адiабата etex rotated angle direction N/3 of P2,

(point N/3 of P2) shifted (6,4));

label(btex адiабата etex rotated angle direction 0.4*length(P6)

of P6, (point (0.4*length(P6)) of P6) shifted (-6,0));

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

p

V

T1

T2

адiабата

адiа

бата

Рис. 6.12. Цикл Карно для одноатомного газу

6.5. Електрика

Покажемо використання можливостей METAPOST для iлюстрацiї задач i теоре-тичного матерiалу з електрики. Зобразимо електричне поле, указавши напрямок ве-

110

Page 111: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

ктора напруженостi на сiтцi точок, а також проiлюструємо просту електричну схемудля вимiрювання опору — мiст Уiтсона.

Задача 13. Нарисувати вектори, що вказують напруженiсть поля двох рiзноймен-них точкових зарядiв однакової величини на сiтцi точок. Довжини векторiв вибратиоднаковими.

Коментар до програми. Очевидно, можна було б легко задати довжини векторiв,пропорцiйнi до напруженостi поля. Недолiком такого пiдходу є значний дiапазонзмiни довжини таких векторiв, що негативно позначається на сприйманнi рисунка.Iншi коментарi наведено у програмi. Результат виконання програми зображено нарис. 6.13.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

pair XY[].[], q[], F[].[], r[];

picture pic;

% задаємо розмiри графiка

width:=60mm;

height:=60mm;

% сiтка (4*N+1 точок по width)

N:=5;

stp:=width/(4*N);

Ny:=round(height/(4*stp));

beginfig(1);

for ii:=1 upto (4*N+1):

for j:=1 upto (4*Ny+1):

XY[ii].[j]:=((ii-1)*stp,0.5*height+(j-1-2*Ny)*stp);

endfor;

endfor;

% задаємо довжину стрiлки

interim ahlength:=1.5;

% координати негативного (1) i позитивного (2) зарядiв

q1:=XY[N+1].[2*Ny+1];

q2:=XY[3N+1].[2*Ny+1];

% напруженiсть поля (нормування вiдстаней до зарядiв на stp)

for ii:=1 upto (4*N+1):

for j:=1 upto (4*Ny+1):

111

Page 112: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

r1:=XY[ii].[j]-q1;

r2:=XY[ii].[j]-q2;

l1:=abs(r1)/stp;

l2:=abs(r2)/stp;

if (l1>0) and (l2>0):

F[ii].[j]:=unitvector(-1/(l1*l1)*unitvector(r1)

+1/(l2*l2)*unitvector(r2)) scaled (0.4*stp);

drawarrow XY[ii].[j]--(F[ii].[j] shifted XY[ii].[j]);

fi;

endfor;

endfor;

% маркування зарядiв

pic:=thelabel.top(btex\footnotesize$-q$etex,q1);

unfill bbox pic; draw pic;

dotlabel("",q1);

pic:=thelabel.top(btex\footnotesize$q$etex,q2);

unfill bbox pic; draw pic;

dotlabel("",q2);

endfig;

end;

−q q

Рис. 6.13. Електричне поле двох рiзнойменних зарядiв однакової величини

Задача 14. Зобразити схему моста Уiтсона для вимiрювання опорiв.Коментар до програми. Один раз рисуємо резистор командою image i потiм

вставляємо його у схему в потрiбних мiсцях. Використовуємо команду unfill, яка

112

Page 113: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

дозволяє витерти зображення дроту в мiсцi вставляння резистора. Щоб отриматикалiграфiчний напис на джерелi живлення, який виглядає краще, нiж дає командаLATEX \cal, користуємося пакетом euscript. При рисуваннi цiєї i подiбної їй схе-ми (наприклад, схеми експериментальної установки) зручно тимчасово, до заверше-ння роботи, виводити на екран монiтора положення основних точок, вiдносно якихiде побудова. У цьому разi використовувалася команда

for ii:=1 upto 6: dotlabel.top(decimal(ii),p[ii]); endfor;

яку пiсля закiнчення роботи було закоментовано.Iншi коментарi наведено у програмi. Результат виконання програми зображено

на рис. 6.14.

verbatimtex

%&latex

\documentclass{article}

\usepackage{euscript}

\begin{document}

etex

pair p[]; path P[];

picture R, G, E;

% задаємо розмiри графiка

width:=60mm;

height:=50mm;

% вiдстань мiж точками увiмкнення гальванометра

h:=40mm;

beginfig(1);

% з’єднання лiнiй без заокруглень

linecap:=mitered;

drawoptions(withpen pencircle scaled 1);

% вузловi точки i точки повороту дроту

p1:=origin;

p2:=(width,0);

p3:=(0,height-0.5*h);

p4:=(width,height-0.5*h);

p5:=(width/2,height-h);

p6:=(width/2,height);

% наступним рядком зручно користуватися при побудовi рисунка

% for ii:=1 upto 6: dotlabel.top(decimal(ii),p[ii]); endfor;

% резистор

R:=image(P1:=unitsquare shifted (-0.5,-0.5) xscaled 10mm

113

Page 114: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

yscaled 3mm;

unfill P1;draw P1);

% гальванометр

G:=image(P1:=fullcircle scaled 8mm;

unfill P1;

draw P1;

label(btex $G$ etex,origin)

);

% рисуємо дроти

draw p1--p2--p4--p6--p3--cycle;

draw p3--p5--p4;

draw p5--p6;

% вставляємо резистори

draw R rotated angle(p5-p3) shifted 0.5[p5,p3];

draw R rotated angle(p4-p5) shifted 0.5[p5,p4];

draw R rotated angle(p6-p4) shifted 0.5[p6,p4];

draw R rotated angle(p3-p6) shifted 0.5[p6,p3];

% створюємо рисунок джерела живлення

drawoptions();

E:=image(p7:=(-0.5mm,-2mm); p8:=(-0.5mm,2mm);

p9:=(0.5mm,-4mm); p10:=(0.5mm,4mm);

unfill p7--p8--p9--p10--cycle;

draw p7--p8 withpen pencircle scaled 2;

draw p9--p10 withpen pencircle scaled 1;

label.bot(btex $\EuScript{E}$ etex,(0,-4mm)););

% вставляємо гальванометр

draw G shifted 0.5[p5,p6];

% вставляємо джерело живлення

draw E shifted 0.5[p1,p2];

% маркуємо елементи схеми; враховуємо ширину резистора

SHIFT:=0.5*(ypart (urcorner R -llcorner R));

label.llft(btex$R_1$etex,0.5[p3,p5]+

(unitvector(dir(angle(p3-p5)+90))scaled SHIFT));

label.ulft(btex$R_2$etex,0.5[p3,p6]+

(unitvector(dir(angle(p6-p3)+90))scaled SHIFT));

label.urt(btex$R_3$etex,0.5[p4,p6]+

(unitvector(dir(angle(p4-p6)+90))scaled SHIFT));

label.lrt(btex$R_x$etex,0.5[p4,p5]+

(unitvector(dir(angle(p5-p4)+90))scaled SHIFT));

endfig;

end;

114

Page 115: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

G

E

R1

R2 R3

Rx

Рис. 6.14. Мiст Уiтсона для вимiрювання опорiв

6.6. Геометрична оптика

Можливостi METAPOST для пiдготовки iлюстративного матерiалу з геометрич-ної оптики покажемо на прикладах ходу променiв у призмi та побудови оптичногозображення у лiнзi.

Задача 15. Побудувати хiд променя через призму з показником заломленняn = 1,5.

Коментар до програми. Нехай кут падiння променя на призму дорiвнює α, тодiкут мiж ним i передньою гранню призми β при поширеннi його у призмi знаходимоiз закону заломлення

sinα

sinβ= n.

Аналогiчно пов’язанi кути падiння на задню грань γ i виходу iз задньої гранi уповiтря δ:

sin δ

sinγ= n.

Немає необхiдностi шукати в аналiтичному виглядi зв’язок β i γ через кут бiлявершини призми ϕ. Ми знайдемо γ, користуючись командами METAPOST.

Для позначення скла використовуємо штрихування. Спочатку створюємо зразокштрихiв i зберiгаємо як величину G типу picture, потiм цей зразок рiвномiрно

115

Page 116: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

розмiщуємо на трохи нахиленiй сiтцi вузлiв, а далi отриманi штрихи обрiзаємо ко-мандою clip вiдповiдно до розмiрiв призми. Iншi деталi вказано в коментарях про-грами. Результат виконання програми зображено на рис. 6.15.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

pair p[], q[]; path P[];

picture G;

% задаємо розмiри призми

width:=60mm;

height:=60mm;

% задаємо довжину перпендикуляра до граней призми

h:=20mm;

% задаємо показник заломлення n

n:=1.5;

% макрос арксинуса

vardef arcsind primary x = angle ((1+-+x,x)) enddef;

% макрос маркування кута

vardef mark_angle(expr a,b,c) =

path Q[]; angle_c:= angle(c-a);

angle_b:= angle(b-a);

if abs(angle_b-angle_c)>180:

if angle_b>angle_c:angle_c:=angle_c+360

else angle_b:=angle_b+360; fi;

fi;

time_c:=angle_c/45; time_b:=angle_b/45;

Q1:=fullcircle scaled 40 shifted a;

Q2:=subpath (time_c,time_b) of Q1;

draw Q2;

point (0.5*(time_c+time_b)) of Q1

enddef;

beginfig(1);

% точки на призмi, точки початку променя i його входу в призму

p1:=origin;

p2:=(width,0);

p3:=(width/2,height);

p4:=(-width/4,height/3);

116

Page 117: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

p5:=0.5[p1,p3];

% точки на перпендикулярi до передньої гранi в точцi p5

p6:=dir(angle(p3-p1)+90) scaled (h/2) shifted p5;

p7:=p6 reflectedabout (p1,p3);

% обчислення кутiв alpha, beta

alpha:=angle(p4-p5)-angle(p6-p5);

beta:=arcsind(sind(alpha)/n);

% точка p8 виходу променя iз задньої гранi

q1:=dir(angle(p7-p5)+beta)+p5;

p8:=whatever[p5,q1]=whatever[p3,p2];

% точки на перпендикулярi до задньої гранi в точцi p8

p9:=dir(angle(p2-p3)+90) scaled (h/2) shifted p8;

p10:=p9 reflectedabout (p2,p3);

% обчислення кутiв gamma, delta

gamma:=angle(p10-p8)-angle(p5-p8);

delta:=arcsind(sind(gamma)*n);

% точка p11 за призмою, через яку виходить промiнь

q1:=dir(angle(p9-p8)-delta)+p8;

p11:=whatever[p8,q1]=whatever[(1.25width,0),

(1.25width,height)];

G:=image(G:=image(draw(-5,0)--(5,0); draw(-4,-2)--(-1,-2);

draw(4,2)--(1,2);); draw G rotated 30);

% кiлькiсть штрихiв на довжинi основи

N:=8;

stp:=width/(N-1);

Ny:= round(height/stp);

for ii:=1 upto N:

for j:=-1 upto Ny: draw G shifted ((ii-0.5)*stp,

(j-0.5+0.2*ii)*stp);

endfor;

endfor;

% шлях, що вiдповiдає контуру призми

P1:=p1--p3--p2--cycle;

% витираємо штрихи поза призмою

clip currentpicture to P1;

% рисуємо призму

draw P1 withpen pencircle scaled 1;

% рисуємо перпендикуляри в точках p5 i p8

draw p6--p7; draw p9--p10;

% рисуємо промiнь i стрiлки на ньому

drawoptions(withpen pencircle scaled 0.7);

draw p4--p5--p8--p11;

drawarrow p4--0.5[p5,p4];

drawarrow p5--0.5[p8,p5];

117

Page 118: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

drawarrow p8--0.5[p11,p8];

% позначаємо кути

p12:=mark_angle(p5,p6,p4);

label.lft(btex$\alpha$etex,p12);

p13:=mark_angle(p5,p7,p8);

label.rt(btex$\beta$etex,p13);

p14:=mark_angle(p8,p5,p10);

label.lft(btex$\gamma$etex,p14);

p15:=mark_angle(p8,p9,p11);

label.rt(btex$\delta$etex,p15);

p16:=mark_angle(p3,p1,p2);

label.bot(btex$\varphi$etex,p16);

% наступним рядком зручно користуватися при побудовi рисунка

% for ii:=1 upto 16: dotlabel.top(decimal(ii),p[ii]); endfor;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

αβ γ

δ

ϕ

Рис. 6.15. Хiд променiв у призмi. Показник заломлення n = 1,5

Задача 16. Побудувати зображення предмета у тонкiй лiнзi, що лежить на вiд-станi h = 5 мм вiд оптичної осi. Вiдстань вiд предмета до лiнзи d = 3 см. Фокуснавiдстань F дорiвнює 2 см, вiдстань h предмета до осi — 3 см. Розмiр зображенняповинен вiдповiдати збiльшенню, яке дає лiнза.

Коментар до програми. При побудовi зображення керуємося тим, що у тонкiйлiнзi промiнь через центр лiнзи проходить без заломлення i змiщення, а промiнь,

118

Page 119: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

який iде через переднiй фокус лiнзи, пiсля лiнзи йде паралельно оптичнiй осi. Iншiкоментарi наведено в текстi програми. Результат виконання програми зображено нарис. 6.16.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

pair p[]; path P[];

picture S;

% задаємо параметри задачi

F:=20mm;

h:=5mm;

d:=30mm;

% радiуси сфер, що утворюють лiнзу, i вiдстань мiж їх центрами

R:=110mm;

a:=218mm;

beginfig(1);

% кiнцi оптичної осi

L1:=-40mm;

L2:=70mm;

% точки на кiнцях оптичної осi, центри сфер

p1:=(L1,0);

p2:=(L2,0);

p3:=(-a/2,0);

p4:=(a/2,0);

% переднiй фокус i предмет

p5:=(-F,0);

p6:=(-d,h);

% точки у площинi лiнзи

p7:=(0,a/5);

p8:=(0,-a/5);

% пiвкола для побудови лiнзи

P1:=halfcircle scaled (2*R) rotated -90 shifted p3;

P2:=halfcircle scaled (2*R) rotated 90 shifted p4;

% лiнза

P3:=buildcycle(P1,P2);

draw p7--p8;

clip currentpicture to P3;

119

Page 120: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

draw P3 withpen pencircle scaled 1;

% оптична вiсь

draw p1--p2;

% промiнь через оптичний центр лiнзи

p9=whatever[p6,origin]=whatever[p2,p2+dir(-90)];

draw p6--p9; drawarrow p6--0.15[p6,p9];

% промiнь через фокус лiнзи

p10=whatever[p6,p5]=whatever[p7,p8];

p11:=(xpart(p2),ypart(p10));

draw p6--p10; drawarrow p6--0.25[p6,p10];

draw p10--p11;

% точка зображення

p12=whatever[p10,p11]=whatever[p6,p9];

% написи на рисунку

label.bot(btex$F$etex,p5);

% джерело

S:=image(for ii:=1 upto 12:

draw origin--(dir(30*ii) scaled 4);

endfor;

fill fullcircle scaled 4 withcolor white;

draw fullcircle scaled 4;);

draw S shifted p6;

draw S scaled (ypart(p12)/ypart(p6)) shifted p12;

% наступним рядком зручно користуватися при побудовi рисунка

% for ii:=1 upto 12: dotlabel.top(decimal(ii),p[ii]); endfor;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

F

Рис. 6.16. Побудова зображення предмета у збиральнiй лiнзi

120

Page 121: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

6.7. Атомна фiзика

Проiлюструємо застосування METAPOST для зображення схем енергетичних рiв-нiв атомiв на прикладi атомiв водню i рубiдiю.

Задача 17. Побудувати схему енергетичних рiвнiв атома водню. Показати пере-ходи, що вiдповiдають серiї Бальмера.

Коментар до програми. Енергiя атома водню у станi iз квантовим числом nописується формулою

En = −R1

n2.

Серiя Бальмера вiдповiдає переходам зi станiв n > 2 у стан n = 2. У зв’яз-ку з тим, що ми рисуємо стрiлки без заокруглень на кiнцях (див. командуlinejoin:=mitered), вони трохи довшi. Тому, позначаючи серiю Бальмера, мивносимо зсув кiнцiв стрiлок на 0.8bp. Коментарi стосовно зображення енергетич-них рiвнiв наведено в текстi програми. Результат виконання програми зображено нарис. 6.17.

verbatimtex

%&latex

\documentclass{article}

\begin{document}

etex

pair p[]; path P[];

picture dot;

% задаємо параметри задачi

R:=60mm; width:=45mm; n_max:=9;

dot:=image(fill fullcircle scaled 0.5);

beginfig(1);

% знаходимо положення енергетичних рiвнiв,

% малюємо їх i маркуємо

defaultfont:="cmr5";

for ii:=1 upto n_max:

p[ii]:=(0,-R/(ii**2));

p[ii+n_max]:=(width,-R/(ii**2));

draw p[ii]--p[ii+n_max];

endfor;

for ii:=1 upto 5:

label.lft(decimal(ii),p[ii]);

endfor;

% маркуємо точками близькi рiвнi

for ii:=6 upto n_max:

121

Page 122: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

label.lft(dot,p[ii]);

endfor;

% границя рiвнiв (n=infinity)

draw origin--(width,0) dashed evenly;

% вiсь енергiї

% "гострi" стрiлки

linejoin:=mitered;

drawarrow (-5mm,0)--(-5mm,-(R+5mm));

label.lft(btex$E$etex,0.5[(-5mm,0),(-5mm,-(R+5mm))]);

% стала Рiдберга

label.lft(btex$-R$etex,(-5mm,-R));

draw (-5.5mm,-R)--(-4.5mm,-R);

% серiя Бальмера

stp:=width*0.8/(n_max-3);

for ii:=3 upto n_max:

xx:=0.1*width+stp*(ii-3);

drawarrow (xx,ypart(p[ii]))--(xx,(ypart(p[2])+0.8));

endfor;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

1

2

3

45

E

−R

Рис. 6.17. Схема енергетичних рiвнiв атома водню i переходiв, що вiдповiдають серiї Бальмера

Задача 18. Побудувати схему енергетичних рiвнiв атома рубiдiю 85Rb, якi вiдпо-вiдають за перехiд D1.

122

Page 123: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Коментар до програми. На схемi показано надтонку структуру станiв 52S1/2 i52P1/2. У зв’язку з великою рiзницею (майже на порядок) надтонкого розщепленнявказаних станiв вiдношення рiзницi надтонких компонент цих станiв для наочностiспотворено. Додатковi коментарi наведено в текстi програми. Результат виконанняпрограми зображено на рис. 6.18.

verbatimtex

%&latex

\documentclass{article}

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

\begin{document}

etex

pair p[], SHIFT; picture pic[];

% задаємо параметри задачi

level:=20mm;

gap:=10mm;

height:=60mm;

N:=8;

beginfig(1);

defaultfont:="cmr8";

% "гострi" стрiлки

linejoin:=mitered;

% зсуви рiвнiв i масштаби

SF2:=-1.770; SF3:=1.264; S:=10mm;

PF2:=-210; PF3:=150; P:=0.08mm;

% положення енергетичних рiвнiв

p1:=origin; p2:=(0,height);

p3:=((level+gap),SF2*S);

p4:=((level+gap),SF3*S);

p5:=((level+gap),height+PF2*P);

p6:=((level+gap),height+PF3*P);

p7:=((level+gap),0);

p8:=((level+gap),height);

for ii:=1 upto N:

p[ii+N]:=p[ii] shifted (level,0);

endfor

% рисуємо рiвнi

for ii:=1 upto N-2:

draw p[ii]--p[ii+N];

endfor;

for ii:=N-1 upto N:

draw p[ii+2]--p[ii+N] dashed evenly;

123

Page 124: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

endfor;

% знаходимо середини рiвнiв

for ii:=1 upto N:

p[ii+2*N]=0.5[p[ii],p[ii+N]];

endfor;

% пiдписуємо стани

label.lft(btex$5^2S_{1/2}$etex,p1shifted(-5,0));

label.lft(btex$5^2P_{1/2}$etex,p2shifted(-5,0));

label.rt(btex$F=2$etex,p11shifted(5,0));

label.rt(btex$F=3$etex,p12shifted(5,0));

label.rt(btex$F=2$etex,p13shifted(5,0));

label.rt(btex$F=3$etex,p14shifted(5,0));

% рисуємо стрiлки

SHIFT:=(0,0.8);

drawdblarrow(p[17]shifted SHIFT)--(p[18]shifted -SHIFT);

drawdblarrow(p[19]shifted SHIFT)--(p[23]shifted -SHIFT);

drawdblarrow(p[23]shifted SHIFT)--(p[20]shifted -SHIFT);

drawdblarrow(p[21]shifted SHIFT)--(p[24]shifted -SHIFT);

drawdblarrow(p[24]shifted SHIFT)--(p[22]shifted -SHIFT);

% вказуємо величини надтонкого зсуву i частоту переходу

pic1:=thelabel(btex \footnotesize 377.107385690 ТГц etex,

0.5[p17,p18]);

unfill bbox pic1; draw pic1;

pic2:=thelabel(btex \footnotesize 1.7708439228 ГГц etex,

0.5[p19,p23]);

unfill bbox pic2; draw pic2;

pic3:=thelabel(btex \footnotesize 1.2648885163 ГГц etex,

0.5[p23,p20]);

unfill bbox pic3; draw pic3;

pic4:=thelabel(btex \footnotesize 210.923 МГц etex,

0.5[p21,p24]);

unfill bbox pic4; draw pic4;

pic5:=thelabel(btex \footnotesize 150.659 МГц etex,

0.5[p24,p22]);

unfill bbox pic5; draw pic5;

% наступний рядок використовується при побудовi рисунка

% for ii:=1 upto 3*N: dotlabel.top(decimal(ii),p[ii]); endfor;

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

124

Page 125: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

52S1/2

52P1/2

F = 2

F = 3

F = 2

F = 3

377.107385690 ТГц

1.7708439228 ГГц

1.2648885163 ГГц

210.923 МГц

150.659 МГц

Рис. 6.18. Схема енергетичних рiвнiв атома 85Rb, якi вiдповiдають за перехiд D1

6.8. Iлюстративна дiаграма

Для наочної подачi матерiалу часто використовують iлюстративнi дiаграми. По-кажемо можливостi METAPOST на прикладi однiєї з них.

Вiдомi рiзнi способи оцiнювання нормальної маси людини. Зараз поширене оцi-нювання за iндексом маси тiла (IМТ), який обчислюється за формулою

IМТ =маса в кг

(зрiст у м)2.

Знаючи iндекс маси, можна оцiнити, наскiльки маса людини близька до оптимальної.Задача 19. Побудувати в системi координат “маса — зрiст” кривi, якi роздiляють

рiзнi ступенi дефiциту, норми i надлишку маси. Простiр мiж кривими заповнити рi-зними вiдтiнками сiрого кольору. Використати класифiкацiю Всесвiтньої органiзацiїохорони здоров’я.

• Значний дефiцит маси, IМТ<16,5.

125

Page 126: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

• Дефiцит маси, 16,5<IМТ<18,5.• Норма, 18,5<IМТ<25.• Надлишок маси, 25<IМТ<30.• Ожирiння першого ступеня, 30<IМТ<35.• Ожирiння другого ступеня, 35<IМТ<40.• Ожирiння третього ступеня, IМТ>40.

Коментар до програми. Звернiть увагу на побудову шляхiв за допомогою коман-ди buildcycle, а також на спосiб нанесення координатної сiтки. У координатнiйсiтцi використвується два кольори — темнiший (жирнiшi лiнiї) i свiтлiший (тоншiштрихованi). Це робить її добре видимою як на темному (великi iндекси маси), такi на свiтлому (малi iндекси маси) фонi.

Додатковi коментарi наведено в текстi програми. Результат виконання програмизображено на рис. 6.19.

verbatimtex

%&latex

\documentclass[12pt]{article}

\usepackage[english,russian,ukrainian]{babel}

\usepackage[cp1251]{inputenc}

\usepackage{amsmath}

\begin{document}

\newcommand{\fnt}{\small}

\newcommand{\fntl}{\large}

etex

pair p[],pp[],px[],py[];

path P[], PP[], frame, frame_a, frame_b;

color c[];

% кольори, якими заповнюються iнтервали,

% що вiдповiдають рiзним iндексам маси

c1:=0.1white;

c2:=0.3white;

c3:=0.5white;

c4:=0.7white;

c5:=0.80white;

c6:=0.88white;

c7:=0.95white;

% одиниця вимiрювання при побудовi дiаграми

u:=1mm;

% розмiри дiаграми

126

Page 127: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

frame_height:=80mm;

frame_width:=120mm;

frame_line:=0.5pt;

% базова ширина лiнiй

tic_w:=0.8bp;

% допомiжна величина

h=5.5u;

% iнтервали маси i зросту, для яких будується дiаграма

xaxis_min:=30;

xaxis_max:=150;

yaxis_min:=140;

yaxis_max:=200;

% одиницi на осях абсцис i ординат

ux:=frame_width/(xaxis_max-xaxis_min);

uy:=frame_height/(yaxis_max-yaxis_min);

% вiдстанi вiд написiв на осях вiд осей

xlabel_off:=6.0mm;

ylabel_off:=6.5mm;

% кроки позначок за масою i зростом

x_min:=30;

x_stp:=2;

x_N:=61;

y_min:=140;

y_stp:=2;

y_N:=31;

% кiлькiсть точок i крок при побудовi кривих

N:=100; xstp:=(xaxis_max-xaxis_min)/N;

% межi рамки, в якiй будується дiаграма

pp1:=origin;

pp2:=(0,frame_height);

pp3:=(frame_width,frame_height);

pp4:=(frame_width,0);

% рамку розбито на двi частини для застосування

% далi builcycle

frame_a:= pp4--pp1--pp2;

127

Page 128: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

frame_b:= pp2--pp3--pp4;

frame:= frame_a&frame_b--cycle;

% iндекси маси

index[1]:=16.5;

index[2]:=18.5;

index[3]:=25;

index[4]:=30;

index[5]:=35;

index[6]:=40;

% побудова шляхiв, що вiдображають

% залежнiсть зросту вiд маси тiла для фiксованих

% iндексiв мас i замкнених шляхiв, якi потiм

% буде заповнено вказаними кольорами

for jj=1 upto 6:

for j=0 upto (N+1): p[j]:= ((xaxis_min+xstp*j)*ux,

sqrt((xaxis_min+xstp*j)/index[jj])*100*uy)

shifted (-xaxis_min*ux,-yaxis_min*uy);endfor;

P[jj]:=p0 for j:=1 upto (N+1): ..p[j] endfor;

PP[jj]:=buildcycle (frame_a,frame_b,P[jj]);

endfor;

beginfig(1);

% заповнення областей iз заданими iнтервалами

% iндексу маси вказаними кольорами

fill frame withcolor c[1];

for jj=1 upto 6: fill PP[7-jj] withcolor c[jj+1];endfor;

for jj=1 upto 6: draw P[jj] withpen pencircle scaled 1bp

dashed evenly scaled 2 withcolor 0.6white; endfor;

% позначки на осях

for ii=1 upto x_N: px[ii]:=(x_min+(ii-1)*x_stp,0);

draw ((px[ii] scaled ux)--(px[ii] scaled ux

shifted (0,(frame_height)))) shifted (-xaxis_min*ux,0)

withpen pencircle scaled 1.5tic_w withcolor 0.2white;

draw ((px[ii] scaled ux)--(px[ii] scaled ux

shifted (0,(frame_height)))) shifted (-xaxis_min*ux,0)

withpen pencircle scaled 0.75tic_w

withcolor 0.9white dashed evenly scaled 0.25;

endfor;

for ii=1 upto y_N: py[ii]:=(0,y_min+(ii-1)*y_stp);

draw ((py[ii] scaled uy)--((py[ii] scaled uy)

shifted (frame_width,0))) shifted (0,-yaxis_min*uy)

withpen pencircle scaled 1.5tic_w withcolor 0.2white;

128

Page 129: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

draw ((py[ii] scaled uy)--((py[ii] scaled uy)

shifted (frame_width,0))) shifted (0,-yaxis_min*uy)

withpen pencircle scaled 0.75tic_w

withcolor 0.9white dashed evenly scaled 0.25;

endfor;

for iii=0 upto 12:ii:=(iii*5+1);

draw ((px[ii] scaled ux)--(px[ii] scaled ux

shifted (0,(frame_height)))) shifted (-xaxis_min*ux,0)

withpen pencircle scaled 2.5tic_w withcolor 0.2white;

draw ((px[ii] scaled ux)--(px[ii] scaled ux

shifted (0,(frame_height)))) shifted (-xaxis_min*ux,0)

withpen pencircle scaled 1.2tic_w

withcolor 0.95white dashed evenly scaled 0.7;

endfor;

for iii=0 upto 6: ii:=(iii*5+1);

draw ((py[ii] scaled uy)--((py[ii] scaled uy)

shifted (frame_width,0))) shifted (0,-yaxis_min*uy)

withpen pencircle scaled 2.5tic_w withcolor 0.2white;

draw ((py[ii] scaled uy)--((py[ii] scaled uy)

shifted (frame_width,0))) shifted (0,-yaxis_min*uy)

withpen pencircle scaled 1.2tic_w

withcolor 0.95white dashed evenly scaled 0.7;

endfor;

% обрiзання рисунка по рамцi

clip currentpicture to frame;

draw frame;

for j:= 0 upto 12:

draw (px[1+5*j] scaled ux) shifted (-xaxis_min*ux,0)

withpen pencircle scaled 2bp;

endfor;

for j:= 0 upto 6:

draw (py[1+5*j] scaled uy) shifted (0,-yaxis_min*uy)

withpen pencircle scaled 2bp;

endfor;

% маркування значень на осях

label.bot (btex \fnt{$40$} etex, (px[6] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$50$} etex, (px[11] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$60$} etex, (px[16] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$70$} etex, (px[21] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$80$} etex, (px[26] scaled ux)

129

Page 130: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$90$} etex, (px[31] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$100$} etex, (px[36] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$110$} etex, (px[41] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$120$} etex, (px[46] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$130$} etex, (px[51] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$140$} etex, (px[56] scaled ux)

shifted (-xaxis_min*ux,0));

label.bot (btex \fnt{$150$} etex, (px[61] scaled ux)

shifted (-xaxis_min*ux,0));

label.lft (btex \fnt{$140$} etex, (py[1] scaled uy)

shifted (0,-yaxis_min*uy));

label.lft (btex \fnt{$150$} etex, (py[6] scaled uy)

shifted (0,-yaxis_min*uy));

label.lft (btex \fnt{$160$} etex, (py[11] scaled uy)

shifted (0,-yaxis_min*uy));

label.lft (btex \fnt{$170$} etex, (py[16] scaled uy)

shifted (0,-yaxis_min*uy));

label.lft (btex \fnt{$180$} etex, (py[21] scaled uy)

shifted (0,-yaxis_min*uy));

label.lft (btex \fnt{$190$} etex, (py[26] scaled uy)

shifted (0,-yaxis_min*uy));

label.lft (btex \fnt{$200$} etex, (py[31] scaled uy)

shifted (0,-yaxis_min*uy));

% написи на осях

label (btex \fntl{Маса тiла (кг)} etex, (0.5frame_width,0)

shifted (0,-10u));

label (btex \fntl{Зрiст (м)} etex rotated 90,

(0,0.5frame_height) shifted (-12u,0));

% пояснювальнi написи

label (btex \large{Iндекс маси тiла визначається} etex,

(0.5frame_width,frame_height) shifted (0,34u));

label (btex \large{вiдношенням маси людини в кiлограмах} etex,

(0.5frame_width,frame_height) shifted (0,28u));

label (btex {\large{до квадрата зросту в метрах:}} etex,

(0.5frame_width,frame_height) shifted (0,22u));

label (btex \textbf{\boldmath\large{$\displaystyle\text{IМТ}=

\frac{\text{маса в кг}}{\text{(зрiст у м)}^2}$}} etex,

(0.5frame_width,frame_height) shifted (0,10u));

130

Page 131: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

pp5=(0,-18u);

pp6=pp5 shifted (0.3333*frame_width,0);

pp7=pp5 shifted (0,-h);

pp8=pp6 shifted (0,-h);

pp9=pp7 shifted (0,-h);

pp10=pp8 shifted (0,-h);

pp11=pp9 shifted (0,-h);

pp12=pp10 shifted (0,-h);

pp13=pp11 shifted (0,-h);

pp14=pp12 shifted (0,-h);

pp15=pp13 shifted (0,-h);

pp16=pp14 shifted (0,-h);

pp17=pp15 shifted (0,-h);

pp18=pp16 shifted (0,-h);

pp19=pp17 shifted (0,-h);

pp20=pp18 shifted (0,-h);

% пояснення кольорiв

fill pp5--pp6--pp8--pp7--cycle withcolor c7;

label.rt (btex \small{Значний дефiцит маси, IМТ$<$16,5} etex,

0.5[pp6,pp8] shifted (2u,0));

fill pp7--pp8--pp10--pp9--cycle withcolor c6;

label.rt (btex \small{Дефiцит маси, 16,5$<$IМТ$<$18,5} etex,

0.5[pp8,pp10] shifted (2u,0));

fill pp9--pp10--pp12--pp11--cycle withcolor c5;

label.rt (btex \small{Норма, 18,5$<$IМТ$<$25} etex,

0.5[pp10,pp12] shifted (2u,0));

fill pp11--pp12--pp14--pp13--cycle withcolor c4;

label.rt (btex \small{Надлишок маси, 25$<$IМТ$<$30} etex,

0.5[pp12,pp14] shifted (2u,0));

fill pp13--pp14--pp16--pp15--cycle withcolor c3;

label.rt (btex \small{Ожирiння першого (30$<$IМТ$<$35)} etex,

0.5[pp14,pp16] shifted (2u,0));

fill pp15--pp16--pp18--pp17--cycle withcolor c2;

label.rt (btex \small{i другого (35$<$IМТ$<$40) ступенiв} etex,

0.5[pp16,pp18] shifted (2u,0));

fill pp17--pp18--pp20--pp19--cycle withcolor c1;

label.rt (btex \fnt{Ожирiння третього ступеня, IМТ$>$40} etex,

0.5[pp18,pp20] shifted (2u,0));

currentpicture:=currentpicture shifted

(-llcorner currentpicture);

endfig;

end;

131

Page 132: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

40 50 60 70 80 90 100 110 120 130 140 150140

150

160

170

180

190

200

Маса тiла (кг)

Зрiс

т(м

)

Iндекс маси тiла визначаєтьсявiдношенням маси людини в кiлограмах

до квадрата зросту в метрах:

IМТ =

маса в кг

(зрiст у м)2

Значний дефiцит маси, IМТ<16,5

Дефiцит маси, 16,5<IМТ<18,5

Норма, 18,5<IМТ<25

Надлишок маси, 25<IМТ<30

Ожирiння першого (30<IМТ<35)

i другого (35<IМТ<40) ступенiв

Ожирiння третього ступеня, IМТ>40

Рис. 6.19. Iлюстративна дiаграма до розрахунку iндексу маси тiла

132

Page 133: ПУБЛIКАЦIЯХtheory.phys.univ.kiev.ua/uk/system/files/users/alexrm/psgraphics1.pdfУДК 514.18:655.26(075.8) ББК 22.1+37.8я73 Р69 Рецензенти: д-р фiз.-мат

Прикiнцевi зауваження до частини I

Наведений у посiбнику обсяг опису мови METAPOST та її застосування для побу-дови рисункiв i графiкiв у цiлому достатнiй для пiдготовки студентських курсовихта дипломних робiт i наукових публiкацiй. Водночас вiн охоплює не всi можливiварiанти необхiдних для пiдготовки публiкацiй рисункiв. Наприклад, не розглянутовипадок зображення поверхонь, якi можна легко отримати, скажiмо, за допомогоюMATLAB. Простим способом пiдготовки таких рисункiв є їх зображення iншою про-грамою без координатних осей i написiв iз наступним сумiщенням зображення по-верхнi з координатними осями, виконаними за допомогою METAPOST. Ознайомитисяз побудовою зображень поверхонь за допомогою METAPOST можна в [?].

Ми розглянули приклад електричної схеми у пiдроздiлi 6.5. Для побудови еле-ктричних схем з великою кiлькiстю елементiв, можна скористатися пакетом макросiвmpcirc [?], який можна завантажити з Iнтернету за адресою

http://ci.uofl.edu/tom/software/LaTeX/mpcirc/

Для побудови функцiональних схем приладiв i програм можуть виявитися кори-сними набори макросiв boxes та circleit [?,?].

Пiд час зображення тексту METAPOST робить рисунок iз вмiсту мiж btex i etexза правилами TEX чи LATEX. Наприклад, написавши btex n etex отримаємо n, ане значення величини n у METAPOST-програмi. Написати значення величини, напри-клад, для друкування низки позначок одним циклом, можна, використовуючи пакетмакросiв TEX [?]. Аналогiчну можливiсть надає пакет макросiв latexMP [?].

133