考虑对这个问题的解决方案的构造进行轻微的修改:变量和基本算术以及 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
\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}