Создание геометрических чертежей в TikZ

ЧЕБЫШЕВСКИЙ СБОРНИК

Том 16 Выпуск 2

СОЗДАНИЕ ГЕОМЕТРИЧЕСКИХ ЧЕРТЕЖЕЙ

В TikZ1

Н. М. Добровольский, А. Р. Есаян

Аннотация

При решении геометрических задач, написании пособий и книг по геометрии для средней школы и вуза приходится заниматься техническим рисованием. И даже если чертеж представляется совсем ясно и четко, для многих людей перенос его из "головы" на бумагу является довольно непростым делом. Помочь в этом могут разнообразные графические редакторы, например, GeoGebra — свободно распространяемая графическая и вычислительная система для изучения и преподавания математики в школах.

Но существует и иной подход. Геометрические чертежи можно создавать, используя систему TikZ [2], являющуюся пакетом расширений TEX/LTEX. С помощью TikZ, не выходя из LTEX, и не прибегая к сторонним графическим редакторам, легко пишется код для вывода как простых, так и весьма сложных схем, диаграмм, графиков и геометрических чертежей.

В предлагаемой статье обсуждаются характерные особенности написания фрагментов кода TikZ для вывода чертежей при решении типовых задач планиметрии, связанных с замечательными точками в треугольнике. А именно, при создании геометрических чертежей часто по тем или иным данным приходится вычислять и выводить замечательные точки треугольников, к которым относятся: "центроид (центр масс, центр тяжести)" — точка пересечения медиан, "ортоцентр" — точка пересечения высот, "центр описанной окружности" — точка пересечения "серединных" перпендикуляров (перпендикуляров к серединам сторон треугольника), "инцентр" — центр вписанной окружности, являющийся точкой пересечения биссектрис. Ниже показывается, как вычисляются и выводятся эти точки с помощью tikz-кода. Рассмотрены также коды для решения ряда вспомогательных задач таких, как проведение: биссектриссы угла; прямой, проходящей через заданную точку параллельно другой прямой; окружности с центром в конкретной точке, касающейся заданной прямой и т. п.

Ключевые слова: TEX, MEX, TikZ, GeoGebra.

Библиография: 2 названия.

1Работа выполнена по гранту РФФФ № 15-01-01540а.

THE CREATION OF THE GEOMETRICAL DRAWINGS IN TikZ

N. M. Dobrovolsky, A. R. Esayan

Abstract

When solving geometric problems, writing manuals and books on geometry for secondary school and University we have to deal with technical drawings. And even if the drawing is represented quite clearly, move its from the "head" to a paper is quite difficult for many people. To this can help a variety of graphic editors, for example, GeoGebra — the free system of a graphics and calculations which is used for study and teaching of mathematics in schools.

However, there is another approach. Geometric drawings can be created using the TikZ system [2], which is an extension package of TeX/LTeX. Using TikZ, not walking out of LTEX, and without resorting to third-party graphical editors, easily write code to output both simple and very complex diagrams, charts, graphs and geometrical drawings.

The article discusses the specific of writing code of fragments TikZ to output the drawings for solving typical tasks on planimetry associated with remarkable points in a triangle. Namely, when creating some geometric drawings on those or other data often necessary to calculate and display remarkable points of a triangle, which include: "the centroid (center of mass, centre of gravity)" — the point of intersection of medians; "the orthocenter" — the point crossing heights; "the circle circumscribed around triangle" — the point of intersection "middle" perpendiculars (perpendicular to the midpoints of the sides of the triangle); "the incenter" — the center of the inscribed circle, which is the point of intersection of the bisectors. The following shows how are calculated and returned these points with tikz-code. Also discussed codes for the solution of some auxiliary tasks such as conducting: bisector of an angle; a line which passing through the given point and parallel to the line; a circle with a center at a particular point tangent to a given straight line, etc.

Keywords: TEX, LTX, TikZ, GeoGebra.

Bibliography: 2 titles.

1. Введение

При выводе геометрических чертежей часто по различным данным приходится вычислять и выводить замечательные точки треугольников, к которым относятся:

• центроид (центр масс, центр тяжести) — точка пересечения медиан;

• ортоцентр — точка пересечения высот;

• центр описанной окружности — точка пересечения "серединных" перпендикуляров (перпендикуляров к серединам сторон треугольника);

• инцентр — центр вписанной окружности, являющийся точкой пересечения биссектрис.

Ниже показывается, как вычисляются и выводятся эти точки с помощью ¿¿кг-кода. Рассмотрены также примеры решения ряда вспомогательных задач.

2. Центроид

с

