Escolar Documentos
Profissional Documentos
Cultura Documentos
PS
PS
versão 1.1
1
4.2 Elipses......................................................................................................... 35
4.3 Efeitos de sombra.......................................................................................36
4.4 Curvas de Bézier......................................................................................... 37
4.5 Exercícios.................................................................................................... 39
Capítulo 5............................................................................................................... 40
Transformações ............................................................................................... 40
5.1 O ponto corrente ........................................................................................ 40
5.2 Translação .................................................................................................. 41
5.3 Rotação ...................................................................................................... 42
5.4 Ampliação e redução...................................................................................46
5.5 Reflexão...................................................................................................... 47
5.6 Exercícios.................................................................................................... 48
Capítulo 6............................................................................................................... 49
Elementos de programação..............................................................................49
6.1 O comando de repetição repeat .................................................................49
6.2 Procedimentos............................................................................................ 53
6.3 Arrays (vetores)........................................................................................... 54
6.4 Exercícios.................................................................................................... 57
Capítulo 7............................................................................................................... 58
Fontes............................................................................................................... 58
7.1 Fontes PostScript........................................................................................ 58
7.2 Principais comandos...................................................................................58
7.3 Outros comandos........................................................................................ 61
7.4 Exercícios.................................................................................................... 62
Capítulo 8............................................................................................................... 63
Acabamentos, cores e clipping.........................................................................63
8.1 Acabamentos............................................................................................... 63
8.2 Cores........................................................................................................... 65
8.3 Clipping....................................................................................................... 66
8.4 Exercícios.................................................................................................... 68
Bibliografia ............................................................................................................. 69
Apêndices .............................................................................................................. 71
A - Preparando o ambiente ..............................................................................71
B - Trabalhando com PostScript .......................................................................73
Trabalhando interativamente .......................................................................73
C – Fontes PostScript.......................................................................................74
D - Criando um arquivo EPS.............................................................................76
3
Introdução
Para explicar conteúdos de matemática, professores frequentemente fazem uso
de ilustrações. Seja desenhada no quadro negro ou na forma de slides, uma boa
figura permite a representação e a interpretação dos elementos de uma ideia que
se apresenta à compreensão do aluno. Como elementos essenciais na geometria
ou como metáforas em outras áreas, ilustrações de conceitos matemáticos são
vistas, desde a antiguidade, como um dos melhores auxílios que uma pessoa
pode ter durante seu esforço de aprendizado.
Desde o nascimento da era do computador pessoal, no idos dos anos de
1970, matemáticos e cientistas da computação têm se dedicado à criação de mei-
os computacionais que facilitem a criação de figuras. E cada vez mais, computa-
dores têm-nos permitido produzir material ilustrativo de excelente qualidade para
uma gama crescente de assuntos e públicos, ampliando e fortalecendo o campo
da educação em praticamente todas as áreas.
Destacando-se no campo da informação visual e no desenvolvimento de
tecnologias voltadas a esse fim, a empresa americana Adobe Systems Incorpora-
ted criou, na década de 1980, a linguagem de programação PostScript, especifica-
mente voltada para a visualização de informações. Desde então, a Adobe Systems
– a mesma empresa que posteriormente criou o formato PDF – vem desenvolven-
do a linguagem, que se encontra atualmente em sua terceira versão, e fornecendo
ao público gratuitamente excelentes manuais para seu aprendizado (Adobe Sys-
tems, 1985, 1988, 1999).
A linguagem PostScript fornece uma gama de comandos específicos para
o desenho de letras e figuras, incluindo comandos de traçado e formas de repre-
sentação de imagens. É uma linguagem de programação completa, interpretada,
simples e fácil de aprender. Alguns poderiam dizer, como de fato dizem (Adobe
Systems, 1985), que a PostScript pode ser abordada inicialmente como uma varia-
ção da linguagem LOGO, à qual foram acrescentados novos e avançados recur-
sos. Um programa de edição de texto simples e um interpretador gratuito são mais
do que suficientes para operarmos com a linguagem em sua plenitude.
Foi com as obras de Bill Casselman (Casselman, 2000 e 2005) que a
PostScript foi redescoberta como a linguagem fundamental da ilustração matemá-
tica, a despeito das alternativas usuais advindas da comunidade de usuários do
sistema de tipografia LaTeX, como os pacotes de macros PStricks e PGF/TikZ, ou
as linguagens MetaFont e MetaPost. Ainda que programas comerciais geradores
de gráficos matemáticos, como o Maple, o Mathematica e o MatLab sejam capa-
zes de produzir belíssimas ilustrações, apenas a PostScript permite o controle fino
do processo de desenho, produzindo resultados impossíveis de serem atingidos
satisfatoriamente por qualquer outro programa.
O que nos interessa aqui, neste livro, é mostrar uma resposta satisfatória à
pergunta: por que usar PostScript no ensino de matemática? Como nos informa
Casselman no prefácio de seu livro Mathematical Illustrations: A Manual of Geo-
metry and PostScript (2005), uma boa ilustração matemática sempre requer mate-
mática no processo de desenho. Esse aspecto da criação e da programação de
ilustrações captou nossa atenção desde nossos primeiros contatos com a lingua-
gem. A necessidade de usar matemática para ilustrar matemática faz da PostScript
uma excelente ferramenta para não só explicar, mas também descobrir matemáti-
ca.
Aprender PostScript é uma atividade estimulante, facilmente integrada
com diversas outras metodologias de ensino de matemática. Por exemplo, a habili-
dade de desenhar algoritmicamente nos permite criar figuras que esclarecem os
argumentos de textos matemáticos. Tentar criar ilustrações para obras centrais da
matemática clássica, como os Elementos, de Euclides, ou os Principia, de Newton,
obriga o estudante a compreender a argumentação do autor, criando um envolvi-
mento ativo e criativo no processo de aprendizagem.
O campo de uso da PostScript é bastante amplo. Pelo menos quatro clas-
ses de profissionais podem ser beneficiadas pelo aprendizado da linguagem:
• cientistas de várias áreas que precisam criar uma grande quantidade
de ilustrações, e que gostaria de ter uma outra alternativa computacio-
nal além dos programas convencionais;
• professores em qualquer nível de aprendizado que desejam tornar a
matemática mais compreensível e interessante a seus alunos;
• estudantes que desejam ver como a matemática, mesmo elementar,
pode ser aplicada a problemas reais interessantes, e
• artistas e designers gráficos interessados em arte algorítmica ou mes-
mo carentes de novos instrumentos para suas produções gráficas.
Em vista do que foi dito, este livro pretende promover o estudo das geo-
metrias através da criação de ilustrações. E não só as geometrias euclidiana e
analítica planas podem sair beneficiadas, mas também as geometrias projetiva e a
hiperbólica, uma vez que a linguagem PostScript é flexível o bastante para incor-
porar módulos, desenvolvidos por terceiros, que permitem a manipulação de ima-
gens mais avançadas.
5
Capítulo 1
Os fundamentos da linguagem
Antes de iniciarmos a criação de gráficos, vamos primeiro explorar alguns concei-
tos fundamentais da linguagem PostScript, como o sistema de coordenadas, a uni-
dade medida e os principais operadores de que ela se serve para realizar dese-
nhos e construções geométricas. Todos os capítulos seguintes dependem de uma
boa compreensão dos conceitos aqui apresentados.
Também essencial ao aprendizado é o bom funcionamento dos programas
utilizados para a geração de gráficos. Certifique-se de ter lido e compreendido o
Apêndice A para poder trabalhar com eficiência na programação com PostScript.
7
além de uma unidade de medida, será visto como um elemento gráfico distinto,
possuindo comprimento e largura, ainda que diminutos. Apesar de imaginarmos
pontos PostScript como pequenos retângulos empilhados uns sobre os outros,
não devemos confundi-los com os pixels da tela do computador.
A unidade de medida ponto PostScript será posteriormente substituída pe-
las unidades de medida usuais como o milímetro e o centímetro. Por ora, lembre-
se apenas de que uma polegada, equivalente a aproximadamente 2,5 cm, contém
72 pontos PostScript.
7 + 5
7 5 +
7 5 add
1.4 A pilha
O uso da notação pós-fixa é uma consequência da maneira como os dados em
PostScript são armazenados na memória do computador, em uma estrutura co-
nhecida como pilha.
Os dados em PostScript vão para a memória do computador como se fos-
sem empilhados uns sobre os outros, como em uma pilha de pratos. Quando pre-
cisamos de um prato, costumamos tirar primeiro o prato de cima, para depois tirar
o de baixo. Ou seja, o último prato a ser empilhado é o primeiro a ser desempilha -
do. Essa maneira simples de estruturar os dados na memória do computador é
chamada de estrutura LIFO, do inglês last in, first out (último a entrar, primeiro a
sair).
Precisamos entender bem como essa estrutura funciona. No lugar de uma
pilha de pratos, imaginemos uma fila de livros que vão sendo colocados na estante
um após o outro, da esquerda para a direita:
| | | | | ... etc.
Em PostScript, vamos usar essa metáfora para entender o código que es-
crevemos. Primeiro colocamos os dados um após o outro na pilha (ou estante)
7 5
7 5 add
12 5 sub
9
Operações aritméticas mais complexas devem ser cuidadosamente anali-
sadas, para que a entrada de dados na pilha seja feita com correção. Por exem -
8
plo, a operação deve ser notada como
7−3
8 7 3 sub div
8
8 7
8 7 3
8 7 3 sub
8 4
8 4 div
2
Observe que os operadores sub e div, assim que entram na pilha, operam
imediatamente sobre os dois dados mais próximos à esquerda, deixando o resulta-
do na pilha antes da entrada dos dados e operadores seguintes.
Pode ser necessário realizar uma troca de elementos na pilha, eliminar um
deles, duplicar um outro, e assim por diante, em operações aritméticas. Sera ne -
cessário, portanto, alterar a ordem dos dados na pilha, através de operadores cria-
dos exclusivamente para esse fim. A lista abaixo mostra alguns dos mais usados
operadores:
14 2 5 add div
2 5 add 14 exch div
14
Qualquer uma das duas linhas de código acima realiza a operação .
25
A segunda, porém, segue um pouco mais a lógica que utilizamos no dia a dia, rea-
lizando primeiro a soma no denominador e depois a divisão. Vejamos um esquema
passo a passo dessa operação:
2
2 5
2 5 add
7
7 14
7 14 exch
14 7
14 7 div
2
1.5 Exercícios
1. Escreva as operações abaixo em PostScript:
6
a) 7−
2
6
b) −7
2
11
5 2
c) −
2 5
5−2
d)
2−5
newpath
Após esse comando, podemos imaginar que uma mão passou a segurar
um lápis. Vamos imaginar também que a ponta desse lápis não escreve com grafi-
te ou tinta, mas é feita de aço ou de outro material que marca a folha, deixando
nela um leve sulco.
Agora vamos desenhar um segmento de reta horizontal de 100 pontos a
partir das coordenadas (300, 500). Primeiro, devemos mover a ponta do lápis até
lá usando o comando moveto:
13
300 500 moveto
Em verdade, o segmento ainda não foi traçado. Apenas um sulco foi feito
sobre a folha, uma marca que será posteriormente preenchida com tinta. A ponta
do lápis está agora sobre o ponto (400, 500), esperando o próximo comando.
O comando stroke preenche com tinta as marcações feitas. Após os qua-
tro comandos
newpath
300 500 moveto
400 500 lineto
stroke
figura 2.1-a
Após passar tinta sobre as marcas criadas, o comando stroke retira o lá-
pis do papel e "esquece" as indicações dadas. É preciso um outro newpath para
realizar um novo desenho. Uma folha pode conter vários desenhos, cada um en -
volvido por um par de comandos newpath e stroke.
Suponha agora que, antes de finalizar o desenho, você queira traçar mais
um segmento, paralelo ao primeiro, mas 20 pontos acima.
Lembre-se que, após o comando 400 500 lineto, a ponta do lápis imaginá-
rio está exatamente sobre essas coordenadas, ou seja, sobre o ponto de coorde-
nadas (400, 500). É necessário mover a ponta do lápis 100 pontos para trás (sub-
traindo 100 da coordenada 400) e 20 pontos para cima (somando 20 à coordena-
da 500):
newpath
300 500 moveto
400 500 lineto
300 520 moveto % move novamente o lápis
400 520 lineto % marca um novo segmento
stroke
-100 20 rmoveto
figura 2.1-b
Suponha agora que, em vez de traçar uma paralela, você queira traçar um
segmento de reta para cima, como o tamanho de 100 pontos. Você tem duas alter-
nativas: escrever, logo após 400 500 lineto, uma das linhas
ou
15
0 100 rlineto
newpath
300 500 moveto
400 500 lineto
0 100 rlineto % marca um segmento vertical
stroke
gerando a figura
figura 2.1-c
newpath
300 500 moveto
100 0 rlineto % inicia a marcação de 4 segmentos
0 100 rlineto
-100 0 rlineto
0 -100 rlineto
stroke
figura 2.1-d
newpath
300 500 moveto
100 0 rlineto
0 100 rlineto
-100 0 rlineto
closepath % fecha o caminho traçado
stroke
newpath
300 500 moveto
100 0 rlineto
0 100 rlineto
-100 0 rlineto
closepath
fill % preenche o caminho traçado
17
figura 2.1-e
2.2 Pontos
Em PostScript, um ponto é visto como um segmento de reta de tamanho
1, em qualquer direção. Se desejamos colocar um ponto nas coordenadas (100,
100), começamos dizendo ao interpretador que desejamos realizar um desenho,
movemos o lápis até as coordenadas (100, 100), marcamos sobre a folha um seg-
mento de dimensão 1, e preenchemos com tinta:
newpath
100 100 moveto
1 0 rlineto % marca um segmento de tamanho 1
stroke
newpath
10 cm 15 cm moveto
5 cm 0 cm rlineto
0 cm 5 cm rlineto
-5 cm 0 cm rlineto
closepath
stroke
19
O comando def atribui um nome a um conjunto de instruções. Sua sintaxe
é bem simples:
que é equivalente a
pois dividir por 2,54 e multiplicar por 72 é o mesmo que multiplicar por 72/2,54 =
28,34646, ou ainda, aproximadamente por 28,35. Isso significa que quando quere -
mos um segmento de 3 cm, precisamos multiplicar 3 por 28,35 para encontrarmos
o valor em pontos. Como podemos perceber, há aproximadamente 28,35 pontos
PostScript em 1 cm.
Atribuímos ao nome cm o conjunto de instruções 28.35 mul. Observe que
há uma barra / antes do nome e chaves ao redor do conjunto de instruções. Com
isso, em vez de escrevermos
escrevemos apenas
10 cm 15 cm moveto
2.4 Exercícios
Os exercícios seguintes foram planejados de maneira a exigirem do programador
conhecimentos específicos de matemática. A ajuda de bons livros de geometria
euclideana plana e de geometria analítica talvez sejam indispensáveis. O aprendi-
zado de matemática, lembremos, é um dos objetivos deste livro.
2. Desenhe um triângulo:
a) equilátero
b) retângulo com a hipotenusa paralela à base da “folha de papel”
c) com lados na proporção 3:5:7
4. Faça uma ilustração para o teorema de Tales: “Se duas retas são transversais
de um feixe de retas paralelas, então a razão entre dois segmentos quaisquer de
uma delas é igual à razão entre os respectivos segmentos correspondentes da ou-
tra.”
21
Capítulo 3
Linhas retas (II)
Neste capítulo aprenderemos como alterar o estilo de uma linha, em função de
uma melhor apresentação gráfica das ilustrações.
Vamos estudar também os comandos gsave e grestore, dando os primei-
ros passos para a simplificação de nossos programas.
3.1.1 setgray
O comando que especifica se uma linha será mais clara do que outra é o
setgray. Esse comando é usado com um número entre 0 e 1, que específica tons
de cinza, entre o preto (0) e o branco (1).
Retome o programa das paralelas, usando agora rmoveto e rlineto, e
acrescente antes do stroke o comando 0.7 setgray:
newpath
300 500 moveto
100 0 rlineto
-100 20 rmoveto
100 0 rlineto
0.7 setgray % estabelece uma tonalidade de cinza
stroke
figura 3.1.1-a
Executando o programa sem 0.7 setgray, você verá duas paralelas pretas;
com 0.7 setgray, as paralelas tomaram a tonalidade cinza claro. O comando 0.7
setgray veio antes de stroke apenas para nos lembrarmos que é o comando
stroke que realiza o desenho, e que a ele informamos que a tonalidade deveria
ser 0.7.
Se você deseja que um segmento seja claro e o outro escuro, por enquan-
to você deve fazer dois desenhos:
newpath
300 500 moveto
100 0 rlineto
stroke
newpath
300 520 moveto
100 0 rlineto
0.7 setgray
stroke
figura 3.1.1-b
23
3.1.2 setlinewidth
Também a espessura das linhas pode ser alterada. Se desejamos que
nossas linhas tenham a espessura de 10 pontos PostScript, simplesmente escre-
vemos
10 setlinewidth
newpath
300 500 moveto
100 0 rlineto
10 setlinewidth % estabelece a espessura da linha
stroke
figura 3.1.2-a
figura 3.1.2-b
newpath
300 500 moveto
100 0 rlineto
10 setlinewidth
stroke
newpath
300 520 moveto
100 0 rlineto
0.7 setgray
stroke
figura 3.1.2-d
25
não esquece de detalhes como cor, espessura e estilo de linha. Esses dados con-
tinuam guardados na memória do computador para uso futuro, e são chamados de
estado gráfico do desenho.
Portanto, se você deseja uma linha clara com a espessura de 1 ponto,
será necessário escrever 1 setlinewidth antes de stroke na segunda parte do de-
senho. Faça isso agora e visualize o resultado.
3.1.3 setdash
Quando precisamos de linhas tracejadas ou pontilhadas, usamos o co-
mando setdash. Vamos traçar um quadrado e depois uma de suas diagonais com
uma linha tracejada:
newpath
300 500 moveto
100 0 rlineto
0 100 rlineto
-100 0 rlineto
closepath
stroke
newpath
300 500 moveto
100 100 rlineto
[5 4] 0 setdash % cria um padrão de traços e espaços
stroke
figura 3.1.3
figura 3.2
27
isso? Por enquanto, são necessários 2 desenhos, um para o preenchimento e ou-
tro para a moldura:
newpath
300 500 moveto
100 0 rlineto
0 100 rlineto
-100 0 rlineto
0.5 setgray
fill
newpath
300 500 moveto
100 0 rlineto
0 100 rlineto
-100 0 rlineto
closepath
0 setgray
10 setlinewidth
stroke
newpath
300 500 moveto
100 0 rlineto
0 100 rlineto
-100 0 rlineto
closepath
gsave % salva o estado gráfico
0.7 setgray
fill
grestore % restaura o estado gráfico
10 setlinewidth
stroke
As seis primeiras linhas são as marcações iniciais do quadrado que dese-
jamos preencher. Nesse momento, a PostScript também assume que a espessura
da tinta sobre essas marcações será, futuramente, de 1 ponto (1 setlinewidth) e
será da cor preta (0 setgray). Até que informemos mais coisas, esse é o atual es-
tado gráfico do desenho.
Quando usamos o comando gsave, pedimos à PostScript que armazene
na memória esse atual estado gráfico: as marcações feitas mais as características
de espessura e cor assumidas. Agora vamos fazer algumas alterações nesse esta-
do gráfico.
Quando escrevemos 0.7 setgray e fill, ordenamos à PostScript que mude
a cor, de preto para um cinza claro, e que preencha as marcações com esse tom
de cinza. O estado gráfico foi claramente alterado.
Logo depois, aparece o comando grestore, que traz de volta todo o esta-
do gráfico anterior ao gsave: todas as marcações feitas, a espessura e a cor da
tinta. É como se depois do closepath pulássemos diretamente para o comando 10
setlinewidth, que informará ao comando stroke que a linha ser pintada tem a es-
pessura de 10 pontos.
Em um primeiro momento, os comando gsave e grestore podem parecer
confusos, mas a experiência com a linguagem os tornará mais claros. Como disse-
mos, a divisão de um desenho em várias partes é uma boa alternativa para criar -
mos códigos mais simples e mais legíveis. Mas haverá momentos em que os co -
mando gsave e grestore, inteligentemente utilizados, serão a única alternativa
para realizarmos desenhos matemáticos complexos.
Como exercício, reescreva os programas das seções 3.1.2 e 3.1.3 com os
comandos gsave e grestore.
3.3 Exercícios
1. Desenhe um triângulo escaleno obtusângulo. Em relação ao maior lado, dese-
nhe, em um tom de cinza:
a) a mediana
b) a mediatriz
c) a altura
29
d) um trapézio qualquer
4.1.1 arc
O comando arc desenha arcos que variam de 0 o a 360o, em sentido anti-
horário. Esse comando opera com 5 parâmetros: as coordenadas do centro da cir-
cunferência, o raio da circunferência e os ângulos inicial e final, nessa ordem.
Como exemplo, o comando para desenhar um arco de 90o de uma circun-
ferência de raio igual a 50 pontos com centro no ponto (300, 400) é
figura 4.1.1-a
31
O comando começou com as coordenadas do centro da circunferência,
(300, 400). Logo depois, informamos o valor do raio, 50, e dissemos que o arco
começaria em 0o e terminaria em 90o. O programa todo é, simplesmente,
newpath
300 400 50 0 90 arc % arco de 90 graus, raio 50
stroke
figura 4.1.1-b
newpath
300 400 50 0 90 arc
[5 5] 0 setdash
stroke
figura 4.1.1-c
Observe como o primeiro e o último traço formaram um traço maior logo
no início do arco. Podemos ajustar isso alterando o número imediatamente anteri-
or ao comando setdash ou o mudando padrão de brancos e pretos do comando.
Teste alguns valores até conseguir uma figura que lhe seja conveniente.
Se desejamos desenhar um anel, basta traçarmos um arco mais largo,
com o uso do comando setlinewidth. Vamos desenhar um anel circular com uma
linha de 30 pontos de espessura:
newpath
300 400 40 0 360 arc
30 setlinewidth
stroke
figura 4.1.1-d
Observe a pequena fenda à direita. Isso pode ser corrigido com o coman-
do closepath. Acrescente-o logo depois do comando arc, e veja como a fenda
some. Com figuras fechadas, use sempre com o comando closepath, mesmo lhe
pareçendo redundante.
Como o comando lineto, o comando arc é responsável por realizar ape-
nas uma marcação invisível no papel, sobre a qual o comando stroke passará um
pincel com tinta. Se queremos desenhar um anel circular, não devemos simples-
mente aumentar a espessura da linha, como fizemos na figura 4.1.1-d acima, mas
desenhar dois círculos com fill, um com a cor preta e outro com a cor branca.
Vamos desenhar uma coroa circular com raio externo de 2 cm e raio inter-
no de 1 cm. Lembremo-nos de usar o comando def para transformar a medida
"cm" em pontos.
33
newpath
300 400 2 cm 0 360 arc % circunferência externa
fill % preenche a circunf. externa
300 400 1 cm 0 360 arc % circunferência interna
1 setgray % define a cor branca
fill % preenche a circunf. interna
figura 4.1.1-e
4.1.2 arcn
O comando arcn é como o comando arc, mas a contagem do ângulo é fei-
ta em sentido horário. O programa abaixo é o mesmo que gerou a figura 4.1.1-a
com o comando arc substituído pelo comando arcn:
newpath
300 400 50 0 90 arcn
stroke
figura 4.1.2
4.2 Elipses
A PostScript é capaz de desenhar elipses através de um truque simples:
primeiro, desenhamos uma circunferência, depois “achatamos” sua altura ou seu
comprimento. Isso é conseguido com o comando scale:
newpath
1 0.3 scale % reduz a “altura” da circ. em 30%
300 400 80 0 360 arc
stroke
figura 4.2.1
35
4.3 Efeitos de sombra
Um dos artifícios usados para se criar a ilusão de tridimensionalidade é a
presença de sombras no desenho. Em PostScript, esse efeito é conseguido por
meio de três desenhos sobrepostos, começando de baixo para cima: primeiro de-
senhamos a sombra, deslocada alguns pontos para a direita e para baixo, depois
desenhamos o interior branco do desenho e, por fim, desenhamos o contorno. Ob-
serve o código abaixo, escrito como três desenhos distintos por questões mera-
mente didáticas:
newpath % a sombra
305 395 50 0 360 arc
fill
stroke
newpath % o interior
300 400 50 0 360 arc
1 setgray
fill
stroke
newpath % o contorno
300 400 50 0 360 arc
0 setgray
stroke
figura 4.3.1
figura 4.4-a
Na curva da figura 4.4.1-a acima, temos os pontos P0 e P3 como pontos
inicial e final, respectivamente, e os pontos P1 e P2 como pontos de controle. Vi-
sualmente, a curva parece ser "atraída" pelos pontos de controle, sem passar por
eles, e se ligar aos pontos inicial e final tangenciando as linhas pontilhadas.
Se invertemos os pontos P1 e P2, a situação se modifica bastante:
figura 4.4-b
37
Agora a curva parte de P0 em direção a P1, é atraída por P2 e depois se
dirige a P3. É difícil prevermos o comportamento de curvas de Bézier, mesmo en-
tendendo suas equações. A maioria das vezes, usamos essas curvas por tentativa
e erro, mas depois de alguma prática acabamos com uma boa noção acerca de
seu funcionamento.
Observe agora o que ocorre quando unimos o ponto inicial ao ponto final:
figura 4.4-c
newpath
P0 moveto % move lápis até o ponto P0
P1 P2 P3 curveto % P1 e P2 de controle, P3 final
stroke
2. Desenhe:
a) duas coroas circulares concêntricas
c) meia coroa circular
d) duas meias coroas circulares afastadas uma da outra em 1 mm
3. Desenhe:
a) um setor circular de 60o
b) um segmento circular de 60o
c) uma circunferência e seu diâmetro
4. Desenhe:
a) um triângulo retângulo escaleno inscrito em uma semicircunferência
b) uma circunferência, um ângulo central de 60 o e um ângulo inscrito de 30o
c) uma circunferência e duas cordas concorrentes que não sejam diâmetros
6. Desenhe uma circunferência usando curvas de Bézier. Compare-a com uma cir-
cunferência criada com o comando arc.
39
Capítulo 5
Transformações
Transformações planas como translações, rotações, homotetias e reflexões são
extremamente importantes do ponto de vista geométrico. Elas nos proporcionam
meios econômicos de realizarmos muitas ilustrações matemáticas. Este capítulo
introduz o uso das principais transformações no âmbito da linguagem PostScript.
figura 5.2-a
41
figura 5.2-b
Com esse novo sistema, um ponto de coordenadas (300, 600), por exem-
plo, passa a ter coordenadas (100, 350), pois a origem do sistema se aproximou
dele 200 pontos na horizontal e 250 pontos na vertical.
Para ser executado, o comando translate usa os dois últimos números da
pilha. Se movermos a ponta de nosso lápis para as coordenadas (400, 500) e logo
depois acionarmos o comando currentpoint, teremos na pilha os números 400 e
500. O comando translate logo em seguida fará com que nosso sistema seja des-
locado para o ponto (400, 500). Assim, escrever
é equivalente a
5.3 Rotação
Como a translação, a rotação age sobre o sistema de coordenadas, giran-
do-o em sentido anti-horário. O comando que realiza a rotação é o rotate.
Volte à figura 5.2-a. Nela, a origem dos eixos coordenados está no canto
inferior esquerdo da folha de papel. O comando
45 rotate
figura 5.3-a
newpath
60 rotate
0 0 moveto
200 0 rlineto
stroke
43
figura 5.3-b
newpath
100 100 moveto % move lápis para (100, 100)
currentpoint translate % translada para (100, 100)
50 0 rlineto % marca uma linha de 50 pontos
72 rotate % rotaciona o sistema em 72o
currentpoint translate % translada para a extremidade
50 0 rlineto
72 rotate
currentpoint translate
50 0 rlineto
72 rotate
currentpoint translate
50 0 rlineto
72 rotate
closepath
2 setlinewidth
stroke
figura 5.3-c
figura 5.3-d
figura 5.3-e
45
Assim, garantiríamos que a origem do nosso sistema se encontra exatamente nas
coordenadas iniciais do desenho. Se desejamos que a origem volte para o canto
inferior esquerdo da página, fazemos
x y scale
newpath
4 1 scale % multiplica por 4 na horizontal
% e 1 na vertical
50 50 moveto
50 0 rlineto
0 50 rlineto
-50 0 rlineto
closepath
stroke
Esse programa começa com o comando 4 1 scale. Isso significa que qua-
druplicamos as dimensões do ponto na horizontal, e mantemos a espessura 1 na
vertical. Nesse novo sistema, uma linha de 50 pontos na horizontal será 4 vezes
maior do que uma linha com 50 pontos na vertical. Por isso, apesar de traçarmos
um quadrado de lado 50, teremos, na prática, um retângulo de proporções 4:1,
como na figura a seguir:
figura 5.4
5.5 Reflexão
O comando scale, como vimos, tem 2 argumentos: um para ampliação ou
redução na direção x, e outro na direção y. Podemos utilizá-lo para espelhar uma
figura em relação a um desses eixos. Por exemplo, considere o triângulo retângulo
abaixo:
figura 5.5-a
47
figura 5.5-b
basta acrescentarmos a linha
-1 1 scale
5.6 Exercícios
1. Usando o comando translate pelo menos duas vezes no código do programa,
desenhe:
a) três segmentos de reta paralelos
b) três quadrados unidos por um de seus vértices
c) três circunferências de mesmo raio tangentes entre si duas a duas
currentpoint translate
50 0 rlineto
72 rotate
newpath
100 100 moveto
currentpoint translate
50 0 rlineto
72 rotate
currentpoint translate
50 0 rlineto
49
72 rotate
currentpoint translate
50 0 rlineto
72 rotate
currentpoint translate
50 0 rlineto
72 rotate
currentpoint translate
50 0 rlineto
72 rotate
closepath
stroke
número { ...
...
... } repeat
em que número é o numero de vezes que o código entre as chaves devem ser re-
petidos.
No programa do pentágono, esse comando é utilizado assim:
newpath
100 100 moveto
5 { currentpoint translate % início do repeat
50 0 rlineto
72 rotate } repeat % fim do repeat
closepath
stroke
newpath
100 100 moveto
72 rotate % rotação inicial
5 { currentpoint translate % início do repeat
100 0 rlineto % lado de 100 pontos
-144 rotate } repeat % fim do repeat
closepath
stroke
ou seja, é uma estrutura como a do repeat, mas toma três números, chamados
início, passo e fim, para funcionar.
O início indica de que número partimos, e o fim, o número que desejamos
atingir. O passo indica o tamanho do “pulo” que damos até chegar lá. Por exem-
51
plo, se os número são 0 10 50, isso significa que, partindo de 0, avançaremos de
10 em 10 até alcançarmos 50, ou seja, geraremos a sequência 0, 10, 20, 30, 40,
50. Um exemplo vai esclarecer melhor esse comando.
Suponha que você deseja desenhar a figura seguinte:
figura 6.1-b
0 0 moveto
70 0 rlineto
6 rotate
ou seja, movemos o lápis para a origem das coordenadas, traçamos uma linha de
70 pontos, e giramos os eixos. Fazemos isso 60 vezes, o que nos dá o programa
completo:
newpath
200 200 translate
0 0 moveto
1 1 60 {
0 0 moveto
70 0 rlineto
6 rotate} for
stroke
6.2 Procedimentos
Vimos que o comando def é usado para dar um nome a trechos de código,
nome que pode ser usado no corpo do programa como um novo comando. Em
nossa definição de centímetro
o trecho de código {28.35 mul} ganha o nome cm. Sempre que o interpretador en-
contra cm no código, imediatamente o substitui por {28.35 mul}. Essa ideia pode
ser generalizada. No lugar de apenas um pequeno trecho de código, podemos de -
finir procedimentos inteiros.
Por exemplo, o trecho repetitivo que desenha a estrela
currentpoint translate
100 0 rlineto
-144 rotate
53
72 rotate
5 {lado} repeat % usando o procedimento lado
closepath
stroke
[20 40 70 10 50]
Agora podemos usar a palavra dados para nos referirmos ao vetor que
nos interessa. Futuramente, quando desejarmos trocar os dados, bastará substituir
o vetor original por outro.
Logo em seguida, vamos escrever o programa que realizará o gráfico:
newpath
100 100 translate
0 0 moveto
20 setlinewidth
dados {barra} forall % comando forall
stroke
55
Vamos explicar seu funcionamento, que é bem simples.
O comando forall percorre o vetor, do primeiro ao último elemento, e colo-
ca na pilha o elemento da vez. No começo, ele encontra o primeiro elemento, 20, e
o coloca na pilha. Agora tem início o procedimento barra: ele duplica o elemento
com o comando dup, acrescenta 0 à pilha e, com o comando exch, troca de posi-
ção os dois últimos elementos. Nesse momento, a pilha é
20 0 20
30 -20
% rotina principal
newpath
100 100 translate
0 0 moveto
20 setlinewidth
vetor {barra} forall
stroke
57
Capítulo 7
Fontes
Fontes constituem um assunto extenso na linguagem PostScript. Em verdade, a
PostScript foi criada com a intenção de servir como instrumento de formatação de
textos, e apenas secundariamente como ferramenta de desenho digital.
Apesar da extensão do assunto e da profusão de comandos da linguagem
PostScript que manipulam fontes, estudaremos neste capítulo apenas aqueles que
nos permitem imprimir letras na tela, e com isso nomear pontos, segmentos, cir-
cunferências e todos os demais elementos gráficos que servem à nossa intenção
de criar ilustrações matemáticas.
/Helvetica findfont
59
Com isso, devemos ver o texto “Eis aqui um texto!” localizado na posição
(200, 300) de nossa folha. A posição (200, 300) se refere ao canto inferior esquer-
do do texto todo.
Para desenhar mais um texto, digamos, 15 pontos abaixo do texto anterior,
basta movermos a ponta do lápis até lá e escrever:
figura 7.2-a
irá imprimir “Eis aqui um texto!” nas coordenadas (200,300) – agora a nova origem
de nosso sistema – girado 45o no sentido anti-horário:
figura 7.2-b
Um comando como, por exemplo, -1 1 scale, poderá ser usado livremente,
como em um desenho qualquer:
figura 7.2-c
Enfim, sobre textos podemos operar exatamente como com qualquer outro
elemento gráfico.
e mostra na tela o mesmo texto, mas agora com as letras separadas 12 pontos
umas das outras na direção horizontal:
figura 7.3-a
61
/Helvetica findfont 24 scalefont setfont
200 300 moveto
(Eis aqui um texto!) true charpath
stroke
figura 7.3-b
Observe que o comando charpath foi precedido não só do texto a ser im-
presso, mas da palavra true.
7.4 Exercícios
1. Desenhe um triângulo escaleno e rotule seus vértices as letras A, B e C.
2. Coloque as letras X e Y nos eixos da figura 1.1.
3. Nomeie os elementos do Teorema de Tales dos exercícios da seção 2.4.
4. Coloque as letras A, B, C, D, e E nos vértices da estrela da figura 6.1
5. Escreva seu nome espelhado.
Capítulo 8
Acabamentos, cores e clipping
Neste capítulo, vamos tratar de comandos que interferem diretamente na apresen-
tação das ilustrações, principalmente no seu acabamento e na sua cor, levando
uma qualidade estética superior às ilustrações.
Apresentamos também o conceito de clipping (recorte), em que usamos
uma figura para delimitar outra.
8.1 Acabamentos
Há três tipos de terminações para uma linha qualquer: linhas sem termina-
ção, linhas com terminação arredondada e linhas com terminação quadrada, como
nos mostra a figura a seguir:
figura 8.1-a
63
A linha de cima mostra extremidades “quadradas” com um ligeiro acrésci-
mo em seu tamanho. Tanto neste quanto no acabamento anterior, o caminho é
“envolvido” pela tinta, o que não acontece no acabamento padrão.
As diferenças entre um e outro acabamento são conseguidas com o co-
mando setlinecap, com os argumentos 0 (o padrão), 1 ou 2. Por exemplo, a linha
do meio é conseguida com o comando
1 setlinecap
figura 8.1-b
2 setlinejoin
1 0 0 setrgbcolor
figura 8.2-a
Retome o programa que gerou a figura 3.2. Suponha agora que você de-
seja um quadrado amarelo cercado por uma borda azul. No lugar de setgray, você
deveria usar, para o amarelo,
1 1 0 setrgbcolor
e, para o azul,
0 0 1 setrgbcolor
gerando a figura
figura 8.2-b
65
No padrão RGB, o amarelo é criado pela adição de vermelho e verde.
Quais cores são criadas pela adição de vermelho e azul, e verde e azul? Teste
com o programa acima, e confira.
Observe também que escrever 0.5 0.5 0.5 setrgbcolor produz o mesmo
efeito de 0.5 setgray. Cinzas são criados com a adição de partes iguais de verme-
lho, verde e azul.
Existem outros sistemas de cores, mas é importante conhecer bem o pa-
drão RGB, usado também nos códigos de cores da linguagem HTML.
8.3 Clipping
Suponha que você deseja cria uma figura como a seguinte
figura 8.3-a
Como isso pode ser feito? O trabalho de calcular o tamanho de cada raio
parece muito difícil. Não seria melhor se desenhássemos primeiro
figura 8.3-b
e depois recortássemos um quadrado lá de dentro?
É exatamente essa a ideia de clipping: um recorte. Primeiro desenhamos a
figura com o programa
newpath
200 200 translate
0 0 moveto
72 {0 0 moveto
70 0 rlineto
5 rotate} repeat
stroke
Observe que o quadrado que será recortado termina com o comando clip,
indicando que aquele é um caminho de recorte, não um caminho sobre o qual será
passada tinta com o comando stroke. O programa completo fica
newpath % a figura
200 200 translate
0 0 moveto
72 { 0 0 moveto
70 0 rlineto
5 rotate} repeat
stroke
67
O caminho de recorte pode ser qualquer desenho fechado. Basta declará-
lo logo no início.
8.4 Exercícios
1. Retome os três primeiros exercícios do capitulo 3 e substitua as linhas cinzas e
pontilhadas por linhas coloridas à sua escolha.
2. Escreva um texto de três palavras, cada uma com uma cor diferente.
______________. Pictures and Proofs. In: Notices of AMS, volume 47, n. 10, pp.
1257-1266. Providence: AMS, 2000.
69
ROTH, Stephen. Real World Postscript: Techniques from Postscript Professionals.
Reading: Addison-Wesley, 1988.
71
Pronto! Você já pode programar em Postscript e visualizar arquivos de ex-
tensão ps, a extensão em que devemos gravar os arquivo de agora em diante.
Observe que os programas acima são distribuídos pela internet. É possível
que, no momento em que você lê este livro, a página onde estão disponíveis tenha
mudado de endereço. Com a ajuda de algum buscador de sua preferência, procu-
re o novo endereço, acesse a nova página, e siga os passos acima.
B - Trabalhando com PostScript
Existe uma metodologia simples para trabalharmos com a PostScript:
• Abra o Bloco de Notas e crie um arquivo com o nome que desejar, salvan-
do-o com a extensão ps em algum diretório de seu computador. Por exem-
plo, se você deseja que seu gráfico se chame meugrafico, salve-o como
"meugrafico.ps". Mantenha o Bloco de Notas aberto.
• Abra o GSView. Clique no botão "OK" na janela que vai aparecer no centro
da tela. Agora abra o arquivo "meugrafico.ps". Por enquanto, nada deve
aparecer na tela.
Nesse momento, você deve estar com duas janelas abertas no seu com-
putador, uma para o Bloco de Notas e outra para o GSView. Para verificar se seu
sistema está bem configurado, digite, no arquivo "meugrafico.ps", as seguintes li-
nhas de código:
newpath
0 0 moveto
250 250 lineto
stroke
Trabalhando interativamente
Outra maneira de trabalhar com PostScript é interativamente, digitando
cada uma das linhas acima em um prompt de comandos do GhostScript. Nesse
caso, você precisará acrescentar o comando showpage no final do código para
que seu desenho seja mostrado em uma nova janela. Maximize essa nova janela
para visualizar o seu desenho. Após visto o desenho, aperte a tecla enter para vol -
tar ao prompt de comando. Proceda dessa maneira para testar trechos de seu có-
digo.
Esse método, porém, é recomendado apenas para testes rápidos, e não
para desenvolvimento de longos desenhos.
73
C – Fontes PostScript
As 35 fontes padronizadas da linguagem PostScript são:
Além dessas, existem muitas outras fontes disponíveis gratuitamente na
internet. Versões recenes do programa Ghostscript trazem muitas outras não lista -
das aqui.
A instalação de fontes PostScript está explicada em (Adobe Systems,
1999).
75
D - Criando um arquivo EPS
Arquivos EPS (Encapsulated PostScript) são extensamente utilizados na
indústria gráfica, pois permitem incorporar os gráficos gerados em documentos di-
versos. Em particular, os arquivos EPS são a opção preferencial de gráficos para o
sistema de tipografia LaTeX, e por isso muito importantes na área científica.
A geração de um arquivo EPS é simples:
• Depois de visualizado o gráfico desejado pelo GhostView, acesse o menu
“File” e clique na opção “PS to EPS”
• Nas próximas duas caixas de diálogo que aparecerem, clique em “Yes” ou
“Sim”, e escolha a pasta de destino onde será gerado o arquivo EPS.
O arquivo EPS gerado pode ser convertido para outros formatos, segundo
a conveniência. Um programa gratuito muito bom para visualizar e converter os ar-
quivos EPS em um grande número de outros formatos é o IrfanView, gratuitamen-
te disponível na internet.