Necesito un nodo semicírculo centrado en chord center
. El posicionamiento se consigue con la opción anchor
, pero las líneas exteriores siguen dirigidas a center
. ¿Es posible dirigir líneas chord center
también?
MWE
\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}
Respuesta1
A falta de definir una nueva forma, aquí hay una versión engañosa con otro nodo circular alrededor.
Para esto, agregaré el ancla semicircle center
a la forma que siempre se ubica en el medio de la cuerda, independientemente del espacio exterior.
Esto le permite colocar la forma semicircle center
sin cambiar los espacios exteriores.
Luego agregamos otro circle
nodo que tenga el mismo radio (exterior) que el semicírculo. Recibe el mismo nombre que el semicírculo pero con un '
añadido.
Técnicamente, podríamos extraer el radio de la forma misma, pero la through
biblioteca lo hace muy fácil. (Mide la distancia entre el at
y el through
punto y la establece como la minimum size
del nodo).
Código
\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}
Producción
Respuesta2
Tal vez el recorte podría funcionar (pero tal vez no en su caso específico, y sería necesario ajustar la posición del texto dentro del semicírculo):
\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}
Respuesta3
Según mi comentario, podemos solucionar el problema con\fill
El código
\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}
Respuesta4
Siempre quiero mantener el código lo más simple posible (KISS) y que lo entienda y pueda mantenerlo. Entonces, basándome en la solución de @Qrrbrbirlbel, voy a utilizar este código:
\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}
Dibuja un nodo de círculo invisible con nombre (para recortar las líneas) y un nodo de semicírculo visible sin nombre con el mismo ancho mínimo (con inner sep=0
).
La ventaja adicional (que es importante para mí) es que no se utiliza ninguna biblioteca adicional.
Pero seguiré aceptando la respuesta de @Qrrbrbirlbel como felicitaciones por su idea.