grafica in postscript


coordinate

origine in basso a sinistra
coordinate 0 0


segmenti

10 10 moveto
20 50 lineto
stroke
showpage

segmento.ps


sequenza di istruzioni

  1. la figura viene tracciata
    10 10 moveto
    20 50 lineto
    
  2. la figura viene disegnata sulla pagina
    stroke
    
  3. la pagina viene emessa
    showpage
    

prima fase: tracciamento di una figura

10 10 moveto
20 50 lineto

ancora non ha disegnato niente sulla pagina
la pagina è ancora bianca


seconda fase: disegno sulla pagina

stroke

la figura c'era ma non era disegnata sulla pagina

stroke la disegna

perchè?


separazione tracciamento / disegno

con la figura tracciata è possibile fare altro, invece di disegnarla

riempirla, usarla come maschera


terza fase: emissione pagina

showpage

indica che la pagina è terminata
non ci sono altri disegni da fare

la pagina viene scritta sul file


spezzate

10 10 moveto
10 50 lineto
50 50 lineto
50 10 lineto
stroke
showpage

spezzata.ps

10 10 moveto
sposta il cursore nella posizione 10 10
10 50 lineto
segmento da lì a 10 50
50 50 lineto
segmento dal punto precedente a 50 50
50 10 lineto
segmento da lì a 50 10

ogni volta traccia un segmento
e sposta il cursore


poligoni

10 10 moveto
10 50 lineto
50 50 lineto
50 10 lineto
closepath
stroke
showpage

poligono.ps

closepath traccia un segmento dal cursore
al primo punto della spezzata


figure riempite

10 10 moveto
10 50 lineto
50 50 lineto
50 10 lineto
fill
showpage

riempita.ps

fill invece di stroke

non traccia solo i segmenti
colora anche l'area contenuta


quali punti sono all'interno

10 10 moveto
10 50 lineto
50 50 lineto
50 10 lineto
fill
showpage
       

in questo caso è ovvio:
i punti da colorare sono quelli contenuti dai segmenti

se la figura fosse più complessa?
con due quadrati dentro un quadrato?


figure innestate

possibilità:

si può fare in tutti i modi


verso di rotazione

il quadrato si può disegnare nei due versi
orario o antiorario

esempio: il quadrato grande e uno piccolo in senso orario
l'altro piccolo in senso antiorario

cosa succede se si colorano?


effetto del verso di rotazione

% un quadrato disegnato in senso orario
10 10 moveto
10 90 lineto
90 90 lineto
90 10 lineto
closepath

% un quadrato al suo interno, disegnato in senso orario
20 20 moveto
20 40 lineto
40 40 lineto
40 20 lineto
closepath

% un altro quadrato al suo interno, disegnato in senso antiorario
60 60 moveto
80 60 lineto
80 80 lineto
60 80 lineto
closepath

fill

nonzero.ps

       
quadrati grande e piccolo disegnati in verso orario
interno colorato
quadrato piccolo disegnato in senso antiorario
interno non colorato

la regola generale è più complicata…


regola del raggio all'infinito

       

la regola dice quando un punto va colorato e quando no:


punto 1

       

incrocia un solo segmento

verso orario: +1

totale +1

viene colorato


punto 2

       

incrocia due segmenti

verso orario: +1

verso antiorario: -1

totale 0

non viene colorato


punto 3

       

non incrocia nessun segmento

niente +1 e niente -1

totale 0

non viene colorato


punto 4

       

incrocia due segmenti

entrambi in verso orario: +1 e +1

totale +2

diverso da zero: viene colorato


alternativa

10 10 moveto
10 90 lineto

…

80 80 lineto
60 80 lineto
closepath

eofill

eofill invece di fill

paridispari.ps


verificare se un punto è dentro o fuori

10 10 moveto
10 50 lineto
50 50 lineto
50 10 lineto
(quadrato 10,10 - 50,50\n) print
(punto 20 20 dentro: ) print
20 20 infill ==
(punto 80 20 dentro: ) print
80 20 infill ==
showpage

localizza.ps


confinare il disegno

si disegna ovunque

ma solo alcune aree appaiono

è come uno stencil
"maschera"

come disegnare cerchi e colori: dopo


come dire quale maschera usare

solo i punti interni vengono disegnati

colorazione / confinamento

colorazione
i punti all'interno vengono colorati
quelli all'esterno no
confinamento
i punti all'interno vengono disegnati
quelli all'esterno no

maschera

0 0 moveto
0 120 lineto
120 120 lineto
120 0 lineto
closepath

80 80 moveto
80 200 lineto
200 200 lineto
200 80 lineto
closepath

se i quadrati venissero disegnati, riempiti (fill):


disegno

…

% i due quadrati non vengono disegnati
% diventano la maschera
clip

newpath
initmatrix

% disegno parzialmente fuori dalla maschera

