在 tikz 中标记圆圈内的点

在 tikz 中标记圆圈内的点

考虑对这个问题的解决方案的构造进行轻微的修改:变量和基本算术以及 tikz-euclide

\documentclass{minimal}
\usepackage{tkz-euclide}
\begin{document}

\begin{tikzpicture}[scale=3]
\tkzDefPoint(0,0){O}
\tkzDrawCircle[R](O,1 cm)
\def\sectors{20}
\foreach \i in {1,2,...,\sectors} {
    \tkzDefPoint({\i*360/\sectors}:1){P\i}   
    \tkzDrawSegment[color=black](O,P\i)
    \tkzLabelPoint(P\i){\i} %modified here!
}
\end{tikzpicture}
\end{document}

这给了我以下输出:

在此处输入图片描述

现在我的问题是,是否可以将标签放置在径向线的延伸处。

是否可以根据相应径向线的方向额外旋转标签?(例如,我的输出上的 5 将逆时针旋转 90°)。

答案1

我的一个朋友曾经需要一种蛋糕来可视化分数。添加旋转节点并不难:

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{intersections, calc, fpu, decorations.pathreplacing}

\newcommand{\TikZFractionalCake}[5]{% Num, Denom, Color, Borders, Size
    \pgfmathsetmacro{\angle}{360/#2};%
    \foreach \x in {1,...,#1}%
    {   \pgfmathsetmacro{\lox}{\x-1}%
        \filldraw[draw=#4,fill=#3] (0,0) -- (\angle*\lox:#5) arc (\angle*\lox:\angle*\x:#5) -- cycle;%
        \pgfmathsetmacro{\mix}{\x-0.5}%
        \node[rotate=\mix*\angle] at (\mix*\angle:#5+0.3) {\x};
    }
}   

\begin{document}

\begin{tikzpicture}
\TikZFractionalCake{20}{20}{white}{black}{3}
\end{tikzpicture}

\end{document}

在此处输入图片描述


当然,这会让事情变得更容易:

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{intersections, calc, fpu, decorations.pathreplacing}

\newcommand{\TikZFractionalCake}[5]{% Num, Denom, Color, Borders, Size
    \pgfmathsetmacro{\angle}{360/#2};%
    \foreach \x in {1,...,#1}%
    {   \pgfmathsetmacro{\lox}{\x-1}%
        \filldraw[draw=#4,fill=#3] (0,0) -- (\angle*\lox:#5) arc (\angle*\lox:\angle*\x:#5) -- cycle;%
        \node[rotate=\x*\angle] at (\x*\angle:#5+0.3) {\x};
    }
}   

\begin{document}

\begin{tikzpicture}
\TikZFractionalCake{20}{20}{white}{black}{3}
\end{tikzpicture}

\end{document}

在此处输入图片描述


这确实是可能的:

\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{intersections, calc, fpu, decorations.pathreplacing}

\newcommand{\TikZFractionalCake}[6]{% Num, Denom, Color, Borders, Size, k-th label
    \pgfmathsetmacro{\angle}{360/#2};%
    \foreach \x in {1,...,#1}%
    {   \pgfmathsetmacro{\lox}{\x-1}%
        \filldraw[draw=#4,fill=#3] (0,0) -- (\angle*\lox:#5) arc (\angle*\lox:\angle*\x:#5) -- cycle;%
    }
    \pgfmathsetmacro{\secondstep}{2*#6}
    \pgfkeys{/pgf/number format/.cd,int detect,precision=2}
    \foreach \x in {#6,\secondstep,...,#1}%
    {   \node[rotate=\x*\angle] at (\x*\angle:#5+0.3) {\pgfmathprintnumber{\x}};
    }
}   

\begin{document}

\begin{tikzpicture}
\TikZFractionalCake{21}{21}{white}{black}{3}{3} 
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

作为典型的对应者tikz图纸,这是pstricks版本。

在此处输入图片描述

\documentclass{article}
\usepackage{pst-node}% http://ctan.org/pkg/pst-node
\usepackage{multido}% http://ctan.org/pkg/multido
\begin{document}

\begin{pspicture}(10,10)
  \SpecialCoor
  \psset{unit=3cm,runit=3cm}% Scaling of x,y and r units
  \pnode(3,0){O}% Circle origin
  \pscircle(O){1}% Outer circle
  \degrees[20]% 20 angles per 360 degrees (each angle is 18 degrees)
  \rput(O){\multido{\i=1+1}{20}{% Cycle through 20 angles and relocate relative to circle origin
    \pcline(O)(1;\i)% Print line from origin to circle edge
    \uput{5pt}[\i]{\i}(1;\i){\i}% Print label with rotation
  }}
\end{pspicture}
\end{document}

将标签命令修改为

\uput{5pt}[\i]{0}(1;\i){\i}% Print label without rotation

产量

在此处输入图片描述

打印标签奇怪的索引可以通过使用

\ifodd\i\uput{5pt}[\i]{\i}(1;\i){\i}\fi% Print ODD label with rotation

尽管

\ifodd\i\else\uput{5pt}[\i]{\i}(1;\i){\i}\fi% Print EVEN label with rotation

仅打印偶数索引。下面是后者的示例(打印甚至标签旋转)选择:

在此处输入图片描述

这可以与每个节点的旋转。为此,修改\uput命令中的相应参数,该参数定义为

\uput{<labelsep>}[<refangle>]{<rotation>}(<coordinate>){<stuff>}

<stuff>以 为单位旋转<rotation>距离<labelsep>和角度<refangle><coordinate>在我的示例中,使用\degrees[<n>]将 360 度分成<n>多个角度。因此,它允许您使用这些角度(作为数字,其中angle=i*(360/<n>))。此外,由于\SpecialCoor,可以使用极坐标 - 表示为(<r>;<t>)-或者笛卡尔坐标——用 表示(<x>,<y>)pst-node允许用由(比如说)定义的<coordinate>节点替换任何这些类型,就像在 MWE 中所做的那样。<name>\psnode(<coordinate>){<name>}

答案3

您有几种解决方案:

1)你可以将 tkz-euclide 与 tikz 混合使用

\documentclass{minimal}
\usepackage{tkz-euclide}
\begin{document}

\begin{tikzpicture}[scale=1]
\tkzDefPoint(0,0){O}
\tkzDrawCircle[R](O,3 cm)
\def\sectors{20}
\foreach \i in {1,2,...,\sectors} {
    \tkzDefPoint({\i*360/\sectors}:3){P\i}    
    \tkzDrawSegment[color=black](O,P\i)
      \node[label=18*\i:\i] at  (P\i) {} ;
}
\end{tikzpicture}
\end{document}  

在此处输入图片描述

\end{document} 

3) 你只使用 tikz !(参见 Tom 的解决方案)

4) 我忘记了这一点(我使用个人软件包时遇到了一些困难)。我像你一样输入,scale=3但当可能时,我会避免使用scale

\documentclass{minimal}
\usepackage{tkz-euclide}
\begin{document}

\begin{tikzpicture}[scale=3]
\tkzDefPoint(0,0){O}
\tkzDrawCircle[R](O,1 cm)
\def\sectors{20} 
\tikzset{label style/.style={} }; 
\foreach \i in {1,2,...,\sectors} {
    \tkzDefPoint({\i*360/\sectors}:1){P\i} 
    \tkzDrawSegment[color=black](O,P\i)
      \tkzLabelPoint[label=360/\sectors*\i:\i](P\i){}
}
\end{tikzpicture}
\end{document}

5)可以将标签放在半径上,但我认为这不是一个好的排版想法

\documentclass{minimal}
\usepackage{tkz-euclide}
\begin{document}

\begin{tikzpicture}[scale=3]
\tkzDefPoint(0,0){O}
\tkzDrawCircle[R](O,1 cm)
\def\sectors{20} 
\tikzset{label style/.style={} }; 
\foreach \i in {1,2,...,\sectors} {
    \tkzDefPoint({\i*360/\sectors}:1){P\i} 
    \tkzDrawSegment[color=black](O,P\i)
} 
% it's possible to avoid the next loop with conditional macro ...
\foreach \i in {1,3,...,\sectors} {% you can change what you want here
            \tkzLabelPoint[rotate=18*\i,right](P\i){\i} ;
}  
\end{tikzpicture}
\end{document} 

在此处输入图片描述

相关内容