현 중심을 중심으로 한 반원

현 중심을 중심으로 한 반원

에 중심을 둔 반원 노드가 필요합니다 chord center. 옵션을 사용하여 위치를 지정 anchor하지만 외부 라인은 여전히 ​​으로 향합니다 center. 라인을 직접 연결하는 것도 가능합니까 chord center?

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}

여기에 이미지 설명을 입력하세요

답변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의 답변을 그의 아이디어에 대한 칭찬으로 받아들일 것입니다.

관련 정보