semicírculo centrado en el centro de la cuerda

semicírculo centrado en el centro de la cuerda

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 centertambié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}

ingrese la descripción de la imagen aquí

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 centera la forma que siempre se ubica en el medio de la cuerda, independientemente del espacio exterior.

Esto le permite colocar la forma semicircle centersin cambiar los espacios exteriores.

Luego agregamos otro circlenodo 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 throughbiblioteca lo hace muy fácil. (Mide la distancia entre el aty el throughpunto y la establece como la minimum sizedel 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

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

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.

información relacionada