0.0 0.0 0.0 setrgbcolor
 20 100 30 0 360 arc fill
100 120 30 0 360 arc fill
…

showpage

clip.ps

       
la maschera, se venisse disegnata con fill come diventa il disegno con la maschera applicata da clip

colorazione / confinamento

       
la maschera, se venisse disegnata con fill come diventa il disegno con la maschera applicata da clip
colorazione
i punti all'interno dei quadrati diventano neri
quelli all'esterno no
confinamento
i punti all'interno dei quadrati mostrano il disegno
quelli all'esterno no

cerchi

100 100 20 45 360 arc stroke
showpage

cerchio.ps

arco di cerchio

100 100
centro
20
raggio
45 360
angolo iniziale e finale

cerchio completo, riempito:
angoli 0 e 360
fill invece di stroke


colori

10 10 moveto
10 50 lineto
50 50 lineto
50 10 lineto
1.0 0.0 0.0 setrgbcolor
fill
showpage

colore.ps


come e dove si dice il colore

1.0 0.0 0.0 setrgbcolor

prima di stroke o fill

tre numeri da 0.0 a 1.0
componenti rosso, verde, blu
RGB = Red, Green, Blue


componenti del colore

quasi tutti i colori visibili sono uguali a una mescolanza di rosso, verde e blu

quanto di ognuno: un numero da 0.0 a 1.0

0.0
niente
1.0
tutto

esempi di colori

0.0 0.0 0.0
niente rosso, niente verde, niente blu = nero
       
1.0 0.0 0.0
tutto rosso, niente verde, niente blu = rosso
       
1.0 1.0 0.0
tutto rosso, niente verde, tutto blu = viola
       
1.0 1.0 1.0
tutto rosso, tutto verde, tutto blu = bianco
       

altri sistemi usano #ff00ff
# = esadecimale
00 = 0
ff = 255
intervallo 0-255 invece di 0.0-1.0


colori nell'esempio

10 10 moveto
10 50 lineto
50 50 lineto
50 10 lineto

traccia un quadrato senza disegnarlo

1.0 0.0 0.0 setrgbcolor

specifica il colore da usare:
tutto rosso, niente verde, niente blu = rosso

fill
showpage

disegna il quadrato in rosso
emette la pagina

colore.ps


testo

/Courier			% nome del font in cima alla pila
findfont			% trova il font
15 scalefont			% grandezza dei caratteri 15
setfont				% usare questo font

10 180 moveto			% posizione
(paro) show			% disegna stringa

/Times-Roman findfont		% altro font
20 scalefont			% grandezza 20
setfont

(la) show			% disegna di seguito

testo.ps


parti del disegno del testo


trovare il font

/Courier			% nome del font in cima alla pila
findfont			% trova il font

cerca un font che si chiama "Courier"
risultato: il font è in cima alla pila

è un oggetto dizionario
come in Python: associazione chiave-valore
di solito, non interessa cosa contiene


scalare il font

15 scalefont

quando il font viene caricato, i caratteri hanno grandezza 1
sono minuscoli

font 15 scalefont ingrandisce il font quindici volte
il font in cima alla pila è quello trovato prima

risultato: font ingrandito in cima alla pila
è sempre un oggetto dizionario


usare il font

setfont

il font era in cima alla pila
setfont dice di usare il font in cima alla pila


disegnare i caratteri

10 180 moveto
(paro) show

disegna paro nella posizione del cursore
con il font dell'ultimo setfont


cambiare font

…

/Times-Roman findfont		% altro font
20 scalefont			% grandezza 20
setfont

(la) show			% disegna di seguito

testo.ps

carica un altro font (Times-Roman)
lo usa per disegnare altri due caratteri: "la"

se non c'è una moveto,
la successiva scritta è di seguito


ampiezza del testo

serve la lunghezza del testo sulla pagina

dipende dal font caricato e dalla stringa


font monospace e proporzionali

monospace
esempio: Courier
tutti i caratteri della stessa larghezza:
i m
proporzionali
esempio: Times-Roman
caratteri di diversa largheza:
i m

ampiezza del testo

monospace
dipende solo della lunghezza della stringa
proporzionali
dipende dai singoli caratteri

complicato farlo tutte le volte

esiste una funzione postscript che determina l'ampiezza


trovare l'ampiezza del testo

(testo) stringwidth

risultato: due numeri

quanto si sposta il cursore se il testo viene disegnato /blockquote>

esempio di ampiezza

% carica il font
/Courier findfont 20 scalefont setfont

% trova l'ampiezza di una stringa sul disegno
(testo) stringwidth		% come cambiano x e y del cursore
				% se "testo" viene stampato
pstack
clear

ampiezza.ps

risultato:

0.0
60.0

cosa sono i due valori

(testo) stringwidth
0.0
60.0

il disegno di testo sposta il cursore

sale di 0
va a destra di 60


esempio di uso

