Um polígono regular é um polígono que possui $n$ (com $n\geq3$) lados com mesmo comprimento e também ângulos internos iguais (congruentes). Para conseguirmos desenhar um polígono regular, precisamos lembrar de uma informação importante:

📝 Todo polígono regular está inscrito (dentro) em uma circunferência.

Isto é, todos os seus vértices estão na circunferência e sempre a uma distância $r$, que é o próprio raio da circunferência. Veja alguns casos:

Polígonos regulares - triângulo e quadrado Polígonos regulares - pentágono e hexágono

A ideia deste post é: vamos criar um comando/macro em $\LaTeX$ com TikZ para desenhar um polígono regular. Vamos fazer isso de forma parametrizada a partir do número de lados $n$, inicialmente.

Eu costumo utilizar o Overleaf para escrever documentos com $\LaTeX$, mas você pode utilizar outro de sua preferência.

Após criar o projeto, podemos estruturar um documento mínimo para criação da nossa figura de interesse:

\documentclass{standalone}

% pacote 'tikz' para criar desenhos
\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}
        % conteúdo
    \end{tikzpicture}
\end{document}

Ao utilizar o tipo de documento standalone, vamos obter um PDF que conterá somente a imagem, sem bordas desnecessárias. Importando o pacote tikz, conseguimos utilizar o ambiente tikzpicture para colocar nossos comandos de desenho.

Pensando nas formas de escrita de um ponto disponíveis no pacote tikz, vale mais a pena trabalharmos na representação polar. Na representação polar de um ponto, precisamos de apenas duas informações: o raio $r$ da circunferência e do ângulo $\alpha$ em relação ao eixo $x$. Veja a ilustração de dois pontos ${\color{blue}{A=(r,\,\alpha)}}$ e ${\color{red}{B=(r,\,\beta)}}$ quaisquer:

Dois pontos A e B em uma circunferência de raio r

Como todos os vértices do polígono regular sempre estão $r$ unidades da origem, basta encontrarmos o valor do ângulo de cada vértice. Para sabermos o valor do ângulo de cada vértice do polígono regular, precisamos calcular o valor do ângulo central $\alpha$ da circunferência em função do número de lados $n$ do polígono. Isto é, é direto que $\alpha=\frac{360^\circ}{n}$. Note que múltiplos de $\alpha$ estão igualmente espaçados ao longo de toda a circunferência.

Por exemplo, a partir $r$ e de $\alpha$, os três pontos que formam o triângulo equilátero são, para $\alpha=\frac{360^\circ}{3}=120^\circ$:

\[\begin{align*} P_1&=(r,\,1\cdot\alpha)=(r,\,1\cdot120^\circ)=(r,\,120^\circ)\\ P_2&=(r,\,2\cdot\alpha)=(r,\,2\cdot120^\circ)=(r,\,240^\circ)\\ P_3&=(r,\,3\cdot\alpha)=(r,\,3\cdot120^\circ)=(r,\,360^\circ) \end{align*}\]

Da mesma maneira, os quatro pontos que formam o quadrado são, para $\alpha=\frac{360^\circ}{4}=90^\circ$:

\[\begin{align*} P_1&=(r,\,1\cdot\alpha)=(r,\,1\cdot90^\circ)=(r,\,90^\circ)\\ P_2&=(r,\,2\cdot\alpha)=(r,\,2\cdot90^\circ)=(r,\,180^\circ)\\ P_3&=(r,\,3\cdot\alpha)=(r,\,3\cdot90^\circ)=(r,\,270^\circ)\\ P_4&=(r,\,4\cdot\alpha)=(r,\,4\cdot90^\circ)=(r,\,360^\circ) \end{align*}\]

📝 Note que essa atribuição de pontos faz sempre o $n$-ésimo (último) ponto ficar sempre com ângulo de ${360^\circ}$, independentemente do valor escolhido para $n$.

Assim, para desenhar o polígono precisamos apenas conectar o ponto $P_i$ com o seu próximo $P_{i+1}$. Conectar o $i$-ésimo com o $(i+1)$-ésimo ponto funciona mesmo quando $i=n$, pois o ângulo do ponto $(n+1)$ é igual ao ângulo do primeiro ponto, pela estrutura cíclica dos ângulos na circunferência.

