Вводные понятия в TIKZ
Categories:
Подключение TIKZ в документ.
Для подключения TIKZ нужно в преамбуле добавить:
\usepackage{tikz} %подключить пакет
\usetikzlibrary {angles,calc,quotes} %подключить нужные библиотеки
Библиотеки по ходу буду тоже описывать, те, которые мне точно понравились и нужны. Но их очень много.
Чтобы вставить в текст объект TIKZ нужно использовать окружение
\begin{tikzpicture}
...
\end{tikzpicture}
или
\tikz ...
Координаты в TIKZ
Обычные координаты
(X, Y)
— разделитель запятая.
Измеряем либо в стандартных единицах TeX (cm, pt). По умолчанию PGF использует сантиметр: X -> вправо, Y -> вверх.
(30:1cm)
— полярные координаты. Т.е. от текущей точки на 1см 30 градусов.
Для трехмерных объектов (1,1,1)
Якорные координаты
У каждого объекта есть свои якорные координаты,связанные со сторонами света:
например: first node.north
- north
- south
- east
- west
И их возможные комбинации: node.north west
Относительные координаты
Нужно перед указанием координат поставить ++ и указать относительное смещение ++(1cm,0pt)
— вправо на 1см.
Но для этого нужно знать, где сейчас находится курсор.
Как выяснил, команда \node
не изменяет текущую координату.
Если использовать один +
перед координатами, то перемещение произойдет, но текущая координата не сменится.
(1,0) +(1,0) +(0,1) даст три точки (1,0), (2,0), (1,1).
Специальный синтаксис для PATH
PATH
— водит пером по бумаге, но не оставляет следов, если его не попросить специально.
--
— прямая линия
-|
— горизонтально + вертикально
|-
— вертикально + горизонтально
cycle
— вернуться в точку старта
PATH может:
- draw — рисовать линию
- fill — заполнять пространство
- shade — градиент
- clip — вырезать
Так же доступны комбинации с ними.
\path (0,0) rectangle (2ex,1ex); % ничего визуального не произойдет
\path[draw] (0,0) rectangle (2ex,1ex); % появится рамка
\path[fill=black] (0,0) rectangle (2ex,1ex); % появится черный прямоугольник
Для этих случаев есть сокращенные команды:
\path[draw]
=\draw
\path[fill]
=\fill
\path[fill,draw]
=\filldraw
\path[shade]
=\shade
\path[shade,draw]
=\shadedraw
\path[clip]
=\clip
\path[clip,draw]
=\draw[clip]
Вставка текста
Текст добавляем с помощью команды \node
прямо в синтаксис \path
\tikz \draw (1,1) node {text} -- (2,2);
У node
могут быть:
(name) или [name=имя] [другие опции] {текст}
опции node:
- rectangle
- fill
- circle
- draw
- ellipse
и т.д. это то, что будет нарисовано вокруг текста.
Рисуем деревья
Это такая умная \node
с поднодиками.
\begin{tikzpicture}
\node {root}
child {node {left}}
child {node {right}
child {node {child}}
child {node {child}}
};
\end{tikzpicture}
Подключаем библиотеку со стрелочками и оформим стили.
FORK — это вилка, которой будем соединять вниз (down),также можно написать up, left, right и от этой стороны будет выходить стрелка.
\usetikzlibrary {arrows.meta,trees}
\begin{tikzpicture}
[edge from parent fork down, sibling distance=15mm, level distance=15mm,
every node/.style={fill=red!30,rounded corners},
edge from parent/.style={red,-{Circle[open]},thick,draw}]
\node {root}
child {node {left}}
child {node {right}
child {node {child}}
child {node {child}}
};
\end{tikzpicture}
И еще с шариками, а grow — покажет куда расти дереву (up,down,left,right или north,south,east,west). Anchor — это куда прицепляться parent и child.
sibling — ширина плечика на одном уровне, level — это расстояние между уровнями.
every node/.style — назначает стиль глобально для всех node без указания класса.
edge — это собственно само ребро или соединение
ball — это еще одна разновидность фигуры, шарик называется.
\begin{tikzpicture}
[parent anchor=east,child anchor=west,grow=east,
sibling distance=15mm, level distance=15mm,
every node/.style={ball color=red,circle,text=white},
edge from parent/.style={draw,dashed,thick,red}]
\node {root}
child {node {left}}
child {node {right}
child {node {child}}
child {node {child}}
};
\end{tikzpicture}
Графы
Нужна своя библиотека graphs
\usetikzlibrary {graphs}
\tikz \graph [grow down, branch left] {
root -> {
left,
2,3 ->{
5,6,7,8 ->{
11,12,13},
9},
right -> {
child,
child} }
};
Тема с графом тоже интересна.
grow — куда растем, указать сторону
branch — в какую сторону ветви раскидать
\usetikzlibrary {graphs.standard}
\tikz \graph [clockwise] { subgraph K_n [n=9] };
Уж очень он мне понравился. Библиотеку обязательно отдельно всю опишу.
SCOPE
Это внутреннее окружение для группировки настроек.
Это фактически зона видимости.
\begin{tikzpicture}
\begin{scope}[color=red]
\draw (0mm,10mm) -- (10mm,10mm);
\draw (0mm, 8mm) -- (10mm, 8mm);
\draw (0mm, 6mm) -- (10mm, 6mm);
\end{scope}
\begin{scope}[color=green]
\draw (0mm, 4mm) -- (10mm, 4mm);
\draw (0mm, 2mm) -- (10mm, 2mm);
\draw[color=blue] (0mm, 0mm) -- (10mm, 0mm);
\end{scope}
\end{tikzpicture}
Еще SCOPE умеет
/tikz/name=⟨scope name⟩ /tikz/every scope /tikz/execute at begin scope=⟨code⟩ /tikz/execute at end scope=⟨code⟩
И у нее есть даже библиотека \usetikzlibrary{scopes}
Когда библиотека загружена, то можно просто указать фигурные скобки, без begin/end
А еще становится доступной команда \scoped ⟨animations spec⟩[⟨options⟩]⟨path command⟩
\usetikzlibrary {scopes}
\begin{tikzpicture}
{ [ultra thick]
{ [red]
\draw (0mm,10mm) -- (10mm,10mm);
\draw (0mm,8mm) -- (10mm,8mm);
}
\draw (0mm,6mm) -- (10mm,6mm);
}
{ [green]
\draw (0mm,4mm) -- (10mm,4mm);
\draw (0mm,2mm) -- (10mm,2mm);
\draw[blue] (0mm,0mm) -- (10mm,0mm);
}
\end{tikzpicture}
\usetikzlibrary {backgrounds}
\begin{tikzpicture}
\node [fill=white] at (1,1) {Hello world};
\scoped [on background layer]
\draw (0,0) grid (3,2);
\end{tikzpicture}
Опции
\tikzset
— установит в переменную любую команду для применения в окружении \begin{tikzpicture}
baseline
— еще можно задать с помощью координаты, тоже поймет.
\tikz[baseline=0pt]\draw(0,0)circle(.5ex);
— установит смещение от базовой линии. По умолчанию строго по центру.
А вот так перечеркнем слово
\usetikzlibrary {shapes.misc}
Hello
\tikz[baseline=(X.base)]
\node [cross out,draw] (X) {world.};
Назначение своего стиля
my style/.style={draw=red,fill=red!20}
Использование стилей
\begin{tikzpicture}[help lines/.style={blue!50,very thin}]
\draw (0,0) grid +(2,2);
\draw[help lines] (2,0) grid +(2,2);
\end{tikzpicture}
Чтобы добавить настройки к существующему стилю /.append style
вместо style
Стили с переменными
\begin{tikzpicture}[outline/.style={draw=#1,thick,fill=#1!50}]
\node [outline=red] at (0,1) {red};
\node [outline=blue] at (0,0) {blue};
\end{tikzpicture}
или задать значение по умолчанию
\begin{tikzpicture}[outline/.style={draw=#1,thick,fill=#1!50},
outline/.default=black]
\node [outline] at (0,1) {default};
\node [outline=blue] at (0,0) {blue};
\end{tikzpicture}
/tikz/execute at begin picture=⟨code⟩
Выполнит код до того как начал рисовать картину
/tikz/execute at end picture=⟨code⟩
Выполнит код после того как нарисовал картину
\usetikzlibrary {backgrounds}
\begin{tikzpicture}[execute at end picture=%
{
\begin{pgfonlayer}{background}
\path[fill=yellow,rounded corners]
(current bounding box.south west) rectangle
(current bounding box.north east);
\end{pgfonlayer}
}]
\node at (0,0) {X};
\node at (2,1) {Y};
\end{tikzpicture}
Нарисовал X и Y, а потом подрисовал фон желтого цвета.
Установка глобального стиля /tikz/every picture
В преамбуле напишем \tikzset{every picture/.style=semithick}
или если несколько значений, то \tikzset{every picture/.style={line width=1pt}}
Библиотека \usetikzlibrary{babel}
Для работы со шрифтами,рекомендуется всегда загружать эту библиотеку.
Specifying Coordinates
Или поговорим о координатах.
([⟨options⟩]⟨coordinate specification⟩)
Три вида координат:
- декартовы
- полярные
- сферические
Явное указание координат и неявное указание.
Декартова система координат CANVAS
/tikz/cs/x=⟨dimension⟩
/tikz/cs/y=⟨dimension⟩
Система координат XYZ
Все тоже, только xyz
\begin{tikzpicture}[->]
\draw (0,0) -- (xyz cs:x=1);
\draw (0,0) -- (xyz cs:y=1);
\draw (0,0) -- (xyz cs:z=1);
\end{tikzpicture}
Система координат canvas polar
/tikz/cs/angle=⟨градусы⟩ — Угол координаты. Угол всегда должен быть указан в градусах.
/tikz/cs/radius=⟨размер) — Расстояние от текущей точки
/tikz/cs/x radius=⟨размер⟩ /tikz/cs/y radius=⟨размер⟩
\tikz \draw (0cm,0cm) -- (30:1cm) -- (60:1cm) -- (90:1cm)
-- (120:1cm) -- (150:1cm) -- (180:1cm);
Специальные слова для указания угла
up, down, left, right, north, south, west, east, north east, north west, south east, south west
Система координат XYZ POLAR
\begin{tikzpicture}[x=1.5cm,y=1cm]%масштаб системы координат
\draw[help lines] (0cm,0cm) grid (3cm,2cm);
\draw (0,0) -- (xyz polar cs:angle=0,radius=1);
\draw (0,0) -- (xyz polar cs:angle=30,radius=1);
\draw (0,0) -- (xyz polar cs:angle=60,radius=1);
\draw (0,0) -- (xyz polar cs:angle=90,radius=1);
\draw (xyz polar cs:angle=0,radius=2)
-- (xyz polar cs:angle=30,radius=2)
-- (xyz polar cs:angle=60,radius=2)
-- (xyz polar cs:angle=90,radius=2);
\end{tikzpicture}
\begin{tikzpicture}[x={(-1cm,0cm)},y={(0cm,-1cm)}] %переворачиваю систему координат
\draw[help lines] (0cm,0cm) grid (3cm,2cm);%рисую сетку
\fill (canvas cs:x=1cm,y=0cm) node[right] {X} circle (2pt);%точка в абсолютных координатах без изменений (черная)
\fill (canvas cs:x=0cm,y=1cm) node[left] {Y} circle (2pt);%точка в абсолютных координатах без изменений (черная)
\fill [color=red] (1,0) node[left]{X'} circle (2pt);%точка в относительных координатах перевернутая (красная)
\fill [color=red] (0,1) node[right]{Y'} circle (2pt);%точка в относительных координатах перевернутая (красная)
\draw [color=red] (0,0) -- (30:1) -- (60:1) -- (90:1)
-- (120:1) -- (150:1) -- (180:1);%рисунок в относительных координатах красный
\end{tikzpicture}
Барицентрические системы координат
barycentric
— это координаты по сторонам света north, south, east, west и их комбинации
\begin{tikzpicture}
\coordinate (content) at (90:3cm);
\coordinate (structure) at (210:3cm);
\coordinate (form) at (-30:3cm);
\node [above] at (content) {content oriented};
\node [below left] at (structure) {structure oriented};
\node [below right] at (form) {form oriented};
\draw [thick,gray] (content.south) -- (structure.north east) -- (form.north west) -- cycle;
\small
\node at (barycentric cs:content=0.5,structure=0.1 ,form=1) {PostScript};
\node at (barycentric cs:content=1 ,structure=0 ,form=0.4) {DVI};
\node at (barycentric cs:content=0.5,structure=0.5 ,form=1) {PDF};
\node at (barycentric cs:content=0 ,structure=0.25,form=1) {CSS};
\node at (barycentric cs:content=0.5,structure=1 ,form=0) {XML};
\node at (barycentric cs:content=0.5,structure=1 ,form=0.4) {HTML};
\node at (barycentric cs:content=1 ,structure=0.2 ,form=0.8) {\TeX};
\node at (barycentric cs:content=1 ,structure=0.6 ,form=0.8) {\LaTeX};
\node at (barycentric cs:content=0.8,structure=0.8 ,form=1) {Word};
\node at (barycentric cs:content=1 ,structure=0.05,form=0.05) {ASCII};
\end{tikzpicture}
Для понимания процесса barycentric, каждая координата тянет к себе с определенной силой. Если я поставлю с одинаковой силой, то будет ровно посередине, относительно всех точек.
\node at (barycentric cs:content=1,structure=1 ,form=1) {PostScript};
как на рисунке ниже
Node координатная система
/tikz/cs/name=⟨node name⟩
/tikz/anchor=⟨anchor⟩
\usetikzlibrary {arrows.meta}
\begin{tikzpicture}[node font=\ttfamily]
\node (shape) at (0,2) [draw] {class Shape};
\node (rect) at (-2,0) [draw] {class Rectangle};
\node (circle) at (2,0) [draw] {class Circle};
\node (ellipse) at (6,0) [draw] {class Ellipse};
\draw [color=red](node cs:name=circle,anchor=north) |- (0,1);
\draw [blue] (node cs:name=ellipse,anchor=north) |- (0,1);
\draw [arrows = -{Triangle[open, angle=60:3mm]}]
(node cs:name=rect,anchor=north)
|- (0,1) -| (node cs:name=shape,anchor=south);
\end{tikzpicture}
\usetikzlibrary {arrows.meta}
— библиотека для красивых стрелочек
\begin{tikzpicture}[node font=\ttfamily]
— назначаем шрифт
Присвоим имена каждой ноде
\node (shape) at (0,2) [draw] {class Shape};
\node (rect) at (-2,0) [draw] {class Rectangle};
\node (circle) at (2,0) [draw] {class Circle};
\node (ellipse) at (6,0) [draw] {class Ellipse};
Нарисуем первую линию красного цвета
\draw [color=red](node cs:name=circle,anchor=north) |- (0,1);
Нарисуем вторую линию синего цвета
\draw [blue] (node cs:name=ellipse,anchor=north) |- (0,1);
Нарисуем стрелку черногго цвета
\draw [arrows = -{Triangle[open, angle=60:3mm]}]
(node cs:name=rect,anchor=north)
|- (0,1) -| (node cs:name=shape,anchor=south);
А эта штука соединяет между собой две ноды по бордюру самым коротким путем: (node cs:name=a) -- (node cs:name=b)
, т.е. все, что в круглых скобках — это координаты.
\usetikzlibrary {shapes.geometric}
\begin{tikzpicture}
\path (0,0) node(a) [ellipse,rotate=10,draw] {An ellipse}
(3,-1) node(b) [circle,draw] {A circle};
\draw[thick] (node cs:name=a) -- (node cs:name=b);
\end{tikzpicture}
А это легкая замена rectangle, чтобы не пересекалось
\tikz \draw (0,0) node(x) [draw] {Text}
% rectangle (1,1)
(node cs:name=x) -- +(0,1) -- +(1,1) -- +(1,0) -- (node cs:name=x)
(node cs:name=x) -- +(1,1)
(node cs:name=x) -- +(1,.5)
(node cs:name=x) -- +(.5,1)
;
Для те, кто в танке, чтобы не забыть: +(координаты) — не изменяет точку отсчета и указывает относительную координату; ++(координаты) — изменяет точку отсчета и указывает относительные координаты; (координаты) — изменяет точку отсчета и указывает абсолютные координаты.
\begin{tikzpicture}
\draw[blue!20] (0,0) grid +(2,2);
\draw (0,0) node(x) [draw] {Text}
(node cs:name=x) -- ++(0,1) -- ++(1,1) -- +(1,0) -- (node cs:name=x);
\end{tikzpicture}
\usetikzlibrary {shapes.geometric}
\begin{tikzpicture}[fill=blue!20]
\draw[help lines] (-1,-2) grid (6,3);
\path (0,0) node(a) [ellipse,rotate=10,draw,fill] {An ellipse}
(3,-1) node(b) [circle,draw,fill] {A circle}
(2,2) node(c) [rectangle,rotate=20,draw,fill] {A rectangle}
(5,2) node(d) [rectangle,rotate=-30,draw,fill] {Another rectangle};
\draw[thick] (a.south) -- (b) -- (c) -- (d);
\draw[thick,red,->] (a) |- +(1,3) -| (c) |- (b);
\draw[thick,blue,<->] (b) .. controls +(right:2cm) and +(down:1cm) .. (d);
\end{tikzpicture}
Что здесь примечательного?
- Все ноды рисуются в один присест, просто перечисляем через слово
node
и вначале подставляем координаты. - Линии рисуем отдельными командами через
\draw
Координатная система TANGENT
Работает только с загруженной библиотекой CALC
Нарисует по касательной от точки (a):
- tangent — система координат
- cs: — сами координаты
- node=c — фигура
- point={(a)} — точка, от которой пойдет касательная
- solution=1 — номер решения, если их несколько
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw[help lines] (0,0) grid (3,2);
\coordinate (a) at (3,2);
\node [circle,draw] (c) at (1,1) [minimum size=40pt] {$c$};
\draw[red] (a) -- (tangent cs:node=c,point={(a)},solution=1) --
(c.center) -- (tangent cs:node=c,point={(a)},solution=2) -- cycle;
\end{tikzpicture}
Создание собственной системы координат
Требует отдельного изучения, если вдруг понадобится
Или создать alias существующей системекоординат
\tikzaliascoordinatesystem{⟨new name⟩}{⟨old name⟩}
https://tikz.dev/tikz-coordinates#sec-13.2.5
Координаты точек пересечения
Библиотека \usetikzlibrary{intersections}
/tikz/name path=⟨name⟩
— задать имя path для поиска пересечения
/tikz/name path global=⟨name⟩
— задает имя path глобально,будет доступно за пределами окружения SCOPE в рисунке
/tikz/name intersections={⟨options⟩}
— поиск точек пересечения путей path
Если несколько точек пересечения им будут заданы координаты intersections-1 и intersections-2 и т.д. сколько получится.
\usetikzlibrary {intersections}
\begin{tikzpicture}[every node/.style={opacity=1, black, above left}]%стиль node подписи в лево вверх
\draw [help lines] grid (3,2);%нарисуем grid
\draw [name path=ellipse] (2,0.5) ellipse (0.75cm and 1cm);%нарисуем элипс и имя path=ellipse
\draw [name path=rectangle, rotate=10] (0.5,0.5) rectangle +(2,1);%нарисуем прямоугольник и имя path=rectangle
\fill [red, opacity=0.5, name intersections={of=ellipse and rectangle}]% найдем точки пересечения двух path
%name intersections --- это команда для поиска пересечений
%of= --- задает path для поиска пересечений
(intersection-1) circle (2pt) node {1}%нарисовать точку в пересечении 1
(intersection-2) circle (2pt) node {2};%нарисовать точку в пересечении 2
\end{tikzpicture}
Ключи intersections
of=
name intersections={of=ellipse and rectangle}
— задает имена path для поиска пересечений
name=
выдаст имена точек пересечения, какие заданы в name
\fill [red, opacity=0.5, name intersections={of=ellipse and rectangle,name=insec}]
(insec-1) circle (2pt) node {1}
(insec-2) circle (2pt) node {2};
total=⟨macro⟩
Создает список всех точек пересечения и сохраняет его в макросе tex по номерам 1,2,3 и т.д.
[name intersections={of=curve 1 and curve 2, name=i, total=\t}]
— сохранит в макросе \t
by={a,b}
присвоит каждой точке свое имя a и b
\fill [name intersections={of=curve 1 and curve 2, by={a,b}}]
(a) circle (2pt)
(b) circle (2pt);
Еще можно использовать нотацию ...
подставит имена автоматически
[name intersections={
of=curve 1 and curve 2,
by={[label=center:a],[label=center:...],[label=center:i]}}]
Относительные и инкрементальные координаты
Это мои любимые + и ++
Дают одинаковый вариант:
++
изменяет текущую координату и премещается относительно
+
не изменяет текущую координату и перемещается относительно
\begin{tikzpicture}
\draw (0,0) -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
\draw (2,0) -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
\draw (1.5,1.5) -- ++(1,0) -- ++(0,1) -- ++(-1,0) -- cycle;
\end{tikzpicture}
\begin{tikzpicture}
\draw (0,0) -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
\draw (2,0) -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
\draw (1.5,1.5) -- +(1,0) -- +(1,1) -- +(0,1) -- cycle;
\end{tikzpicture}
Ключевое слово TURN
\tikz \draw (0,0) -- (1,1) -- ([turn]-45:1cm) -- ([turn]-30:1cm);
Поворачивает ось координат по касательной к последней точке.
\begin{tikzpicture} [delta angle=-180, radius=1cm]
\draw [help lines] (0,0) grid (10,5);
\draw (0,3) arc [start angle=-180] -- ([turn]60:1cm)
arc [start angle=-180] -- ([turn]60:1cm)
arc [start angle=180] -- ([turn]60:1cm);
\end{tikzpicture}
До меня дошло, когда нарисовал сетку координат
[delta angle=-180, radius=1cm]
— параметры дуги: ее угол и радиус, минус говорит, что рисуем по часовой стрелке
[start angle=-180]
— собственно стартовый угол дуги, относительно системы координат — здесь -180 и +180 роли не играет, но -90 и +90 развернут дугу в разные стороны.
– ([turn]60:1cm) — эта штука нарисует отрезок из последней точки но в системе координат именно последней точки. Т.е. 60 градусов она развернет относительно мысленного продолжения arc по касательной.
[current point is local]
Укажет, что внутри фигурных скобок была относительная координата и после выхода из скобок, система координат будет как была до нее.
\begin{tikzpicture}
\draw (0,0) -- ++(1,0) -- ++(0,1) -- ++(-1,0);
\draw[red] (2,0) -- ++(1,0)
{ [current point is local] -- ++(0,1) } -- ++(-1,0);
\end{tikzpicture}
Вычисляемые координаты
Вся мощь библиотеки CALC в расчете координат
($(a) + 1/3*(1cm,0)$)
— вот так берем и изменяем координаты. Не забываем поставить эту конструкцию в $.
([⟨options⟩]$⟨coordinate computation⟩$)
— синтаксис
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (3,2);
\fill [red] ($2*(1,1)$) circle (2pt);
\fill [green] (${1+1}*(1,.5)$) circle (2pt);
\fill [blue] ($cos(0)*sin(90)*(1,1)$) circle (2pt);
\fill [black] (${3*(4-3)}*(1,0.5)$) circle (2pt);
\end{tikzpicture}
Это возможные операции над координатами. Координаты всегда имеют структуру (x,y) и умножение будет происходить над x и y по отдельности.
⟨coordinate⟩!⟨number⟩!⟨angle⟩:⟨second coordinate⟩
(1,2)!.75!(3,4)
— это значит, что координата будет на .75 между точками (1,2) и (3,4)
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (3,2);
\draw (1,0) -- (3,2);
\foreach \i in {0,0.2,0.5,0.9,1}
\node at ($(1,0)!\i!(3,2)$) {\i};
\end{tikzpicture}
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (3,3);
\coordinate (a) at (1,0);
\coordinate (b) at (3,2);
\draw[->] (a) -- (b);
\coordinate (c) at ($ (a)!1! 10:(b) $); % от точки (a) длина !1! --- такая же как (ab) и повернуть на 10 градусов.
\draw[->,red] (a) -- (c);
\fill ($ (a)!.5! 10:(b) $) circle (2pt); % а здесь точку нарисуем
\end{tikzpicture}
Змея для примера
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (4,4);
\foreach \i in {0,0.125,...,2}
\fill ($(2,2) !\i! \i*180:(3,2)$) circle (2pt);
\end{tikzpicture}
Модифаеры могут быть по нескольку штук дляг за другом
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (3,2);
\draw (0,0) -- (3,2);
\draw[red] ($(0,0)!.3!(3,2)$) -- (3,0);
\fill[red] ($(0,0)!.3!(3,2)!.7!(3,0)$) circle (2pt); %как здесь. Нашли точку на одной прямой и о нее ищем на другой.
\end{tikzpicture}
⟨coordinate⟩!⟨dimension⟩!⟨angle⟩:⟨second coordinate⟩
т.е. эта штука вычислит все в миллиметрах и расставит метки по прямой
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (3,2);
\draw (1,0) -- (3,2);
\foreach \i in {0cm,1cm,15mm}
\node at ($(1,0)!\i!(3,2)$) {\i};
\end{tikzpicture}
А эта будет ставить измерения
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (3,2);
\coordinate (a) at (1,0);
\coordinate (b) at (3,1);
\draw (a) -- (b);%нарисуем прямую ab
\coordinate (c) at ($ (a)!.25!(b) $);%найдем точку c
\coordinate (d) at ($ (c)!1cm!90:(b) $);%найдем точку d 90град от cb
\draw [<->] (c) -- (d) node [sloped,midway,above] {1cm};% начертим стрелочки и напишем 1 cm
\end{tikzpicture}
⟨coordinate⟩!⟨projection coordinate⟩!⟨angle⟩:⟨second coordinate⟩
модификаторы проекции
Нарисуем треугольник и опустим перпендикуляры от вершин на противоположные стороны
между !()! укажем вершину в скобках
\usetikzlibrary {calc}
\begin{tikzpicture}
\draw [help lines] (0,0) grid (3,2);
\coordinate (a) at (0,1);
\coordinate (b) at (3,2);
\coordinate (c) at (2.5,0);
\draw (a) -- (b) -- (c) -- cycle;
\draw[red] (a) -- ($(b)!(a)!(c)$);%от a на сторону bc
\draw[orange] (b) -- ($(a)!(b)!(c)$);%от b на сторону ac
\draw[blue] (c) -- ($(a)!(c)!(b)$);%от c на сторону ab
\end{tikzpicture}
Перпендикуляры
Основные команды это:
- /tikz/cs/horizontal line through={(⟨coordinate⟩)}
- /tikz/cs/vertical line through={(⟨coordinate⟩)}
задают вертикальную и горизонтальные линии, но в основном используется синтаксис:
(⟨p⟩ |- ⟨q⟩)
или (⟨q⟩ -| ⟨p⟩).
Для примера: (2,1 |- 3,4) и (3,4 -| 2,1) дадут точку (2,4)
\begin{tikzpicture}
\path (30:1cm) node(p1) {$p_1$} (75:1cm) node(p2) {$p_2$};
\draw (-0.2,0) -- (1.2,0) node(xline)[right] {$q_1$};
\draw (2,-0.2) -- (2,1.2) node(yline)[above] {$q_2$};
\draw[->] (p1) -- (p1 |- xline);
\draw[->] (p2) -- (p2 |- xline);
\draw[->] (p1) -- (p1 -| yline);
\draw[->] (p2) -- (p2 -| yline);
\end{tikzpicture}
или такой
\usetikzlibrary {calc}
\begin{tikzpicture}
\node (A) at (0,1) {A};
\node (B) at (1,1.5) {B};
\node (C) at (2,0) {C};
\node (D) at (2.5,-2) {D};
\draw (A) -- (B) node [midway] {x};
\draw (C) -- (D) node [midway] {x};
\node at ({$(A)!.5!(B)$} -| {$(C)!.5!(D)$}) {X};
\end{tikzpicture}
от одной средней точки возьмем координату X от другой Y и напишем метку X
.