Halbkreis mit Mittelpunkt in der Sehnenmitte

Halbkreis mit Mittelpunkt in der Sehnenmitte

Ich brauche einen Halbkreisknoten mit Mittelpunkt chord center. Die Positionierung wird mit der Option erreicht anchor, aber die externen Linien sind immer noch auf gerichtet . Ist es möglich, Linien auch centerauf zu richten ?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}

Bildbeschreibung hier eingeben

Antwort1

Ohne eine neue Form zu definieren, hier ist eine Schummelversion mit einem weiteren Kreisknoten darum herum.

Dazu füge ich semicircle centerder Form einen Anker hinzu, der immer in der Mitte der Sehne sitzt, unabhängig von der äußeren Separierlinie.

Dadurch können Sie die Form platzieren, semicircle centerohne die äußeren Separierwerte zu verändern.

Dann fügen wir einen weiteren circleKnoten hinzu, der den gleichen (äußeren) Radius wie der Halbkreis hat. Dieser erhält den gleichen Namen wie der Halbkreis, jedoch mit einem 'Zusatz.

Technisch könnten wir den Radius aus der Form selbst extrahieren, aber die throughBibliothek macht es sehr einfach. (Sie misst den Abstand zwischen atund dem throughPunkt und legt diesen als den minimum sizedes Knotens fest.)

Code

\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}

Ausgabe

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Antwort2

Möglicherweise könnte das Ausschneiden funktionieren (aber vielleicht nicht in Ihrem speziellen Fall, und die Positionierung des Textes innerhalb des Halbkreises müsste angepasst werden):

\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}

Bildbeschreibung hier eingeben

Antwort3

Aus meinem Kommentar können wir das Problem umgehen mit\fill

Der Code

\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}

Bildbeschreibung hier eingeben

Antwort4

Ich möchte den Code immer so einfach wie möglich halten (KISS) und ihn verstehen und tatsächlich warten können. Basierend auf der Lösung von @Qrrbrbirlbel verwende ich diesen Code:

\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}

Es zeichnet einen benannten unsichtbaren Kreisknoten (um die Linien zu beschneiden) und einen unbenannten sichtbaren Halbkreisknoten mit der gleichen Mindestbreite (mit inner sep=0).

Ein weiterer Vorteil (der mir wichtig ist) ist, dass keine zusätzliche Bibliothek verwendet wird.

Aber ich akzeptiere die Antwort von @Qrrbrbirlbel dennoch als Anerkennung für seine Idee.

verwandte Informationen