我想扩展 Mark Wibrow 的回答这个问题到一般多边形。用户可以输入类似
\begin{tikzpicture}
\pic {fraction={style=8-gon, segment=radius, color=gray, fraction={5/8}}};
\end{tikzpicture}
得到一个以线段为半径的八边形,或者
\begin{tikzpicture}
\pic {fraction={style=5-gon, segment=apothem, color=gray, fraction={12/5}}};
\end{tikzpicture}
得到一个以线段作为边心距的五边形。
在Mark Wibrow 的回答他描述了如何创建圆形、三角形和花瓣的样式。我希望能够为任何n—贡:
(左边:以半径绘制的线段。 正确的:以心经线形式绘制的线段)
我对 TikZ 的使用经验很少 - 我使用 Microsoft Paint 创建了上述图形。提前感谢您的帮助!
答案1
只需使用正多边形节点并添加路径图片。有一个选项用于非平凡最大公约数和分数等于 1/2 的情况。
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{shapes.geometric}
\newif\ifgcd
\begin{document}
\begin{tikzpicture}[ngon fraction/.style args={#1/#2}{regular polygon,
minimum size=\pgfkeysvalueof{/tikz/ngon size},
regular polygon sides=#2,draw,path picture={\ifodd#2
\pgfmathsetmacro{\mystartangle}{90-360/#2}
\else
\pgfmathsetmacro{\mystartangle}{0}
\fi
\pgfmathtruncatemacro{\itest}{ifthenelse(#2/#1==2,1,0)}
\ifnum\itest=1
\foreach \X in {0,2,...,#2}
{\draw[fill=gray!20] (\mystartangle+\X*360/#2:\pgfkeysvalueof{/tikz/ngon size})
-- (0,0) -- (\mystartangle+\X*360/#2+360/#2:\pgfkeysvalueof{/tikz/ngon size});}
\else
\fill[gray!20] (0,0) -- (\mystartangle:\pgfkeysvalueof{/tikz/ngon size}) arc[start angle=\mystartangle,end
angle={\mystartangle+#1*360/#2},radius=\pgfkeysvalueof{/tikz/ngon size}];
\ifgcd
\pgfmathtruncatemacro{\mygcd}{gcd(#1,#2)}
\pgfmathtruncatemacro{\myupper}{#2/\mygcd}
\foreach \X in {1,...,\myupper}
{\draw (0,0) -- (\mystartangle+\mygcd*\X*360/#2:\pgfkeysvalueof{/tikz/ngon size});}
\else
\foreach \X in {1,...,#2}
{\draw (0,0) -- (\mystartangle+\X*360/#2:\pgfkeysvalueof{/tikz/ngon size});}
\fi
\fi
}},gcd/.is if=gcd,apothem/.style={shape border rotate=180/#1},
ngon size/.initial=2cm
]
\path (0,0) node[ngon fraction=1/4,]{}
(3,0) node[ngon fraction=1/4,apothem=4]{}
(0,-3) node[ngon fraction=4/5,rotate=108]{}
(3,-3) node[ngon fraction=4/5,rotate=108,apothem=5]{}
(0,-6) node[ngon fraction=4/6,rotate=150]{}
(3,-6) node[gcd,ngon fraction=4/6,rotate=150,apothem=6]{}
(0,-9) node[ngon fraction=4/8,shape border rotate=360/16,rotate=360/16]{}
(3,-9) node[ngon fraction=4/8]{}
;
\end{tikzpicture}
\end{document}
答案2
薛定谔猫的答案很完美。我只给出了一种方法以tkz-euclide
避免复杂化。这是一个测试,看看是否可行......有一些工作需要完成,并得到分数和多边形之间的联系。可以用同样的方式得到边心距的解决方案。
\documentclass[]{article}
\usepackage{tkz-euclide}
\parindent=0pt
\begin{document}
\foreach \i in {3,...,7}
{ \begin{tikzpicture}
\tkzDefPoints{0/0/P0,2/0/P1}
\tkzDefRegPolygon[center,sides=\i](P0,P1)
\tkzDrawPolygon(P1,P...,P\i)
\tkzFillPolygon[gray!20](P0,P...,P\i)
\foreach \j in {1,...,\i} {\tkzDrawSegment[black](P0,P\j)}
\end{tikzpicture}\\}
\end{document}
现在有了这个:
\documentclass[]{article}
\usepackage{tkz-euclide}
\parindent=0pt
\begin{document}
\foreach \i in {3,...,7}
{ \begin{tikzpicture}
\tkzDefPoints{0/0/P0,0/0/Q0,2/0/P1}
\tkzDefMidPoint(P0,P1) \tkzGetPoint{Q1}
\tkzDefRegPolygon[center,sides=\i](P0,P1)
\tkzDefMidPoint(P1,P2) \tkzGetPoint{Q1}
\tkzDefRegPolygon[center,sides=\i,name=Q](P0,Q1)
\tkzDrawPolygon(P1,P...,P\i)
\tkzFillPolygon[gray!20](Q0,Q1,P2,Q2)
\foreach \j in {1,...,\i} {\tkzDrawSegment[black](P0,Q\j)}
\end{tikzpicture}\\}
\end{document}