Если A, B и C — вершины треугольника ABC, то центроид M можно найти по формуле ($ (A) 1.5! (B) !1/3! (C) $), которая означает следующее. Берется точка X = ($(A) !.5! (B)$), делящая отрезок AB пополам, и на медиане XC находится точка M = ($ (X) !1/3! (C) $), делящая ее в отношении 1:2. В нашем случае △ABC вместе с координатной сеткой выводится макросом \tria. Далее находится центроид и именуется буквой M. Наконец, точка M соединяется с каждой из вершин △ABC. \usetikzlibrary{calc} \newcommand{\tria}{ \draw[help lines](0,0) grid (3,3); \coordinate[label=left:$A$] (A)at(0,0); \coordinate[label=right:$B$](B)at(3,1); \coordinate[label=above:$C$](C)at(1,3); \draw (A)--(B)--(C)--cycle;} \begin{tikzpicture} \tria

\node[fill=teal, circle, inner sep=2pt, label=above right:$M$]

at ($(A)!.5!(B)!1/3!(C)$) {}; \draw (A)--(M)--(B) (M)--(C); \end{tikzpicture}

A

M

B

3. Ортоцентр

Здесь △АБС выведен макросом \tria, определенным в I. Далее, находятся ортогональная проекция Д точки А на сторону СБ и ортогональная проекция Е точки С на сторону АБ. Ортоцентр является точкой пересечения прямых АД и СЕ. Для его нахождения отрезки АД и СЕ получают соответственно имена Н1 и Н2. По ним и определяется точка О пересечения АД и СЕ. Последней командой \node полученный ортоцентр выводится в виде небольшого темно-зеленого кружка вместе с надписью О.

%\usetikzlibrary{calc, intersections} \begin{tikzpicture} \tria

\node[fill=red, circle, inner sep=2pt, label= right:$D$]

at

at ($ (A) ! (C) ! (B) $) {}; \draw [name path=h1] (A)--(D); \draw [name path=h2] (C)--(E); \draw [name intersections= {of=h1 and h2, by=O}]; \node[fill=teal, circle, inner sep=2pt,

label=right:$O$] at (O) {}; \end{tikzpicture}

4. Прямая, проходяшая через точку || другой прямой

Считаем, что прямая AB задана парой несовпадающих точек A и B и через точку C требуется провести прямую, параллельную AB. Для того чтобы построить требуемую прямую, на ней достаточно отыскать еще одну точку T, отличную от C. А сделать это можно последовательностью действий, описание которых приведено слева от рисунка:

• найти ортогональную проекцию P точки C на прямую AB: P = ($ (A) ! (C) ! (B) $);

• найти точку S, являющуюся серединой отрезка CP: S = ($(C)!0.5!(P)$);

• найти на прямой AS такую точку T, чтобы отрезки AS и ST оказались равными: T = ($(A)!2!(S)$);

• соединить точки (T) и ($(C)!-1!(T)$) отрезком. Последняя точка находится на A прямой CT на таком же расстоянии от C, как и T, но с другой ее стороны.

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

\usetikzlibrary{calc} \begin{tikzpicture}

\draw[help lines](0,0) grid (3,3); \coordinate[label=left:$A$] (A) at (0,0); \coordinate[label=right:$B$] (B) at (3,1); \coordinate[fill=red, circle, inner sep=2pt,

label=above:$C$] (C) at (1,3); \draw (A)--(B);

\coordinate[fill=teal, circle, inner sep=2pt, label=above:$T$]

at ($(A)!2!($(C)!0.5!($(A)!(C)!(B)$)$)$); \draw (T)--($(C)!-1!(T)$); \end{tikzpicture}

T

B

Л^

Другой вариант решения данной задачи получается, если вторую точку Т на искомой прямой находить как образ точки Р при повороте отрезка СР вокруг точки С на 90°: Т = ($ (С) !1!90: (Р) $). Соответствующий код можно сформировать из предыдущего кода, заменив в его последней команде \coordinate фрагмент после слова на ($(С) !1!90:($(А)! (С) ! (В)$)$) ;.

5. Медиатрисса

Отрезок ЛВ задан двумя точками Л и В. Провести серединный перпендикуляр к отрезку ЛВ. Решить задачу можно следующей последовательностью действий:

• найти точку Т как образ В при повороте отрезка ЛВ вокруг точки Л на 60°: Т = ($(А)!1!60:(В)$);

• соединить точки (Л)и(В); Л

• соединить точку Т с ее ортогональной проекцией Б на отрезок ЛВ; Б В

/ / / /

/ /

Поскольку не обязательно выводить все вспомогательные линии и точки, то код и вывод по нему могут быть, например, такими:

\usetikzlibrary{calc} \begin{tikzpicture}[

sty/.style={f ill=teal, /

circle, inner sep=2pt}] \draw[help lines](0,0) grid (3,3); \coordinate[sty,label=left:$A$]

(A) at (0,2); A \coordinate[sty,label=right:$B$]

(B) at (3,1); \draw (A)--(B);

\coordinate (T) at ($(A)!1!60:(B)$); \draw [dashed] (T)--($(A)!(T)!(B)$); \end{tikzpicture}

B

6. Центр описанной окружности

В треугольнике ABC найти центр описанной окружности и провести эту окружность. Нам достаточно провести серединные перпендикуляры к двум сторонам треугольника и найти точку их пересечения. Сделать это можно так, как это описано в предыдущем примере. Код для решения задачи может быть следующим:

\usetikzlibrary{calc, intersections} \begin{tikzpicture}[ sty/.style={fill=teal, circle, inner sep=2pt}] \coordinate[sty,label=left:$A$] (A) at (0,0); \coordinate[sty,label=right:$B$](B) at (3,1); \coordinate[sty,label=above:$C$] (C) at (1,3); \draw (A)--(B)--(C)--(A);

\coordinate (T) at ($(A)!1!60:(B)$); \draw [name path=h1, dashed]

(T) -- ($ (A) ! (T) ! (B) $) ; \coordinate (T) at ($(B)!1!60:(C)$); \draw [name path=h2, dashed]

in circle ({veclen(\x1,\y1)}); \end{tikzpicture}

B

A

Дадим пояснения к коду:

1. по трем начальным командам \coordinate именуются и выводятся вместе с надписями три точки A, B, C — вершины треугольника;

2. \draw (A)--(B)--(C)--(A) —рисуется треугольник;

3. \coordinate (T) at ($(A)!1!60:(B)$) —определяется, но не выводится, точка T как образ B при повороте отрезка AB на 60° вокруг точки A;

4. \draw [name path=h1, dashed] (T)--($(A)!(T)!(B)$) — выводится серединный перпендикуляр к AB. Он получает имя hi;

5. \coordinate (T) at ($(B)!1!60:(C)$) —определяется, но не выводится, точка T как образ C при повороте отрезка BC на 60° вокруг точки B;

6. \draw [name path=h2, dashed] (T)--($(B)!(T)!(C)$) — выводится серединный перпендикуляр к BC. Он получает имя h2;

7. \draw [name intersections={of=h1 and h2, by=O}] — находится точка O пересечения серединных перпендикуляров к AB и BC;

8. \node[sty, label=right:$O$] at (O) {} — выводится точка O в виде небольшого темно-зеленого кружка и ее надпись;

9. последней командой \draw с использованием оператора /et выводится окружность, описанная около AABC.

7. Вспомогательные задачи

Точки в задачах A-C заданы своими абсолютными координатами. Задача A. Заданы две точки O и A. Нарисовать окружность с центром в точке O, проходящую через точку A.

Решение задачи A. Здесь известен центр окружности, а ее радиус можно вычислить по точкам O и A c помощью оператора /et. Это и делается приведенным ниже кодом. В нем при определении стиля sty используется неопределенный параметр #1 для раскраски точек O и A разными цветами. \usetikzlibrary{calc}

