
Дано две линии, я хочу соединить их обе таким образом, чтобы соединительная линия была гладкой. Например, рассмотрим следующую картинку:
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{arrows}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\coordinate (v1) at (0,0);
\coordinate (v2) at (2,0);
\coordinate (v3) at (4,2);
\coordinate (v4) at (4,4);
\draw[fill, black] (v1) circle[radius=1pt];
\draw[fill, black] (v2) circle[radius=1pt];
\draw[fill, black] (v3) circle[radius=1pt];
\draw[fill, black] (v4) circle[radius=1pt];
\draw (v1)--(v2);
\draw (v3)--(v4);
\draw (2,2) circle(2);
\end{tikzpicture}
\end{document}
Меня на самом деле интересует только четверть круга, соединяющая две линии. Но у меня возникли проблемы
- Удаляем остальные 75% круга и, что более важно,
- Как вычислить такую линию для неперпендикулярных прямых.
Я пробовал использовать \draw[bend left]
, но это не всегда обеспечивает гладкое соединение. Кто-нибудь знает лучший подход?
решение1
Именно это и controls
делает команда: плавно присоединяясьКривые Безье, независимо от того, перпендикулярны эти сегменты или нет. Также вы можете изменить скалярный фактор .5
, .8
, 1.5
, и т. д. для управления силами стрельбы.
(A).. controls +(P) and +(Q) .. (B)
что эквивалентно
(A).. controls (A)+(P) and (B)+(Q) .. (B)
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\path
(0,0) coordinate (v1) node[below]{$v_1$}
(1,2) coordinate (v2) node[left]{$v_2$}
(4,2) coordinate (v3) node[right]{$v_3$}
(3,4) coordinate (v4) node[above]{$v_4$}
;
\draw (v1)--(v2) (v3)--(v4);
\draw[red] (v2).. controls +($.5*(v2)-.5*(v1)$) and +($.8*(v3)-.8*(v4)$) .. (v3);
\foreach \p in {v1,v2,v3,v4}
\fill (\p) circle(2pt);
\end{tikzpicture}
\begin{tikzpicture}
\path
(0,0) coordinate (v1) node[below]{$v_1$}
(2,0) coordinate (v2) node[below]{$v_2$}
(4,2) coordinate (v3) node[right]{$v_3$}
(4,4) coordinate (v4) node[above]{$v_4$}
;
\draw (v1)--(v2) (v3)--(v4);
\draw[blue] (v2).. controls +($.5*(v2)-.5*(v1)$) and +($.8*(v3)-.8*(v4)$) .. (v3);
\foreach \p in {v1,v2,v3,v4}
\fill (\p) circle(2pt);
\end{tikzpicture}
\end{document}
решение2
Вы можете использовать клавиши out
и in
. Они принимают аргумент (угол) и работают по сути как bend left
, но вы можете выбрать угол, который лучше всего подходит для обоих концов.
\documentclass[11pt,a4paper]{amsart}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{arrows}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\coordinate (v1) at (0,0);
\coordinate (v2) at (2,0);
\coordinate (v3) at (4,2);
\coordinate (v4) at (4,4);
\draw[fill, black] (v1) circle[radius=1pt];
\draw[fill, black] (v2) circle[radius=1pt];
\draw[fill, black] (v3) circle[radius=1pt];
\draw[fill, black] (v4) circle[radius=1pt];
\draw (v1)--(v2);
\draw (v3)--(v4);
\draw (2,0) to [out=0, in=270] (4,2);
\end{tikzpicture}
\end{document}
В этом конкретном случае, как вы отметили, вы также можете вставить только дугу окружности. Например, вывод примера выше будет таким же, если последнюю строку изображения TikZ заменить на
\draw (2,0) arc [start angle=-90, end angle=0, radius=2];