Мне нужен полукруглый узел с центром в chord center
. Позиционирование достигается с помощью опции anchor
, но внешние линии по-прежнему направлены на center
. Возможно ли chord center
также направить линии на ?
МВЭ
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\usetikzlibrary{shapes.geometric}
\begin{tikzpicture}
\node [semicircle,draw,shape border rotate=180,anchor=chord center,outer sep=0,inner sep=0.2cm] (a) at (1,1) {};
\draw (0,0) -- (a);
\draw[densely dashed] (0,0) -- (1,1);
\end{tikzpicture}
\end{document}
решение1
За исключением определения новой фигуры, вот ее мошенническая версия с еще одним круглым узлом вокруг нее.
Для этого я добавлю якорь semicircle center
к форме, которая всегда находится в середине хорды, независимо от внешнего разделителя.
Это позволяет разместить форму, semicircle center
не меняя внешние перегородки.
Затем мы добавляем еще один circle
узел, который имеет тот же (внешний) радиус, что и полукруг. Он получает то же имя, что и полукруг, но с '
добавленным.
Технически мы могли бы извлечь радиус из самой фигуры, но through
библиотека делает это очень просто. (Она измеряет расстояние между at
и through
точкой и устанавливает его как радиус minimum size
узла.)
Код
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric, through}
\makeatletter
\pgfutil@namedef{pgf@anchor@semicircle@semicircle center}{%
\pgfpointadd{\pgf@sh@reanchor{semicircle}{chord center}}{%
\installsemicircleparameters\pgfpointpolar{\rotate+90}{\outersep}}}
\makeatother
\tikzset{
circle around semi/.style={
append after command={[every node/.code=]%
node[at=(\tikzlastnode.semicircle center),
circle through=(\tikzlastnode.apex), overlay,
anchor=center, name=\tikzlastnode', inner sep=+0pt, outer sep=+0pt,
path only]{}}}}
\begin{document}
\begin{tikzpicture}[ultra thick]
\node [
semicircle, circle around semi, draw,
shape border rotate=180,
anchor=semicircle center,
inner sep=0.2cm
] (a) at (1,1) {};
\draw[red] (0,0) -- (a');
\end{tikzpicture}
\tikz\draw[ultra thick]
(0,0) .. controls +(30:1) and +(135:2) .. (2,2)
foreach[count=\i from 0, evaluate=\i as \c using \i/4*100]
\pos in {.125, .333, .5, .75, .95}{
node[fill=red!\c!blue, draw=blue!\c!red, fill, thin, sloped,
semicircle, circle around semi, pos=\pos, anchor=semicircle center](@){}
(@') foreach \ang in {0,15,...,359}{edge[thin] ++(\ang:.3)}
};
\end{document}
Выход
решение2
Возможно, обрезка могла бы сработать (но, возможно, не в вашем конкретном случае, и размещение текста внутри полукруга потребует корректировки):
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\begin{scope}
\clip (0.5,1) rectangle +(1,-1);
\node [circle, draw, outer sep=0, inner sep=0.25cm] (a) at (1,1) {};
\end{scope}
\draw[line cap=rect] (a.east) -- (a.west);
\draw[red] (0,0) -- (a);
\end{tikzpicture}
\end{document}
решение3
Из моего комментария следует, что мы можем обойти эту проблему с помощью\fill
Код
\documentclass[border=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\colorlet{pagebackground}{yellow!10}
\pagecolor{pagebackground}
\begin{document}
\begin{tikzpicture}
\coordinate (a) at (1,1);
\draw [red](0,0) -- (a);
\node [semicircle,draw,shape border rotate=180,anchor=chord center,outer sep=0cm,inner sep=0.2cm,fill=pagebackground] at (a) {};
\end{tikzpicture}
\end{document}
решение4
Я всегда хочу, чтобы код был максимально простым (KISS), чтобы я его понимал и мог его поддерживать. Поэтому, основываясь на решении @Qrrbrbirlbel, я выбираю этот код:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\usetikzlibrary{shapes.geometric}
\newcommand{\semicircleup}[4]{%
\node[circle,outer sep=0pt,inner sep=0,minimum width=2*#3] (#1) at #2 {};
\node[semicircle,shape border rotate=180,anchor=chord center,outer sep=0pt,inner sep=0,minimum width=2*#3,#4] at (#1) {};
}
\begin{tikzpicture}
\semicircleup{a}{(1,1)}{0.5cm}{draw,fill=white}
\draw (0,0) -- (a);
\end{tikzpicture}
\end{document}
Он рисует именованный невидимый узел круга (для обрезки линий) и безымянный видимый узел полукруга с одинаковой минимальной шириной (с inner sep=0
).
Дополнительным преимуществом (что для меня важно) является то, что не используется никакая дополнительная библиотека.
Но я все равно приму ответ @Qrrbrbirlbel как похвалу его идее.