\begin{tikzpicture}[scale=0.6,

sty/.style={fill=#1, circle, inner sep=2pt}] \draw[help lines](0,0) grid (3,3); \coordinate[sty=teal, label=left:$O$]

(O) at (0,0); \coordinate[sty=red, label=right:$A$]

(A) at (3,1); \draw (A)--(O) let \p1=($(O)-(A)$) in circle ({veclen(\x1,\y1)}); \end{t ikzpi cture}

A

Заметим, что имеется библиотека through, в которой определена единственная опция circle through. Если данная библиотека открыта (\usetikzlibrary {through}), то ту же самую задачу мы могли бы решить предыдущим кодом, заменив в нем последнюю команду \draw следующими командами:

\node [draw, circle through={(A)}] at (O) {}; \draw (A)--(O); .

Задача B. Задана точка O и прямая AB двумя точками A и B. Нарисовать окружность с центром в точке O, касающуюся линии AB. Решение задачи B. Решать задачу можно так:

1. определить имена O, A, B точек по их абсолютным координатам и вывести эти точки вместе с надписями;

2. найти ортогональную проекцию L точки O на прямую AB, и вывести точку L вместе с надписью;

3. соединить отрезками точку L с точками A, B и O (необязательно);

4. используя оператор let, провести окружность с центром в O, проходящую через точку L.

Код, реализующий указанные действия, представлен ниже. Вывод показан при различных положениях точки O: (0,1), (0,4), (2,-1) и (1,5).

\usetikzlibrary{calc} \begin{tikzpicture}[scale=0.7,

sty/.style={fill=teal, circle, inner sep=2pt}] \draw[help lines](0,0) grid (3,3); \coordinate[sty, label=left:$O$] (O) at (0,1); \coordinate[sty, label=right:$A$] (A) at (3,1); \coordinate[sty, label=right:$B$] (B) at (1,3);

\coordinate[sty, fill=red, label=right:$L$]

at

in circle ({veclen(\x1,\y1)}); \end{tikzpicture}

A

(O)=(0,4) O • L

A

Задача C. Заданы две точки A и B. Нарисовать равносторонний треугольник ABC, одна из сторон которого является отрезком AB.

Решение задачи C. Возможным решением задачи может служить такой код:

\usetikzlibrary{calc, intersections} \begin{tikzpicture}[scale=0.7]

\draw[help lines](0,0) grid (3,3); \coordinate[label=left:$A$] (A) at (0,2); \coordinate[label=right:$B$] (B) at (3,1); \path [name path=h1, draw]

let \p1=($(A)-(B)$), \n1={veclen(\x1,\y1)} in (A) circle (\n1); \path [name path=h2, draw]

let \p1=($(A)-(B)$), \n1={veclen(\x1,\y1)} in (B) circle (\n1); \draw [name intersections={of=h1 and h2, by=C}]; \draw [fill=yellow, opacity=0.5] (A)--(C)--(B)--cycle; \coordinate[label=above:$C$] (C) at (C); \foreach \t in {A,B,C}{

\coordinate[fill=teal, circle, inner sep=2pt] (\t) at (\t) ;} \end{tikzpicture}

Дадим краткий комментарий к коду:

1. первыми двумя командами \coordinate заданные точки получают имена A и B и такие же надписи. Надписи выводятся;

2. первой командой \path проводится окружность с центром в точке A и радиусом AB. Эта окружность получает имя hi;

3. второй командой \path проводится окружность с центром в точке B и радиусом AB. Эта окружность получает имя h2;

4. \draw [name intersections={of=h1 and h2, by=C}] —находится, получает имя C и выводится одна из точек пересечения окружностей;

5. \draw[fill=yellow, opacity=0.5] (A)--(C)--(B)--cycle — рисуется требуемый равносторонней треугольник и заполняется желтым цветом с непрозрачностью 0.5;

6. \coordinate[label=above:$C$] (C) at (C) —точка c именем C получает надпись C, которая и выводится;

7. \foreach ... — вершины треугольника выводятся небольшими кружками темно-зеленого цвета.

Рассмотрим еще один вариант решения задачи, не требующий подключения библиотеки intersections. Точку C можно определить как образ точки A при вращении отрезка BA вокруг точки B на угол -60° (на 60° по часовой стрелке), то есть C — это точка ($ (B) ! 1 ! -60 : (A)$). Далее все очевидно.

\usetikzlibrary{calc}

\begin{tikzpicture}[scale=0.7]

\draw[help lines]

at ($ (B) ! 1 ! -60 : (A) $) ; \draw [fill=yellow, opacity=0.5]

(A)--(C)--(B)--cycle ; \foreach \t in {A,B,C}{\coordinate[fill=teal, circle, inner sep=2pt] (\t) at (\t);}

\end{tikzpicture}

8. Биссектриса угла

Задан угол ACB двумя сторонами CA и CB. Провести биссектрису этого угла. Решить задачу можно следующей последовательностью действий:

1. найти точку S на прямой CA такую, чтобы CS = rcm (например, r = 2): S = ($(C)!2cm!(A)$);

2. найти точку T на прямой CB такую, чтобы CT = rcm:

T = ($(C)!2cm!(B)$);

3. найти точку L — середину отрезка ST;

C

A

\ \ \

\ L

B

4. соединить точку C c L. CL и есть биссектриса ZACB.

Поскольку необязательно выводить все вспомогательные линии и точки, то код и вывод по нему могут быть, например, такими: \begin{tikzpicture}[

sty/.style={fill=teal, circle, inner sep=2pt}] \draw[help lines](0,0) grid (3,3); \coordinate[sty, label=left:$A$] (A) at (0,0); \coordinate[sty, label=above right:$B$] (B) at (5,1); \coordinate[sty, label= above:$C$] (C) at (1,3); \draw (A)--(C)--(B) ;

\draw[dashdotted] (C)--($($(C)!3cm!(A)$)!0.5!($(C)!3cm!(B)$)$); \end{t ikzpi cture}

A

B

9. Инцентр

В треугольнике ABC найти центр O вписанной окружности, соединить O с вершинами △ABC, опустить из O перпендикуляры на стороны △ABC и вывести вписанную окружность:

Все перечисленные действия можно реализовать по такому коду:

\usetikzlibrary{calc, intersections, through} \begin{tikzpicture}[

sty/.style={fill=teal, circle, inner sep=2pt}] \def\r{5}

\draw[help lines](0,0) grid (3,3); \coordinate[sty, label=left:$A$] (A) at (0,0); \coordinate[sty, label=above right:$B$] (B) at (5,1); \coordinate[sty, label=above:$C$] (C) at (1,3); \draw (A)--(C)--(B)--(A); \path[name path=h1]

(C)--($($(C)!\r cm!(A)$)!0.5!($(C)!\r cm!(B)$)$); \path[name path=h2]

(A)--($($(A)!\r cm!(C)$)!0.5!($(A)!\r cm!(B)$)$); \draw[name intersections={of=h1 and h2, by=O}]; \node[sty, label=below right:$O$] at (O) {}; \coordinate (X) at ($(A)!(O)!(B)$); \coordinate (Y) at ($(A)!(O)!(C)$); \coordinate (Z) at ($(B)!(O)!(C)$); \node [draw, circle through={(X)}] at (O) {}; \foreach \t in {A,B,C}{\draw[dashdotted] (O)--(\t);} \foreach \t in {A,B,C,O,X,Y,Z}{\coordinate [sty] (\t) at (\t);} \foreach \t in {X,Y,Z}{\draw (O)--(\t);} \end{tikzpicture}

C

A

Получить решение задачи можно построением биссектрис двух углов треугольника. Далее остается лишь найти точку их пересечения. Как проводить биссектрисы углов, описано в предыдущем пункте. Однако необходимо позаботиться о том, чтобы отрезки (тропы), представляющие биссектрисы, пересекались. Для этого мы должны строить их достаточно протяженными. Кратко опишем представленный выше код:

1. ^е^г{5} —определяет макрос \г, равный 5. Именно это значение \г (в сантиметрах) мы и откладываем на сторонах угла при построении биссектрис. Величина г должна быть достаточной для того, чтобы тропы, представляющие биссектрисы, пересекались;

2. первыми тремя командами \coordinate заданные точки получают имена A, B и C и такие же надписи. И точки, и надписи выводятся;

3. \draw (A)- -(C)--(B)- -(A) —рисуется AABC;

4. следующие две команды \path определяют, но не выводят, отрезки для биссектрис ABAC и AACB и задают им имена hl и h2 соответственно;

5. команда \draw[name intersections={of=h1 and h2, by=O}] определяет, но не выводит, точку O пересечения биссектрис;

6. команда \node[sty, label=below right:$O$] at (O) {} выводит точку O и ее надпись;

7. следующие три команды \coordinate определяют ортогональные проекции X, Y и Z точки O на стороны треугольника;

8. команда \node[draw, circle through={(X)}] at (O) {} выводит требуемую вписанную окружность;

9. первой командой \foreach точка O соединяется штрих-пунктирными линиями с вершинами треугольника (биссектрисы углов);

10. второй командой \foreach точки A, B, C, O, X, Y, Z рисуются в виде небольших кружков темно-зеленого цвета;

11. третьей командой \foreach точка O соединяется со своими ортогональными проекциями X, Y, Z на стороны треугольника.

10. Заключение

Из представленного материала вытекает, что средства графического пакета TikZ, встроенного в научно-издательскую систему TeX/LTeX, позволяют достаточно просто писать код для формирования и вывода чертежей геометрических задач планиметрии и с успехом могут быть использованы для создания качественных рисунков при написании соответствующих курсовых работ, дипломных работ, диссертаций, пособий, монографий и книг.

СПИСОК ЦИТИРОВАННОЙ ЛИТЕРАТУРЫ

1. http://www.ctan.org/pkg/ - перечень пакетов расширений LaTeX хранилища

CTAN

2. Tantau T. TikZ and PGF Packages, manual for Version 3.0 / Till Tantau, Dec.

20, 2013. p. 1165, http://www.ctan.org/pkg/pgf

REFERENCES

1. http://www.ctan.org/pkg/ - перечень пакетов расширений LaTeX хранилища CTAN

2. Tantau T. TikZ and PGF Packages, manual for Version 3.0 / Till Tantau, Dec. 20, 2013. p. 1165, http://www.ctan.org/pkg/pgf

Тульский государственный педагогический университет им. Л. Н. Толстого Поступило 24.03.2015