Вводные понятия в TIKZ

Базовые понятия TIKZ и описание системы координат. Без этого урока разбираться в TIKZ бессмысленно

Подключение 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}

Tree

И еще с шариками, а 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}

boll

Графы

Нужна своя библиотека graphs

\usetikzlibrary {graphs}
\tikz \graph [grow down, branch left] {
  root -> { 
left,
2,3 ->{
  5,6,7,8 ->{
      11,12,13},
    9}, 
right -> {
  child, 
  child} }
};

graph

Тема с графом тоже интересна.

grow — куда растем, указать сторону

branch — в какую сторону ветви раскидать

\usetikzlibrary {graphs.standard}
\tikz \graph [clockwise] { subgraph K_n [n=9] };

Уж очень он мне понравился. Библиотеку обязательно отдельно всю опишу.

graph

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}

line

Еще 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); — установит смещение от базовой линии. По умолчанию строго по центру.

cir

А вот так перечеркнем слово

\usetikzlibrary {shapes.misc}
Hello
\tikz[baseline=(X.base)]
  \node [cross out,draw] (X) {world.};

cross

Назначение своего стиля

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}

yellow

Нарисовал 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}

xyz

Система координат 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);

radius

Специальные слова для указания угла

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}

rotate

Барицентрические системы координат

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

Для понимания процесса barycentric, каждая координата тянет к себе с определенной силой. Если я поставлю с одинаковой силой, то будет ровно посередине, относительно всех точек.

\node at (barycentric cs:content=1,structure=1 ,form=1) {PostScript}; как на рисунке ниже barycentric

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);

red

Нарисуем вторую линию синего цвета

\draw [blue] (node cs:name=ellipse,anchor=north) |- (0,1);

red

Нарисуем стрелку черногго цвета

\draw [arrows = -{Triangle[open, angle=60:3mm]}]
       (node cs:name=rect,anchor=north)
    |- (0,1) -| (node cs:name=shape,anchor=south);

red

А эта штука соединяет между собой две ноды по бордюру самым коротким путем: (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)
            ;

rext

Для те, кто в танке, чтобы не забыть: +(координаты) — не изменяет точку отсчета и указывает относительную координату; ++(координаты) — изменяет точку отсчета и указывает относительные координаты; (координаты) — изменяет точку отсчета и указывает абсолютные координаты.

\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}

rext

\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}

rext

Что здесь примечательного?

  1. Все ноды рисуются в один присест, просто перечисляем через слово node и вначале подставляем координаты.
  2. Линии рисуем отдельными командами через \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}

rext

Создание собственной системы координат

Требует отдельного изучения, если вдруг понадобится

Или создать 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}

intersec

Ключи 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}

rect

Ключевое слово 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}

arc

До меня дошло, когда нарисовал сетку координат

[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}

flow

\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}

zmey

Модифаеры могут быть по нескольку штук дляг за другом

\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}

dim

⟨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}

pr

Перпендикуляры

Основные команды это:

  • /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}

perprn

или такой

\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.

perprn