Vamos realizar a conexão dos pontos com um segmento de reta através de alguma estrutura iterativa. A estrutura iterativa que vamos utilizar é uma bem conhecida em qualquer linguagem de programação: o foreach (para cada). Mas antes de montá-lo, é interessante sabermos como criar variáveis dentro do ambiente tikzpicture:

\documentclass{standalone}

\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{3} % lados do polígono
        \pgfmathsetmacro{\r}{2} % raio da circunferência circunscrita
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

    \end{tikzpicture}
\end{document}

Conseguimos criar uma variável com o macro \pgfmathsetmacro{identificador}{valor}. Criamos duas variáveis que precisaremos para desenhar o antiprisma: $n$ e $r$, mas com valores chumbados que vamos parametrizar depois. Foi criada também uma terceira variável $a$ para guardar o valor do ângulo central, a partir de $n$.

Com isso, ao utilizar o foreach já conseguimos desenhar um polígono regular. Fique à vontade para mudar o valor de $n$ e ver como ele impacta na construção da figura.

\documentclass{standalone}

\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{3} % lados do polígono
        \pgfmathsetmacro{\r}{2} % raio da circunferência circunscrita
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

        \foreach \i in {1,...,\n} % lista que vai de 1 até '\n'
        {
            % conectando P_i com P_{i+1}
            \draw ({\i*\a}:\r) -- ({(\i+1)*\a}:\r);
        }
    \end{tikzpicture}
\end{document}

Utilizamos o comando \draw para desenhar os segmentos de reta para conectar $P_i$ com $P_{i+1}$. Veja que as coordenadas foram escritas no formato polar $(\alpha:r)$ do tikz, que produz a seguinte figura:

Polígono regular com 3 lados

Podemos numerar cada vértice do polígono gerado. Basta adicionar um node para cada segmento:

\documentclass{standalone}

\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{3} % lados do polígono
        \pgfmathsetmacro{\r}{2} % raio da circunferência circunscrita
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

        \foreach \i in {1,...,\n} % lista que vai de 1 até '\n'
        {
            % conectando P_i com P_{i+1}
            \draw ({\i*\a}:\r) -- ({(\i+1)*\a}:\r) node at ({\i*\a}:{\r+0.3}) {\i};
        }
    \end{tikzpicture}
\end{document}

Que gera o seguinte resultado:

Triângulo equilátero com nodes nos vértices

Veja que desenhamos o segmento de reta que conecta $P_i$ com $P_{i+1}$ e posicionamos o número do vértice próximo de $P_i$. Nesse processo adicionamos um pequeno valor ao raio para que o número do vértice não fique no mesmo lugar de $P_i$.

Temos o que é necessário para transformar o código acima em um comando de desenho. A ideia é deixar o valor $n$ e o raio $r$ parametrizados. Vamos criar um comando que aceita dois parâmetros. Para isso, crie um novo arquivo dentro do projeto chamado polígono-regular.tex com a seguinte estrutura base:

\newcommand{\desenharPoligonoRegular}[2]
{
    % conteúdo do comando
}

Um comando com dois parâmetros em $\LaTeX$ é criado com o macro \newcommand{\nomeComando}[número de parâmetros]{}. Vamos copiar o código feito até aqui que desenha o polígono regular e fazer algumas alterações: vamos substituir onde estava $n$ e $r$ por #1 e #2, respectivamente:

\newcommand{\desenharPoligonoRegular}[2]
{
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{#1} % lados do polígono
        \pgfmathsetmacro{\r}{#2} % raio da circunferência circunscrita
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

        \foreach \i in {1,...,\n} % lista que vai de 1 até '\n'
        {
            % conectando P_i com P_{i+1}
            \draw ({\i*\a}:\r) -- ({(\i+1)*\a}:\r) node at ({\i*\a}:{\r+0.3}) {\i};
        }
    \end{tikzpicture}
}

Com o código acima em um arquivo separado, podemos deixar apenas a invocação do comando no arquivo principal:

\documentclass{standalone}

\usepackage{tikz}
% importação do arquivo que contém a definição do comando
\input{polígono-regular}

\begin{document}
    % utilização do comando
    \desenharPoligonoRegular{3}{2}
\end{document}

Perceba que importamos o arquivo contendo o comando criado com \input{polígono-regular} no preâmbulo do documento. Isso avisa o compilador que o comando definido no arquivo está disponível. Ao usar o comando \desenharPoligonoRegular{3}{2} estamos rodando o código para desenhar o polígono regular com $n=3$ e $r=2$. A imagem gerada não sofrerá alterações. Se testarmos alguns valores de $n$, teremos os seguintes resultados:

Polígonos regulares - triângulo e quadrado com nodes Polígonos regulares - pentágono e hexágono com nodes

Perceba também que todos os polígonos ficaram com o primeiro vértice em $\alpha$ e o último em $360^\circ$, fazendo parecer que para alguns valores de $n$ a figura está torta. Para consertar isso, podemos utilizar o ambiente scope dentro do ambiente tikzpicture para "rotacionar a base cartesiana" em uma certa quantidade de graus sem precisar mudar as coordenadas dos vértices que escrevemos. A quantidade a ser rotacionada claramente depende de $n$, mas a pergunta que fica é: quanto rotacionar?.

Para deixar sempre o primeiro vértice do polígono fixo em, por exemplo, $90^\circ$, basta rotacionarmos a base cartesiana no ângulo complementar de $\alpha$, isto é, em $90^\circ-\alpha$:

\newcommand{\desenharPoligonoRegular}[2]
{
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{#1} % lados do polígono
        \pgfmathsetmacro{\r}{#2} % raio da circunferência circunscrita
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

        % criando um escopo que rotaciona a base xy cartesiana em 
        % 90-\a graus no sentido anti-horário
        \begin{scope}[rotate=90-\a]
            \foreach \i in {1,...,\n} % lista que vai de 1 até '\n'
            {
                % conectando P_i com P_{i+1}
                \draw ({\i*\a}:\r) -- ({(\i+1)*\a}:\r) node at ({\i*\a}:{\r+0.3}) {\i};
            }
        \end{scope}
    \end{tikzpicture}
}

Que produz as seguintes figuras para alguns valores de $n$:

Polígonos regulares rotacionados - triângulo e quadrado com nodes Polígonos regulares rotacionados - pentágono e hexágono com nodes

A ideia central do post está concluída, que era de mostrar como desenhar um polígono regular com $\LaTeX$ e TikZ. Entretanto, podemos ir um pouco além e adicionar mais elementos na figura, como nas primeiras deste post. O que elas têm a mais é a adição de uma circunferência circunscrita ao polígono de interesse, a conexão dos vértices do polígono ao centro dessa mesma circunferência de forma estilizada (tracejada e com um node) e uma cor de fundo. Primeiro, precisamos desenhar uma circunferência de raio $r$ antes do trecho de código que desenha os lados do polígono:

\newcommand{\desenharPoligonoRegular}[2]
{
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{#1} % lados do polígono
        \pgfmathsetmacro{\r}{#2} % raio da circunferência circunscrita à base
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

        % circunferência circunscrita
        \draw[red] (0,0) circle (\r);

        % criando um escopo que rotaciona a base xy cartesiana em 
        % 90-\a graus no sentido anti-horário
        \begin{scope}[rotate=90-\a]
            \foreach \i in {1,...,\n} % lista que vai de 1 até '\n'
            {
                % conectando P_i com P_{i+1}
                \draw[thick] ({\i*\a}:\r) -- ({(\i+1)*\a}:\r) node at ({\i*\a}:{\r+0.3}) {\i};
            }
        \end{scope}
    \end{tikzpicture}
}

Além da circunferência, veja que também colocamos a opção thick nos lados do polígono para deixar seus segmentos mais grossos. Com isso, temos o seguinte resultado para $n=3$:

Triângulo equilátero com nodes nos vértices e uma circunferência circunscrita

Agora, podemos conectar o vértice $P_i$ com a origem $(0,\,0)$ com um segmento de reta tracejado e bem fino dentro do foreach:

\newcommand{\desenharPoligonoRegular}[2]
{
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{#1} % lados do polígono
        \pgfmathsetmacro{\r}{#2} % raio da circunferência circunscrita à base
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

        % circunferência circunscrita
        \draw[red] (0,0) circle (\r);

        % criando um escopo que rotaciona a base xy cartesiana em 
        % 90-\a graus no sentido anti-horário
        \begin{scope}[rotate=90-\a]
            \foreach \i in {1,...,\n} % lista que vai de 1 até '\n'
            {
                % conectando P_i com P_{i+1}
                \draw[thick] ({\i*\a}:\r) -- ({(\i+1)*\a}:\r) node at ({\i*\a}:{\r+0.3}) {\i};

                % conectando P_i com a origem
                \draw[dashed, ultra thin] ({\i*\a}:\r) -- (0,0);
            }
        \end{scope}
    \end{tikzpicture}
}

Que produz a seguinte figura para $n=3$:

Triângulo equilátero com nodes nos vértices e uma circunferência circunscrita - conexão dos vértices com a origem

Para desenhar o texto $r$ em vermelho, fiz o seguinte: dentro de um scope rotacionando a base cartesiana em $10^\circ$, usei o comando \node posicionado na metade do valor de $r$ e mesmo ângulo $\alpha$:

\newcommand{\desenharPoligonoRegular}[2]
{
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{#1} % lados do polígono
        \pgfmathsetmacro{\r}{#2} % raio da circunferência circunscrita à base
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

        % circunferência circunscrita
        \draw[red] (0,0) circle (\r);

        % criando um escopo que rotaciona a base xy cartesiana em 
        % 90-\a graus no sentido anti-horário
        \begin{scope}[rotate=90-\a]
            \foreach \i in {1,...,\n} % lista que vai de 1 até '\n'
            {
                % conectando P_i com P_{i+1}
                \draw[thick] ({\i*\a}:\r) -- ({(\i+1)*\a}:\r) node at ({\i*\a}:{\r+0.3}) {\i};

                % conectando P_i com a origem
                \draw[dashed, ultra thin] ({\i*\a}:\r) -- (0,0);

                % desenhar o texto $r$ posicionado
                % na metade do valor de \r
                \begin{scope}[rotate=10]
                    \node[red] at ({\i*\a}:\r*0.5) {$r$};
                \end{scope}
            }
        \end{scope}
    \end{tikzpicture}
}

Que produz a figura a seguir para $n=3$:

Triângulo equilátero com nodes nos vértices e uma circunferência circunscrita - conexão dos vértices com a origem e com label r representando o raio

Por fim, podemos adicionar uma cor de fundo no polígono. Podemos fazer isso também via foreach, mas com uma pequena modificação. Como a ordem dos elementos desenhados importa, precisamos adicionar o trecho de código de modo que a cor de fundo seja desenhada primeiro, antes dos outros elementos:

\newcommand{\desenharPoligonoRegular}[2]
{
    \begin{tikzpicture}

        \pgfmathsetmacro{\n}{#1} % lados do polígono
        \pgfmathsetmacro{\r}{#2} % raio da circunferência circunscrita à base
        \pgfmathsetmacro{\a}{360/\n} % ângulo central a partir de '\n'

        % circunferência circunscrita
        \draw[red] (0,0) circle (\r);

        % criando um escopo que rotaciona a base xy cartesiana em 
        % 90-\a graus no sentido anti-horário
        \begin{scope}[rotate=90-\a]

            % cor de fundo para o polígono
            \fill[gray!30] (\a:\r) foreach \i in {2,3,...,\n}
            {
                -- ({\i*\a}:\r)
            } -- cycle;
        
            \foreach \i in {1,...,\n} % lista que vai de 1 até '\n'
            {
                % conectando P_i com P_{i+1}
                \draw[thick] ({\i*\a}:\r) -- ({(\i+1)*\a}:\r) node at ({\i*\a}:{\r+0.3}) {\i};

                % conectando P_i com a origem
                \draw[dashed, ultra thin] ({\i*\a}:\r) -- (0,0);

                % desenhar o texto $r$ posicionado
                % na metade do valor de \r
                \begin{scope}[rotate=10]
                    \node[red] at ({\i*\a}:\r*0.5) {$r$};
                \end{scope}
            }
        \end{scope}
    \end{tikzpicture}
}

Acima, veja que usamos o comando \fill[gray!30] seguido do primeiro vértice (\a:\r). Especificamos a cor de fundo sendo um cinza $30\%$. Em seguida usamos o comando foreach, de forma a ter dentro dele as coordenadas que definem os vértices do polígono que será preenchido (de forma iterativa), da segunda em diante. Logo após o foreach, colocamos `--` cycle para fechar o polígono da cor de fundo, conectando o último vértice da iteração com o primeiro (\a:\r).

Produzindo a seguinte figura para $n=3$:

Triângulo equilátero com nodes nos vértices, uma circunferência circunscrita e cor de fundo

O código do projeto está disponível aqui. Agora é com você! 👋