% carica il font
/Courier findfont 20 scalefont setfont

% disegna "testo"
10 10 moveto
(testo) show

% linea lunga quanto "testo"
10 10 moveto			% posizione iniziale del testo
10 				% x di partenza
(testo) stringwidth pop		% spostamento x se "testo" venisse stampato
add				% somma la x di partenza e lo spostamento
10				% y di partenza
lineto				% linea
stroke

ampiezza.ps

linea lunga quanto "testo"
disegnata subito sotto


spostamenti

comandi da eseguire prima di disegnare

cambiano la posizione del disegno


translazione

% testo originale
10 10 moveto
(testo) show

% translazione
0 20 translate

% testo translato
10 10 moveto
(testo) show

spostamenti.ps


scalatura

% testo originale
10 10 moveto
(testo) show

% scalatura
2 2 scale

% testo scalato
10 10 moveto
(testo) show

spostamenti.ps


rotazione

% testo originale
10 10 moveto
(testo) show

% rotazione 
45 rotate

% testo ruotato
10 10 moveto
(testo) show

spostamenti.ps


testo scalato: anche spostato

perchè è spostato in alto e a destra?

non dovrebbe essere solo più grande?


centro della rotazione

ruota intorno all'origine

non intorno all'inizio o al centro del testo

se lo volessi ruotare intorno all'inizio o al centro del testo?


come funzionano gli spostamenti

non cambia solo posizione, grandezza, direzione del testo

cambia tutto il sistema di riferimento x-y

0 20 translate
tutte le y vengono aumentate di 20
è come se l'origine fosse in 0,20
2 2 scale
tutte le x e le y vengono raddoppiate
incluse quelle di 10 10 moveto
è come se tutto il disegno venisse ingrandito
45 rotate
tutto il disegno viene ruotato

translazione

[riferimento-02.fig]

0 20 translate

l'intero disegno viene effettuato in alto di 20

ma viene visualizzata la zona originaria


scalatura

[riferimento-03.fig]

2 2 scale

l'intero disegno viene effettuato raddoppiato

ma viene visualizzata la zona originaria


rotazione

[riferimento-04.fig]

45 rotate

l'intero disegno viene tracciato ruotato

ma viene visualizzata la zona originaria


spostamenti, in generale

non cambia solo il modo di tracciare le singole figure

cambia tutto il sistema di riferimento

quindi anche le moveto


se volessi solo il testo più grande?

nella stessa posizione, solo più grande

scalo, disegno, translo?


scalo, disegno, translo

% scalo, disegno, translo
2 2 scale
0 0 moveto
(testo) show
10 10 translate
showpage

non è spostato

solo ingrandito

translate agisce sui disegni successivi


scalo, muovo, translo, disegno?

% scalo, muovo, translo, disegno
2 2 scale
0 0 moveto
10 10 translate
(testo) show
showpage

non è spostato


translo, scalo, disegno!

% translo, scalo, disegno
10 10 translate
2 2 scale
0 0 moveto
(testo) show
showpage

corretto!


ordine inverso

gli spostamenti vanno considerati al contrario
non dopo ma prima
in ordine opposto

translo, scalo, disegno = disegnare, poi scalare, poi translare


perchè l'ordine inverso?

gli spostamenti avvengono modificando il sistema di coordinate

tecnicamente:

Xe = aX + cY + h
Ye = bX + dY + v
X,Y
quelle specificate nelle operazioni grafiche
moveto, lineto,
anche i punti del testo di show
Xe,Ye
dove il punto viene disegnato

parametri iniziali

Xe = aX + cY + h
Ye = bX + dY + v
a=1
c=0
h=0

b=0
d=1
v=0

quindi:

Xe = 1X + 0Y + 0 = Y
Ye = 0X + 1Y + 0 = Y

matrice di trasformazione

Xe = aX + cY + h
Ye = bX + dY + v

vettore che contiene i sei parametri

m = [a b c d h v]

spostamento

m = [a b c d h v]
10 20 translate

h aumenta di 10
v aumenta di 20


scalature, rotazioni

m = [a b c d h v]
2 3 scale 
30 rotate

modifiche di a, b, c, d


matrice qualsiasi

1.0
0.0
1.0
1.0
0.0
0.0
matrix astore setmatrix

inserisce i sei valori nella matrice di trasformazione


effetto della modifica

[a b c d h v] = [1.0 0.0 1.0 1.0 0.0 0.0]

c vale 1 invece di 0

Xe = aX + cY + h = X + Y
Ye = bX + dY + v = Y

la y dei punti non cambia (elevazione)
la x aumenta con y
più un punto è in alto, più è spostato a destra


non solo testo

…

10 10 moveto
10 20 lineto
70 20 lineto
70 10 lineto
closepath
stroke

scatolato.ps

cambia tutto il sistema di coordinate
anche per i segmenti

anche il rettangolo è stirato verso destra