以弦心为中心的半圆

以弦心为中心的半圆

我需要一个以 为中心的半圆节点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之间的距离,并将其设置为节点的。)atthroughminimum 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 的回答,作为对他想法的赞扬。

相关内容