将 TikZ 分数图推广到任意 n 边多边形

将 TikZ 分数图推广到任意 n 边多边形

我想扩展 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}

在此处输入图片描述

相关内容