TikZ – 05 – Coordenadas polares e relativas

Não só de coordenadas cartesianas vivem as ilustrações, mas também de vários outros sistemas de coordenadas usados na matemática. O segundo sistema mais importante – e extremamente útil – é o das coordenadas polares. Vamos falar muito dele neste capítulo.

Muito embora não seja um sistema de coordenadas, vamos falar também sobre coordenadas relativas, quando cada novo ponto não tem coordenadas baseadas na origem do sistema, mas, sim, no ponto anterior.

E como ilustração principal deste capítulo, temos a seguinte:

Fig. 5.1 – Diagonais de um pentágono

A ilustração é simples: duas diagonais de um pentágono regular se intersectando no ponto I, que divide essas diagonais na razão áurea, um conceito onipresente na geometria e nos livros de divulgação matemática.

Realizar essa ilustração com coordenadas cartesianas é bem complicado, exigindo muitos cálculos e muita trigonometria. Mas a TikZ, ao oferecer a possibilidade de operar com coordenadas polares e relativas, faz com que a tarefa seja enormemente simplificada. Vejamos então como operar com ambas.

Coordenadas polares

Qualquer ponto no plano pode ter uma localização precisa com dois números. Nas coordenadas cartesianas, esses dois números se referem a distâncias nas direções dos eixos x e y em relação a um ponto chamado de origem. Nas coordenadas polares, esses dois números são o comprimento do segmento que une a origem ao ponto, chamado de raio r e o ângulo \theta que esse raio faz com um eixo chamado de eixo polar:

Fig. 5.2 – Coordenadas polares

A TikZ usa a notação P(\theta:r) (primeiro o ângulo e depois o raio) para indicar a localização de um ponto P. Como exemplo, observe a ilustração seguinte, em que o ponto P está a 4 cm da origem e a 120o de “giro” em relação ao eixo polar:

Fig. 5.3 – Exemplo: o ponto P (120:4)

Note que o “giro” se dá na direção contrária à dos ponteiros do relógio.

Esse mesmo ponto P, note bem, pode ser expresso em coordenadas cartesianas. Existem fórmulas de conversão entre um sistema e outro, mas, por enquanto, não precisaremos delas (ainda bem!). Pelo contrário, alternar entre o uso de um sistema e de outro é que deve ser estimulado, com a adoção do que for mais conveniente, de maneira livre e pragmática.

Coordenadas relativas

Vamos agora entender como utilizar as coordenadas de um ponto em relação não à origem do sistema, mas em relação a outros pontos. Essa é maneira relativa de referenciar um ponto.

Observe a figura seguinte. Nela marcamos os pontos A (1, 0), B (2, 3) e C (4, 4) em coordenadas cartesianas, como estamos acostumados.

Fig. 5.4 – De A, B e C

Para ligar o ponto A ao ponto B e este ao ponto C, costumamos usar

\draw (1,0) -- (2,3) -- (4,4);

Agora considere que você está sobre o ponto A. Do seu ponto de vista, o ponto B está uma unidade para a direita e três para cima. Ou seja, as coordenadas de B, para você, parecem ser (1, 3). Assim, se você somar (1, 3) às coordenadas do ponto A, você chegará a B: (1, 0) + (1, 3) = (2, 3).

Agora você caminhou até B. As coordenadas de C parecerão estar a duas unidade à direita e uma acima. Ou seja, se você somar (2, 1) às coordenadas de B você chega a C: (2, 3) + (2, 1) = (4, 4).

O comando \draw permite que você faça isso com o operador ++. Primeiro, você escreve o primeiro ponto em coordenadas cartesianas (ou polares) normalmente:

\draw (1,0)

Depois, você soma o que falta para chegar ao ponto B com o comando — ++, ou seja, soma (1, 3):

\draw (1,0) -- ++ (1,3)

Por fim, soma o que falta para chegar a C, ou seja, soma (2, 1):

\draw (1,0) -- ++ (1,3) -- ++ (2,1);

Esse código (naturalmente, dentro do bloco tikzpicture) gera a figura:

Fig. 5.5 – Ligando por coordenadas relativas

É claro, você gerou algo mais simples, mas fica para você, como exercício, reproduzir a figura acima. O importante é saber que são equivalente, do ponto de vista da TikZ, os códigos:

