Académique Documents
Professionnel Documents
Culture Documents
Vice-Reitor
João Carlos de Souza Maia
Coordenadora da EdUFMT
Lúcia Helena Vendrúsculo Possari
EdUFMT
Conselho Editorial
Presidente
Lúcia Helena Vendrúsculo Possari (IL)
Membros
Ademar de Lima Carvalho (UFMT Rondonópolis)
Antônio Dinis Ferreira (ESAC – IPC – Portugal)
Ana Carrilho Romero (FEF)
Andréa Ferraz Fernandez (IL)
Eduardo Beraldo de Morais (FAET)
Giuvano Ebling Brondani (ICET)
Janaina Januário da Silva (FAMEVZ)
Lucyomar França Neto (Discente - FD)
Maria Cristina Theobaldo (ICHS)
María Eugenia Borsani (CEAPEDI – Argentina)
Maria Santíssima de Lima (Técnica – SECOMM)
Maria Thereza de Oliveira Azevedo (IL)
Marina Atanaka dos Santos (ISC)
Marliton Rocha Barreto (UFMT - Sinop)
Maurício Godoy (IF)
Michèle Sato (IE)
Roberto Apolonio (FAET)
Solange Maria Bonaldo (UFMT – Sinop)
Yuji Gushiken (IL)
Frederico José Andries Lopes
PostScript
Ilustrando e aprendendo matemática
EdUFMT
Cuiabá - MT
2016
Copyright © Frederico José Andries Lopes, 2016.
A reprodução não-autorizada desta publicação, por qualquer meio, seja total ou parcial, constitui violação da Lei nº
9.610/98.
A EdUFMT segue o Acordo Ortográfico da Língua Portuguesa em vigor no Brasil desde 2009.
A aceitação das alterações textuais e de normalização bibliográfica sugeridas pelo revisor é uma decisão do autor/
organizador.
EdUFMT
Editora da Universidade Federal de Mato Grosso
Contato:
edufmt@hotmail.com
www.editora.ufmt.br
Perla
S umário
Prefácio 9
Introdução 11
Capítulo 1 — Os fundamentos da linguagem 13
1.1 O sistema de coordenadas 13
1.2 A unidade de medida 14
1.3 Notação pós-fixa e operações aritméticas 14
1.4 A pilha 15
1.5 Exercícios 18
Capítulo 7 — Fontes 71
7.1 Fontes PostScript 71
7.2 Principais comandos 71
7.3 Outros comandos 74
7.4 Exercícios 75
Referências 83
Apêndices
A - Preparando o ambiente 85
B - Trabalhando com PostScript 87
Trabalhando interativamente 87
C – Fontes PostScript 89
D - Criando um arquivo EPS 91
Prefácio
9
Introdução
11
PostScript Ilustrando e aprendendo matemática
Em vista do que foi dito, este livro pretende promover o estudo das
geometrias através da criação de ilustrações. E não só as geometrias euclidianas
e analíticas planas podem sair beneficiadas, mas também as geometrias
projetivas e as hiperbólicas, uma vez que a linguagem PostScript é flexível o
bastante para incorporar módulos, desenvolvidos por terceiros, que permitem a
manipulação de imagens mais avançadas.
12
Frederico José Andries Lopes
Capítulo 1
Os fundamentos da linguagem
Figura 1.1
13
PostScript Ilustrando e aprendendo matemática
7 + 5
14
Frederico José Andries Lopes
7 5 +
7 5 add
1.4 A pilha
15
PostScript Ilustrando e aprendendo matemática
| | | | | ..., etc.
7 5
7 5 add
12 5 sub
8 7 3 sub div
16
Frederico José Andries Lopes
Observe que os operadores sub e div, assim que entram na pilha, operam
imediatamente sobre os dois dados mais próximos à esquerda, deixando o
resultado 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.
Será necessário, portanto, alterar a ordem dos dados na pilha, através de
operadores criados exclusivamente para esse fim. A lista abaixo mostra alguns
dos operadores mais usados:
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 2+5
14/(2+5). A segunda, porém, segue um pouco mais a lógica que utilizamos no dia
a dia, realizando primeiro a soma no denominador e depois a divisão. Vejamos
um esquema passo a passo dessa operação:
17
PostScript Ilustrando e aprendendo matemática
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
5 2
c) — - —
2 5
5-2
d) ——
2-5
18
Frederico José Andries Lopes
19
Capítulo 2
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
grafite 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:
21
PostScript Ilustrando e aprendendo matemática
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
quatro comandos
newpath
300 500 moveto
400 500 lineto
stroke
Figura 2.1-a
22
Frederico José Andries Lopes
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
23
PostScript Ilustrando e aprendendo matemática
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
alternativas: escrever, logo após 400 500 lineto, uma das linhas
newpath
300 500 moveto
400 500 lineto
0 100 rlineto % marca um segmento vertical
stroke
gerando a figura
Figura 2.1-c
24
Frederico José Andries Lopes
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
25
PostScript Ilustrando e aprendendo matemática
newpath
300 500 moveto
100 0 rlineto
0 100 rlineto
-100 0 rlineto
closepath
fill % preenche o caminho traçado
Figura 2.1-e
2.2 Pontos
26
Frederico José Andries Lopes
newpath
100 100 moveto
1 0 rlineto % marca um segmento de tamanho 1
stroke
O ponto PostScript não é uma medida que costumamos usar em nosso dia
a dia. Seria bem melhor se pudéssemos usar em nossos desenhos as medidas
usuais de centímetro (cm) e milímetro (mm), e é justamente o que faremos com
o comando def.
O comando def é de importância fundamental quando desejamos dar um
nome a determinados conjuntos de comandos. Aqui, vamos usá-lo para definir
uma nova unidade. Comecemos definindo o centímetro.
Suponhamos que queremos escrever um programa que desenha um
quadrado, de lado igual a 5 cm, da seguinte maneira:
newpath
10 cm 15 cm moveto
5 cm 0 cm rlineto
0 cm 5 cm rlineto
-5 cm 0 cm rlineto
closepath
stroke
27
PostScript Ilustrando e aprendendo matemática
Sabemos que uma polegada tem 72 pontos PostScript, e que uma polegada
mede exatamente 2,54 cm. Para encontrarmos a medida em polegadas de 5
cm, basta dividir 5 por 2,54, o que nos dá aproximadamente 1,97 polegadas.
Ou seja, 5 cm equivalem a aproximadamente 1,97 polegadas. Quantos pontos
PostScript há em 1,97 polegadas? Basta multiplicarmos 1,97 por 72, obtendo
aproximadamente 141,84 pontos PostScript.
Em resumo, fizemos (5 / 2,54) x 72. Em PostScript, fica
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 queremos 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
28
Frederico José Andries Lopes
escreveremos apenas
10 cm 15 cm moveto
2.4 Exercícios
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 outra.”
29
PostScript Ilustrando e aprendendo matemática
30
Capítulo 3
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
31
PostScript Ilustrando e aprendendo matemática
-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 lembrar de 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 enquanto
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
32
Frederico José Andries Lopes
3.1.2 setlinewidth
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
33
PostScript Ilustrando e aprendendo matemática
ser mantido em mente o tempo todo, pois uma linha com 10 pontos de largura
significa 5 pontos de largura para cada lado, alterando as dimensões reais do
desenho. Por exemplo, o quadrado da figura 2.1.4, se traçado com uma linha de
10 pontos de espessura, terá a medida de seus lados aumentada em 10 pontos:
Figura 3.1.2-c
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
34
Frederico José Andries Lopes
3.1.3 setdash
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
35
PostScript Ilustrando e aprendendo matemática
Figura 3.1.3
36
Frederico José Andries Lopes
Figura 3.2
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
37
PostScript Ilustrando e aprendendo matemática
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
38
Frederico José Andries Lopes
3.3 Exercícios
39
PostScript Ilustrando e aprendendo matemática
40
Frederico José Andries Lopes
Capítulo 4
Circunferências, arcos de circunferências, elipses e
curvas de Bézier
4.1.1 arc
Figura 4.1.1-a
41
PostScript Ilustrando e aprendendo matemática
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
42
Frederico José Andries Lopes
Figura 4.1.1-c
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 comando
closepath. Acrescente-o logo depois do comando arc, e veja como a fenda
some. Com figuras fechadas, use sempre com o comando closepath, mesmo
que lhe pareça redundante.
43
PostScript Ilustrando e aprendendo matemática
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
44
Frederico José Andries Lopes
newpath
300 400 50 0 90 arcn
stroke
Figura 4.1.2
4.2 Elipses
newpath
1 0.3 scale % reduz a “altura” da circ. em 30%
300 400 80 0 360 arc
stroke
Figura 4.2.1
45
PostScript Ilustrando e aprendendo matemática
newpath % a sombra
305 395 50 0 360 arc
fill
stroke
newpath % o interior
300 400 50 0 360 arc
1 setgray
fill
stroke
46
Frederico José Andries Lopes
newpath % o contorno
300 400 50 0 360 arc
0 setgray
stroke
Figura 4.3.1
47
PostScript Ilustrando e aprendendo matemática
P1 P2
P3
P0
Figura 4.4-a
P1 P2
P3
P0
Figura 4.4-b
48
Frederico José Andries Lopes
P1 P2
P0 = P3
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
49
PostScript Ilustrando e aprendendo matemática
4.5 Exercícios
1. Desenhe:
a) três circunferências concêntricas, com tonalidades diferentes de linha.
b) duas circunferências de raios diferentes tangentes externamente.
c) duas circunferências de raios diferentes tangentes internamente.
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 60°.
b) um segmento circular de 60°.
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° e um ângulo inscrito de
30°.
c) uma circunferência e duas cordas concorrentes que não sejam
diâmetros.
50
Frederico José Andries Lopes
Capítulo 5
Transformações
51
PostScript Ilustrando e aprendendo matemática
5.2 Translação
Figura 5.2-a
52
Frederico José Andries Lopes
0
0
Figura 5.2-b
5.3 Rotação
53
PostScript Ilustrando e aprendendo matemática
0 0
Figura 5.3-a
newpath
60 rotate
0 0 moveto
200 0 rlineto
stroke
Figura 5.3-b
54
Frederico José Andries Lopes
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 72°
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
55
PostScript Ilustrando e aprendendo matemática
Figura 5.3-c
Figura 5.3-d
Figura 5.3-e
56
Frederico José Andries Lopes
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
57
PostScript Ilustrando e aprendendo matemática
Figura 5.4
5.5 Reflexão
Figura 5.5-a
58
Frederico José Andries Lopes
Figura 5.5-b
5.6 Exercícios
59
Capítulo 6
Elementos de programação
currentpoint translate
50 0 rlineto
72 rotate
newpath
100 100 moveto
currentpoint translate
50 0 rlineto
72 rotate
currentpoint translate
61
PostScript Ilustrando e aprendendo matemática
50 0 rlineto
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
newpath
100 100 moveto
5 { currentpoint translate % início do repeat
50 0 rlineto
72 rotate } repeat % fim do repeat
closepath
stroke
62
Frederico José Andries Lopes
Figura 6.1
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
63
PostScript Ilustrando e aprendendo matemática
Figura 6.1-b
1 1 60 { ...
...
... } for
64
Frederico José Andries Lopes
0 0 moveto
70 0 rlineto
6 rotate
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
65
PostScript Ilustrando e aprendendo matemática
currentpoint translate
100 0 rlineto
-144 rotate
66
Frederico José Andries Lopes
[20 40 70 10 50]
Figura 6.3
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:
67
PostScript Ilustrando e aprendendo matemática
newpath
100 100 translate
0 0 moveto
20 setlinewidth
dados {barra} forall % comando forall
stroke
20 0 20
68
Frederico José Andries Lopes
30 -20
% procedimentos
/vetor [20 40 70 10 50] def
/barra {dup 0 exch rlineto 30 exch neg rmoveto} def
% rotina principal
newpath
100 100 translate
0 0 moveto
20 setlinewidth
vetor {barra} forall
stroke
A separação entre a declaração dos procedimentos e a rotina principal
aumenta a legibilidade do programa. Frequentemente precisamos ler nossos
próprios programas, e quase sempre teremos nos esquecido de como foi que
pensamos para criar esse ou aquele trecho de código.
6.4 Exercícios
1. Desenhe:
a) um hexágono regular.
b) uma estrela de 11 pontas.
c) um quadriculado para o jogo da velha.
d) um tabuleiro de xadrez.
69
PostScript Ilustrando e aprendendo matemática
70
Frederico José Andries Lopes
Capítulo 7
Fontes
71
PostScript Ilustrando e aprendendo matemática
/Helvetica findfont
72
Frederico José Andries Lopes
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
esquerdo 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:
73
PostScript Ilustrando e aprendendo matemática
Figura 7.2-b
Figura 7.2-c
Figura 7.3-a
74
Frederico José Andries Lopes
Figura 7.3-b
7.4 Exercícios
75
Capítulo 8
Acabamentos, cores e clipping
8.1 Acabamentos
Figura 8.1-a
77
PostScript Ilustrando e aprendendo matemática
Figura 8.1-b
78
Frederico José Andries Lopes
1 0 0 setrgbcolor
Figura 8.2-a
Retome o programa que gerou a figura 3.2. Suponha agora que você
deseja 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
79
PostScript Ilustrando e aprendendo matemática
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
vermelho, verde e azul.
Existem outros sistemas de cores, mas é importante conhecer bem
o padrão RGB, usado também nos códigos de cores da linguagem HTML
(HyperText Markup Language).
8.3 Clipping
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
80
Frederico José Andries Lopes
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
81
PostScript Ilustrando e aprendendo matemática
newpath % a figura
200 200 translate
0 0 moveto
72 { 0 0 moveto
70 0 rlineto
5 rotate} repeat
stroke
8.4 Exercícios
2. Escreva um texto de três palavras, cada uma com uma cor diferente.
82
Referências
______. Pictures and Proofs. Notices of AMS, Providence, v. 47, n. 10, p. 1257-
1266, 2000.
83
Apêndices
A - Preparando o ambiente
85
PostScript Ilustrando e aprendendo matemática
86
Frederico José Andries Lopes
Nesse momento, você deve estar com duas janelas abertas no seu
computador, 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 linhas de código:
newpath
0 0 moveto
250 250 lineto
stroke
Trabalhando interativamente
87
PostScript Ilustrando e aprendendo matemática
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
voltar 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.
88
Frederico José Andries Lopes
C – Fontes PostScript
As 35 fontes padronizadas da linguagem PostScript são:
89
PostScript Ilustrando e aprendendo matemática
90
Frederico José Andries Lopes
O arquivo EPS gerado pode ser convertido para outros formatos, segundo
a conveniência. Um programa gratuito muito bom para visualizar e converter
os arquivos EPS em um grande número de outros formatos é o IrfanView,
gratuitamente disponível na internet.
91
Sobre o livro:
Tipologias Utilizadas: Arial (8/10/12/45 pt) Century Gothic (6/9/12pt), Courier New (10 pt)