\draw (1,0) -- (2,3) -- (4,4);

e

\draw (1,0) -- ++ (1,3) -- ++ (2,1);

Desenho

Vamos começar o pentágono externo de nossa ilustração. Dê mais uma olhada nela e veja que o desenho consiste de apenas 7 linhas: os lados do pentágono e duas diagonais. Você verá que essa tarefa será muito simplificada pelo uso das coordenadas polares (e convido você a tentar fazer o mesmo com coordenadas cartesianas).

Partindo da origem, (0:0) em coordenadas polares, vamos caminhar apenas uma unidade, com ângulo zero, para a direita. Ou seja, vamos do ponto (0:0) para o (0:1):

\begin{tikzpicture}
  \draw (0:0) -- (0:1);
\end{tikzpicture}

O desenho gerado é o seguinte, muito menor do que imaginávamos:

Fig. 5.6 – Muito pequeno

Números grandes podem nos confundir. Por isso, para simplificar a tarefa de desenhar, é costume usar números pequenos e depois ampliar o desenho. A TikZ provê um comando para isso: scale, seguido do fator de ampliação (ou redução!):

\begin{tikzpicture}[scale=5]
  \draw (0:0) -- (0:1);
\end{tikzpicture}

Com isso, ampliamos em 5 vezes o tamanho das linhas do desenho. Agora a figura fica do tamanho que queremos:

Fig. 5.7 – Cinco vezes maior com scale=5

Precisamos dar nomes a esses pontos. Logo após as coordenadas de cada um, podemos de usar o comando coordinate para nomeá-los de uma vez, uma prática que é muito comum quando usamos coordenadas polares:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B);
\end{tikzpicture}

Assim, o ponto (0:0) vai se chamar A, e o ponto (0:1) vai se chamar B. Desenhamos e nomeamos ao mesmo tempo.

Agora é que usaremos coordenadas relativas. Imagine que você está caminhando pelo desenho e chegou ao ponto B. Sua tarefa é traçar um outro lado do pentágono, que está inclinado 72o em relação ao eixo polar (que pode ser pensado como o eixo x) e tem tamanho 1. O que você faz? Você acrescenta às suas coordenadas atuais o ponto (72:1) com o comando ++ e aproveita e o nomeia como ponto C:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C);
\end{tikzpicture}

E a ilustração fica:

Fig. 5.8 – Segundo lado: 72 graus de incinação

Agora estamos em C. Queremos traçar outro segmento que está inclinado em 144o em relação a C e tem tamanho 1. Vamos acrescentar esse ponto ao desenho e chamá-lo de D:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D);
\end{tikzpicture}

E temos a figura:

Fig. 5.9 – Terceiro lado: 144 graus de inclinação

Por fim, imaginamos que estamos em D. Precisamos acrescentar outro ponto, que está a 216o e distância 1 de D. Vamos chamar esse ponto de E e vamos fechar a figura com cycle:

\begin{tikzpicture}[scale=5]
    \draw(0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle; 
\end{tikzpicture}

O pentágono externo está pronto:

Fig. 5.10 – Quarto lado com 216 graus de inclinação + quinto lado com cycle

Vamos traçar as diagonais. Como nomeamos os pontos, nossa tarefa simplificou bastante. As diagonais que queremos ligam os pontos A e C, e também os pontos B e D:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle;
  \draw (A) -- (C);
  \draw (B) -- (D);
\end{tikzpicture}

Essa foi fácil. Por enquanto, temos:

Fig. 5.11 – Com as duas diagonais

Agora temos um problema: calcular as coordenadas da interseção I entre essas diagonais. Precisamos saber essas coordenadas, pois precisamos rotular esse ponto. O que fazer?

Matematicamente, precisamos saber das equações das retas que contêm esses segmentos. Não é difícil resolver esse problema, mas queremos evitar ao máximo a tarefa desgastante de ter que realizar uma série de contas para cada pequeno detalhe de uma ilustração. Além disso, é fácil perceber que esse problema é bastante comum e já deve ter acontecido milhões de vezes desde as primeiras versões da linguagem. A TikZ deve ter alguma solução rápida para isso.

E, de fato, tem mesmo.

O comando path

Existe um comando capaz de nomear não só um ponto, mas todo um conjunto de linhas, curvas e pontos. É o comando path (que significa caminho), um dos mais importantes comandos da TikZ.

Vamos falar muito desse comando daqui em diante. Para que você vá aos poucos se acostumando com ele, vamos dar nomes às diagonais AC e BD escrevendo [name path=AC] (que significa o nome do caminho é AC) logo depois do comando \draw que traçou a diagonal AC e escrevendo [name path=BD] (que significa o nome do caminho é BD) depois do comando \draw que traçou BD:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle;
  \draw [name path=AC] (A) -- (C);
  \draw [name path=BD] (B) -- (D);
\end{tikzpicture}

Assim, as diagonais AC e BD já podem ser referenciadas com esses nomes. Isso vai ser muito importante, pois agora podemos falar de um biblioteca que vai encontrar e nomear essas interseções sem que você tenha que calcular tudo na mão.

A biblioteca intersections

Como dito, existe uma biblioteca de comandos que fornece um meio de encontrar e nomear esses pontos, fazendo todos os cálculos para nós: é a biblioteca intersection, que carregamos com o comando \usetikzibrary{intersections} no cabeçalho do programa:

\documentclass[tikz]{standalone}
\usepackage[brazil]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usetikzlibrary{intersections}
\begin{document}
    .
    .
    .

Carregada a biblioteca, é necessária muita calma nesta hora. Isso porque vamos utilizar uma sequência de comandos que, à primeira vista, vai parecer complicada, mas sua leitura até bastante tranquila e lógica.

Primeiro, vamos usar o comando \path e dar nome a uma interseção. Qual interseção? De AC e BD, e vamos nomeá-la de I. Traduzindo estas informações em termos de um comando só, vamos escrever \path [name intersections={of=AC and BD, by=I} logo depois das linhas que criaram as diagonais:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle;
  \draw [name path=AC] (A) -- (C);
  \draw [name path=BD] (B) -- (D);
  \path [name intersections={of=AC and BD,by=I}];  
\end{tikzpicture}

Literalmente, esse comando é lido como “este caminho (path) tem o nome (name) de uma interseção (intersections) de (of) AC e (and) BD, e ele é dado por (by) I”.

Complicado? Deixe para pensar melhor nele nos exercícios. Por ora, sabemos que a interseção agora se chama I. Vamos desenhar nela um círculo de raio 0.01:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle;
  \draw [name path=AC] (A) -- (C);
  \draw [name path=BD] (B) -- (D);
  \path [name intersections={of=AC and BD,by=I}];
  \fill (I) circle (0.01);    
\end{tikzpicture}

Usamos o comando \fill para preencher a circunferência em I. A figura fica:

Fig. 5.12 – Duas diagonais e interseção

Parece agora que nos cabe apenas acrescentar o texto e fazer as decorações necessárias. Vamos a eles.

Texto

Para evitar uma série de linhas com node para dar nomes aos pontos, a TikZ permite que você escreva tudo em uma linha linha só. Escreveremos (A) node {A} e logo depois, separado por um espaço, (B) node {B}, e assim por diante, até dar nome a todos os pontos que conhecemos, inclusive a interseção I:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle;
  \draw [name path=AC] (A) -- (C);
  \draw [name path=BD] (B) -- (D);
  \path [name intersections={of=AC and BD,by=I}];
  \fill (I) circle (0.01);    
  \draw (A) node {A} (B) node {B} (C) node {C} (D) node {D} (E) node {E} (I) node {I}; 
\end{tikzpicture}
Fig. 5. 13 – Rótulos

O trabalho com o texto terminou. Vamos às decorações.

Decoração

Comecemos localizando os rótulos dos pontos em lugares melhores do que aqueles em que estão. Vamos usar above, below, left, right antes de cada node:

\begin{tikzpicture}[scale=5]
  \draw (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle;
  \draw [name path=AC] (A) -- (C);
  \draw [name path=BD] (B) -- (D);
  \path [name intersections={of=AC and BD,by=I}];
  \fill (I) circle (0.01);    
  \draw (A) [below] node {A} (B) [below] node {B} (C) [right] node {C} (D) [above] node {D} (E) [left] node {E} [below] (I) node {I}; 
\end{tikzpicture}

A figura fica:

Fig. 5.14 – Ajustando rótulos

Eu sei que você pode fazer melhor do que isso. Tente combinar as palavras, escrevendo, por exemplo, [below left] para o node A. Tente outras combinação a seu gosto.

Vamos agora transformar as cinco linhas do pentágono, colorindo-as de vermelho (red), tornando-as pontilhadas (dotted) e mais grossas (thick):

  \draw [red, dotted, thick] (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle; 

E temos a figura seguinte:

Fig, 5.15 – Estilizando o pentágono

Para terminar, a cereja do bolo: vamos colorir o ponto I de vermelho [red]:

\fill [red] (I) circle (0.01);  

E terminamos o trabalho:

Fig. 5.16 – Final

O código todo é o seguinte:

\documentclass[tikz]{standalone}
\usepackage[brazil]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usetikzlibrary{intersections}
\begin{document}
  \begin{tikzpicture}[scale=5]
    \draw [red, dotted, thick] (0:0) coordinate (A) -- (0:1) coordinate (B) -- ++ (72:1) coordinate (C) -- ++ (144:1) coordinate (D) -- ++ (216:1) coordinate (E) -- cycle;
    \draw [name path=AC] (A) -- (C);
    \draw [name path=BD] (B) -- (D);
    \path [name intersections={of=AC and BD,by=I}];
    \fill [red] (I) circle (0.01);    
    \draw (A) [below] node {A} (B) [below] node {B} (C) [right] node {C} (D) [above] node {D} (E) [left] node {E} [below] (I) node {I}; 
  \end{tikzpicture}
\end{document}

Bem menor do que o anterior, não é mesmo?

Resumo

Desenho

  • P(\theta:r) determina o ponto P com coordenadas polares, em que \theta é o ângulo entre o eixo polar e o raio r.
  • Escrevemos ++ para somar novas coordenadas às coordenadas anteriores, criando uma referência relativa.
  • [scale = 5] – amplia a ilustração 5 vezes. O número pode ser mudado tanto para ampliar quando para reduzir. Por exemplo, se fosse [scale = 0.30], a ilustração seria reduzida para 30% de seu tamanho original.
  • É possível usar coordinate após um ponto para nomeá-lo logo de uma vez.
  • path dá nome a um caminho que será usado posteriormente. Por exemplo, o comando \draw [name path=AC] (A) -- (C) nomeia como AC a linha que liga os pontos A e C. Também pode ser usado como \path no começo de uma linha. Tudo o que vem depois terá o nome que \path vai determinar.
  • \usetikzlibrary{intersections} usa a biblioteca intersections para encontrar pontos de interseção entre segmentos e curvas. Por exemplo, o código \path [name intersections={of=AC and BD,by=I}] nomeia como I (by=I) a interseção entre AC e BD (of=AC and BD).

Texto

  • É possível escrever em sequência, separados por um espaço, vários comandos node após \draw, como em \draw (A) node {A} (B) node {B} (C) node {C}; e assim por diante.

Decoração

  • [red, dotted, thick] – vermelho (red), pontilhado (dotted) e grosso (thick). Como já sabemos, dividimos com uma vírgula vários atributos de uma linha.

Exercícios

Nada melhor para entender um código do que modificá-lo:

  • Comece a desenhar o pentágono a partir do ponto B. Ou seja, comece com \draw (0:1) coordinate B -- (72:1) coordinate C e termine o pentágono. Cada novo ângulo é acrescido de 72o, o ângulo externo de um pentágono regular.
  • Mude a escala, alterando o valor de scale. Amplie e reduza a figura.
  • Trace a diagonal CE, nomeando-a com CE.
  • Encontre a interseção entre BD e CE e nomeie-a de J.
  • Repita esses passos para encontrar as demais interseções, a serem nomeadas como K, L e M. Desenhe um círculo vermelho em cada uma delas.
  • Encare o desafio a seguir, pois você já está perto de completá-lo!

DESAFIO!

O desafio deste capítulo é reproduzir a seguinte ilustração:

Fig. 5.17 – Desafio!

A dica é repetir 5 vezes as linhas de código que foram usadas para encontrar o ponto I, mas renomeando os segmentos e dando novos nomes às interseções. Depois é só estilizar as diagonais com dotted e o pentágono interno com red. O pentágono interno é criado ligando os pontos I, J, K, L e M.

Próximo capítulo