SlideShare a Scribd company logo
1 of 50
Download to read offline
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                          1




ΠΡΟΛΟΓΟΣ

1ης έκδοσης
Οι σημειώσεις που κρατάτε γράφτηκαν για να βοηθήσουν αυτούς που θέλουν να μάθουν γρήγορα
Postscript, για να κάνουν κάποια δουλειά, και όχι όσους φιλοδοξούν να γίνουν "masters" της
Postscript. Φυσικά όλοι χρειάζονται μια εισαγωγή. Εδώ περιγράφονται τα βασικά στοιχεία, περίπου το
1/3 των δυνατοτήτων της Postscript Level Ι, που όμως είναι αρκετά για να κάνετε, πραγματικά, πολλές
και απαιτητικές δουλειές. Έχουν συμπεριληφθεί αρκετά παραδείγματα που εκτός από το διδακτικό
ρόλο, παρουσιάζουν και κάποιες χρήσιμες τεχνικές. Όλα τα προγράμματα που υπάρχουν στο κείμενο
έχουν ελεγχθεί και λειτουργούν σωστά. Το γνωσιολογικό υπόβαθρο που χρειάζεται για να διαβάσει
κάποιος αυτές τις σημειώσεις, είναι η γνώση κάποιας γλώσσας προγραμματισμού υψηλού επιπέδου,
προϋποθέτει κάποια εξοικείωση με τις βασικές έννοιες του προγραμματισμού, και στοιχειώδεις
γνώσεις αναλυτικής γεωμετρίας.


                                                                                  Π.Β.Κυριακάκης
                                                                                      Ιούνιος 1995


2ης έκδοσης
Δεν άλλαξαν πολλά πράγματα από την προηγούμενη έκδοση. Προστέθηκε μια παράγραφος στο τρίτο
κεφάλαιο σχετικά με τα bitmap και ένα σχετικό παράδειγμα στο πέμπτο κεφάλαιο και έγιναν κάποιες
«βελτιωσεις» στην εμφάνιση.


                                                                                  Π.Β.Κυριακάκης
                                                                                 Σεπτέμβριος 2001
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                         2



ΠΕΡΙΕΧΟΜΕΝΑ
    ΕΙΣΑΓΩΓΗ                                                                                3
    1. ΣΤΟΙΒΑ ΚΑΙ ΑΡΙΘΜΗΤΙΚΗ
        1.1 Η ΣΤΟΙΒΑ                                                                        4
        1.2 Ο ΧΕΙΡΙΣΜΟΣ ΤΗΣ ΣΤΟΙΒΑΣ                                                         4
        1.3 ΑΡΙΜΘΗΤΙΚΗ ΣΤΗ ΣΤΟΙΒΑ                                                           6
    2. ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ & ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΙ
        2.1 ΤΟ ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ                                                             10
        2.2 ΜΕΤΑΦΟΡΑ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ                                                         10
        2.3 ΠΕΡΙΣΤΡΟΦΗ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ                                                       11
        2.4 ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ                                                                 12
    3. ΕΝΤΟΛΕΣ ΓΡΑΦΙΚΩΝ
        3.1 ΜΕΤΑΚΙΝΗΣΗ ΤΟΥ ΔΕΙΚΤΗ                                                           14
        3.2 ΓΡΑΜΜΕΣ                                                                         14
        3.3 ΧΡΩΜΑ                                                                           16
        3.4 ΚΥΚΛΟΙ ΚΑΙ ΤΟΞΑ                                                                 19
        3.5 ΚΑΤΑΣΤΑΣΗ ΓΡΑΦΙΚΩΝ                                                              21
        3.6 ΨΑΛΙΔΙΣΜΑ                                                                       22
        3.7 BITMAPPED IMAGES                                                                24
    4. ΥΠΟΡΟΥΤΙΝΕΣ ΚΑΙ ΜΕΤΑΒΛΗΤΕΣ
        4.1 ΥΠΟΡΟΥΤΙΝΕΣ                                                                     28
        4.2 ΜΕΤΑΒΛΗΤΕΣ                                                                      31
    5. ΕΛΕΓΧΟΣ ΡΟΗΣ
        5.1 ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ                                                               34
        5.2 ΕΛΕΓΧΟΙ                                                                         37
        5.3 ΕΝΑΣ ΑΚΟΜΑ ΒΡΟΧΟΣ ΕΠΑΝΑΛΗΨΗΣ                                                    38
        5.4 ΜΙΑ ΠΟΛΥΠΛΟΚΗ ΥΠΟΡΟΥΤΙΝΑ                                                        40
    6. ΚΕΙΜΕΝΟ ΚΑΙ ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ
        6.1 ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ                                                                  43
        6.2 ΚΕΙΜΕΝΟ                                                                         44
    ΠΑΡΑΡΤΗΜΑ - ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΤΩΝ ΕΝΤΟΛΩΝ ΤΗΣ POSTSCRIPT                                48
    ΒΙΒΛΙΟΓΡΑΦΙΑ                                                                            51




ΕΙΣΑΓΩΓΗ

Η PostScript είναι μια γλώσσα προγραμματισμού περιγραφής σελίδας. Περιγράφει μια εικονική
σελίδα, με διάφορες εντολές γραφικών, η οποία και τελικά θα τυπωθεί. Τα προγράμματα PS μπορούν
να εκτελεστούν σε κάθε είδους συσκευή σχεδιασμού, εκτυπωτές, ploter ακόμα και οθόνες. Το
λειτουργικό σύστημα NeXTSTEP χρησιμοποιεί Postscript Display για το χειρισμό των γραφικών.
Αλλά τα Postscript προγράμματα συνήθως είναι κείμενα προς εκτύπωση. Στους εκτυπωτές που
υποστηρίζουν Postscript υπάρχει στη ROM ένας μεταφραστής (interpreter) στον οποίο εκτελούνται τα
προγράμματα. Αν δεν έχετε στη διάθεση σας έναν Postscript εκτυπωτή μπορείτε να βλέπετε το
αποτέλεσμα ενός προγράμματος σε κάποιο Postscript previewer. Ένας γνωστός free proviewer είναι το
GSVIEW, το οποία τρέχει σε αρκετές πλατφόρμες.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                       3


Συνήθως Postscript αρχεία παίρνουμε σαν έξοδο από διάφορες εφαρμογές (π.χ. σχεδιαστικό πακέτο)
όμως υπάρχουν πολλοί προγραμματιστές που γράφουν Postscript "με το χέρι" για διάφορες γραφικές
εργασίες. Εδώ θα μάθουμε να γράφουμε Postscript "με το χέρι", ώστε να μπορούμε να σχεδιάσουμε με
ακρίβεια τα σχήματα μας, τότε όμως είμαστε σε θέση να γράψουμε κάποια εφαρμογή που να έχει και
Postscript έξοδο.
Πολλά φίλτρα εκτύπωσης, για παράδειγμα αυτό του UNIX (lpr), για να καταλάβουν ότι αυτό που
στέλνουμε για εκτύπωση είναι Postscript θέλουν το αρχείο να αρχίζει με τον παρακάτω header


              %!PS-Adobe-2.0
              %%Version: 3.15
              %%DocumentFonts: (atend)
              %%Pages: (atend)
              %%EndComents

χωρίς κενές γραμμές πάνω από αυτόν. Το τί σημαίνει δεν έχει σημασία σε πρώτη φάση. Μια
αναλυτική παρουσίαση του header μπορείτε να διαβάσετε στο "Postscript language program design".
Σημειώστε ότι, όλες οι εντολές πρέπει να είναι γραμμένες με πεζά γράμματα. Ας αρχίσουμε.




1. ΣΤΟΙΒΑ ΚΑΙ ΑΡΙΘΜΗΤΙΚΗ


1.1 Η ΣΤΟΙΒΑ.


Η PS δε χειρίζεται τα δεδομένα όπως οι γνωστές γλώσσες προγραμματισμού υψηλού επιπέδου, όπου
έχουμε μεταβλητές (θέσεις στη μνήμη) και τελεστές που δρούν στις τιμές των μεταβλητών παράγοντας
κάποιο αποτέλεσμα το οποίο τοποθετείται σε κάποια θέση της μνήμης αλλά τα χειρίζεται η στοίβα. Η
στοίβα στην PS είναι σαν ένας σωρός από κουτιά τοποθετημένα το ένα πάνω στο άλλο, από όπου
μπορούμε να πάρουμε μόνο αυτό που τοποθετήσαμε τελευταίο, αυτό λέγεται LIFO (Last In First Out).
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                         4


Έτσι αν υποθέσουμε ότι αρχικά η στοίβα είναι κενή, και στη συνέχεια εκτελέσουμε τον παρακάτω
κώδικα PS



             12
             35
             14


τότε το περιεχόμενο της στοίβας θα είναι



             14
             35
             12


Δηλαδή πρώτα εκτελέστηκε η πρώτη γραμμή που τοποθέτησε στη στοίβα το 12 στη συνέχεια η
δεύτερη γραμμή που τοποθέτησε το 35 πάνω από το 12 και τέλος η τρίτη γραμμή που τοποθέτησε το
14 πάνω από το 35. Τώρα αν τραβήξουμε τα δεδομένα της στοίβας θα τα πάρουμε με την αντίστροφη
σειρά από αυτή που τα τοποθετήσαμε, δηλαδή 14, 35, 12.




1.2 Ο ΧΕΙΡΙΣΜΟΣ ΤΗΣ ΣΤΟΙΒΑΣ


Εύλογο είναι να αναρωτηθεί κανείς πώς χειριζόμαστε τη στοίβα, για παράδειγμα πως πετάμε κάτι που
δε χρειαζόμαστε ή πώς εναλλάσσουμε τη σειρά 2 αντικειμένων στη στοίβα. Στην PS υπάρχουν
διάφορες εντολές για το χειρισμό της στοίβας.
Αν έχουμε τη στοίβα του προηγούμενου παραδείγματος και θέλουμε να απαλλαγούμε από το πρώτο
στοιχείο της στοίβας τότε πολύ απλά το πετάμε έξω από αυτή κάνοντας το pop. Για παράδειγμα το
πρόγραμμα



             12
             35
             14
             pop


                                                                        .
κάνει το εξής. Οι πρώτες τρεις γραμμές τοποθετούν τα δεδομένα στη στοίβα έτσι η στοίβα γίνεται
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                          5



              14
              35
              12


η τέταρτη γραμμή κάνει ένα pop στη στοίβα, πετάει το πρώτο αντικείμενο της στοίβας, έτσι τα
περιεχόμενα της στοίβας είναι



              35
              12


Αν τώρα θέλουμε να εναλλάξουμε τη σειρά των 35 και 12, δηλαδή να είναι πάνω πάνω στη στοίβα το
12 τότε θα κάνουμε ένα exch (exchange), μια εναλλαγή. Έτσι αν η στοίβα είναι ως έχει, και πούμε



              exch


τότε η στοίβα θα γίνει



              12
              35


Τέλος αν για κάποιο λόγο θέλουμε να έχουμε στη στοίβα μας δύο φορές το πρώτο της στοιχείο, το 12,
θα πρέπει να το αναπαράγουμε (duplicate). Αυτή τη δουλειά την κάνει η εντολή dup. Αν πράγματι
πούμε



              dup


τότε η στοίβα γίνεται



              12
              12
              35


'Ετσι, τώρα που μάθαμε να πετάμε (pop), να εναλλάσσουμε (exch) και να αναπαράγουμε (dup) τα
αντικείμενα της στοίβας, μπορούμε να μάθουμε να κάνουμε και αριθμητικές πράξεις στη στοίβα.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                      6




1.3 ΑΡΙΘΜΗΤΙΚΗ ΣΤΗ ΣΤΟΙΒΑ


Ας ξεκινήσουμε με την πιο απλή πράξη, την πρόσθεση. Πρόσθεση γίνεται μεταξύ των δύο πρώτων
μελών της στοίβας με τον τελεστή add. Ένα παράδειγμα πρόσθεσης είναι το παρακάτω πρόγραμμα



             12
             13
             add


αρχικά τοποθετεί στη στοίβα το 12 και το 13 και στη συνέχεια ο τελεστής add τα προσθέτει και
τοποθετεί στη στοίβα το αποτέλεσμα, το 25. Δηλαδή αρχικά η στοίβα γίνεται



             13
             12


όταν δράσει ο add, γίνεται η πρόσθεση και η στοίβα γίνεται



             25


δηλαδή περιέχει το αποτέλεσμα της πρόσθεσης. Κατά τον ίδιο τρόπο γίνονται και οι υπόλοιπες
πράξεις. Χωρίς κανένα πρόβλημα κάνουνε πολλαπλασιασμό (mul),



             12
             13
             mul


και το αποτέλεσμα είναι στη στοίβα



             156


Η αφαίρεση (sub) και η διαίρεση (div) θέλουν προσοχή για το πως θα τοποθετήσουμε στη στοίβα τους
όρους. Για παράδειγμα, αν γράψουμε το πιο κάτω
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                       7



             12 4 sub


τότε το περιεχόμενο της στοίβας είναι



             4
             12


και ο τελεστής sub αφαιρεί το πρώτος μέλος της στοίβας από το δεύτερο και τοποθετεί στη στοίβα το
αποτέλεσμα



             8


Με το ίδιο σκεπτικό γίνεται και η διαίρεση (div). Η παρακάτω γραμμή



             5 2 div


αρχικά βάζει στη στοίβα τα δεδομένα, και τότε το περιεχόμενο της στοίβας είναι



             2
             5


μόλις δράσει ο div, γίνεται η διαίρεση και τοποθετείται στη στοίβα το αποτέλεσμα



             2.5


Παρατηρούμε ότι έγινε πραγματική διαίρεση (διαίρεση μεταξύ πραγματικών αριθμών). Στην PS
μπορούμε να κάνουμε και διαίρεση ακέραιων με των τελεστή idiv. Ο idiv τοποθετεί στη στοίβα το
πηλίκο της διαίρεσης, ενώ το υπόλοιπο το παίρνουμε με τον τελεστή mod. Δηλαδή η γραμμή



             5 2 idiv


τοποθετεί στη στοίβα το 2 και η



             5 2 mod
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        8




τοποθετεί το υπόλοιπο δηλαδή το 1. Τώρα πια μπορούμε να κάνουμε και πολύπλοκους υπολογισμούς.

Για παράδειγμα μπορούμε να υπολογίσουμε το (10-5)2. Για να κάνουμε αυτόν τον υπολογισμό, θα
χρησιμοποιήσουμε και μια εντολή από την προηγούμενη παράγραφο, την dup. Τη dup θα τη
χρειαστούμε για τον υπολογισμό του τετραγώνου. Ένας απλοϊκός τρόπος, για να το υπολογίσουμε,
είναι να κάνουμε δύο φορές την αφαίρεση και μετά να πολλαπλασιάσουμε τα αποτελέσματα, δηλαδή



             10 5 sub
             10 5
             sub
             mul


                              .
Ας δούμε τι γίνεται στη στοίβα η πρώτη γραμμή αφαιρεί το 5 από το 10 και τοποθετεί στη στοίβα το
                                                                .
αποτέλεσμα, δηλαδή το 5. Η δεύτερη τοποθετεί το 10 και μετά το 5 έτσι η στοίβα γίνεται




             5
             10
             5


Η sub αφαιρεί το πρώτο 5 από το 10 και τοποθετεί το αποτέλεσμα στη στοίβα πάνω από το
προηγούμενο 5, έτσι στη στοίβα έχουμε τα δύο 5 και τέλος η mul τα πολλαπλασιάζει και τοποθετεί το

                                                           .
αποτέλεσμα στη στοίβα. Ένας πιο έξυπνος τρόπος είναι ο εξής αρχικά κάνουμε την αφαίρεση και
μετά αναπαράγουμε το αποτέλεσμα με τη dup και μετά εκτελούμε τον πολλαπλασιασμό, δηλαδή



             10 5 sub
             dup
             mul


Οι πράξεις στην PS απατούν κάποια εξοικείωση με τη στοίβα και το χειρισμό της ώστε να μην
οδηγούμαστε σε λανθασμένα αποτελέσματα. Τέλος, υπάρχει και ένας πολύ ενδιαφέρον τελεστής, neg.
Η δουλειά του είναι να αλλάζει το πρόσημο ένας αριθμού. Δηλαδή αν πούμε



             -4 neg
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                      9


το αποτέλεσμα είναι το 4. Τώρα που μάθαμε να χειριζόμαστε τα δεδομένα στη στοίβα και να κάνουμε
πράξεις μπορούμε να αρχίσουμε να σχεδιάζουμε με την PS.




2.ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ & ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΙ


2.1 ΤΟ ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ


Για να προσδιορίσουμε ένα σημείο πάνω σ' ένα επίπεδο, όπως γνωρίζουμε και από τα μαθηματικά,
χρειαζόμαστε ένα σύστημα αναφοράς. Η PS έχει ένα ορθογώνιο σύστημα αξόνων, η αρχή του οποίου
(το 0,0) είναι στην κάτω αριστερά γωνία της σελίδας.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                       10




Σε σελίδα Α4 ο x (οριζόντιος) άξονας έχει μήκος 595 σημεία και ο y (κατακόρυφος) άξονας έχει μήκος
842 σημεία. Το "σημείο" είναι η μονάδα μέτρησης. Το φυσικό μήκος ενός σημείου είναι 1/72 της
ίντσας. Λέγοντας φυσικό μήκος εννοούμε το πραγματικό μήκος, δηλαδή το μήκος που έχει αν τυπωθεί
στο χαρτί. Έτσι αν πούμε στην PS να μας τυπώσει ένα ευθύγραμμο τμήμα 72 σημείων και μετά το
μετρήσουμε στο χαρτί θα δούμε ότι έχει μήκος μια ίντσα. Σε αντίθεση με άλλες γλώσσες γραφικών
στην PS μπορούμε να μεταφέρουμε και να περιστρέψουμε το σύστημα των αξόνων καθώς να
αλλάξουμε και την κλίμακα του.




2.2 ΜΕΤΑΦΟΡΑ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ


Μια απλή περίπτωση που θελήσουμε να μεταφέρουμε το σύστημα αναφοράς είναι όταν θέλουμε να
σχεδιάσουμε ένα σχήμα του οποίου γνωρίζουμε τις συντεταγμένες και κάποιες από αυτές είναι
αρνητικές. Στην PS αν χρησιμοποιήσουμε το αρχικό σύστημα και δώσουμε αρνητικές συντεταγμένες
π.χ. -100,-40 τότε δε θα τυπωθεί τίποτα γιατί αυτά τα σημεία είναι έξω από το χαρτί. Αν όμως
μεταφέρουμε το σύστημα στο 200,200 τότε το σημείο μας          (-100,-40) είναι μέσα στο χαρτί και
συνεπώς θα πάρουμε το επιθυμητό αποτέλεσμα.
Η μεταφορά του συστήματος γίνεται με την εντολή translate. Η εντολή



             200 200 translate


θα μεταφέρει την αρχή του συστήματος στα σημείο 200,200 του τρέχοντος συστήματος.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        11




Οι μετασχηματισμοί στο σύστημα γίνονται ως προς το τρέχον σύστημα. Δηλαδή για να ξαναφέρουμε
το συστημα στην αρχική του θέση θα πούμε



             -200 -200 translate


Χρήσιμο είναι να πούμε ότι σε όλες τις εντολές της PS πρώτα δίνουμε τη x συντεταγμένη και μετά την
y. Τώρα ας δούμε πως περιστρέφουμε το σύστημα αναφοράς.




2.3 ΠΕΡΙΣΤΡΟΦΗ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ


Η περιστροφή του συστήματος είναι εξίσου απλή μα και χρήσιμη. Για παράδειγμα αν θέλουμε να
τυπώσουμε μια λέξη με κλίση 60 μοιρών, το κάνουμε περιστρέφοντας το σύστημα αναφοράς κατά 60
μοίρες. Τη δουλειά αυτή την κάνει η εντολή rotate. Η rotate έχει ένα όρισμα, τη γωνία στροφής. Αν η
γωνία αυτή είναι θετική, τότε το σύστημα περιστρέφεται ανάποδα από τη φορά των δεικτών του
ρολογιού και κατά συνέπεια αν είναι αρνητική, περιστρέφεται κατά τη φορά των δεικτών του
ρολογιού. 'Ετσι η εντολή



             60 rotate


περιστρέφει το σύστημα προς τα αριστερά
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                       12




ενώ η



              -60 rotate


το επαναφέρει στη θέση του.




2.4 ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ


Στο αρχικό σύστημα στον x και στον y άξονα, όπως είναι λογικό, τα μήκη είναι ίδια. Μπορούμε όμως
να αλλάξουμε την κλίμακα, με την εντολή scale. Έτσι αν αρχικά έχουμε το σχήμα




και στη συνέχεια πούμε



              1.5 1      scale


τότε το x έχει 1.5 φορές μεγαλύτερο μήκος από ένα ίσο του στα y. Δηλαδή το πιο πάνω σχήμα θα γίνει
κάπως έτσι.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                       13




Τώρα που μάθαμε για το σύστημα αναφοράς της PS, μάθαμε το χώρο μέσα στον οποίο θα
σχεδιάσουμε με τα "εργαλεία" του επόμενου κεφαλαίου.




3. ΕΝΤΟΛΕΣ ΓΡΑΦΙΚΩΝ
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        14


3.1 Ο ΔΕΙΚΤΗΣ ΚΑΙ ΜΕΤΑΚΙΝΗΣΗ ΤΟΥ ΔΕΙΚΤΗ


Ο τρόπος που σχεδιάζει η PS μοιάζει με τα "turtle graphics" της logo, όπου έχουμε ένα δείκτη πάνω
στο χαρτί και τον μετακινούμε είτε αφήνοντας ίχνος (ζωγραφίζοντας) είτε όχι. Έτσι η PS έχει ένα
δείκτη ο οποίος αρχικά είναι τοποθετημένος στο σημείο (x=0, y=0). Αυτό είναι και το σημείο από
όπου αρχίζουμε πάντα. Έτσι αν θέλουμε να σχεδιάσουμε κάτι στο σημείο (100,100) πρέπει να
τοποθετήσουμε το δείκτη εκεί. Δηλαδή χρειαζόμαστε μια εντολή που να τοποθετεί το δείκτη σε κάποιο
σημείο, αυτή είναι η moveto. Η moveto παίρνει τα δύο πρώτα στοιχεία της στοίβας ως το σημείο που
θα τοποθετήσει το δείκτη. Έτσι η



             100 100 moveto


τοποθετεί το δείκτη στο σημείο (100,100). Αν τώρα πούμε



             100 100 moveto
             50 100 moveto


η πρώτη εντολή τοποθετεί το δείκτη στο σημείο (100,100) και η δεύτερη τον τοποθετεί στο σημείο
(50,100). Δηλαδή η moveto μετακινεί το δείκτη ως προς την αρχή του συστήματος αναφοράς. Υπάρχει
όμως και η rmoveto (relative move), η οποία μετακινεί το δείκτη ως προς το σημείο που βρίσκεται. Τα
ορίσματα της rmoveto δεν είναι οι συντεταγμένες ως προς την αρχή αλλά το πόσο θέλουμε να κινηθεί
ως προς το x και ως προς το y από το σημείο που βρίσκεται. Για παράδειγμα αν πούμε



             100 100 moveto
             50 100 rmoveto


τότε η moveto θα τοποθετήσει το δείκτη στο σημείο (100,100) και η rmoveto θα τον μετακινήσει κατά
50 σημεία στα x και κατά 100 σημεία στα y δηλαδή τελικά ο δείκτης θα είναι στο σημείο (150,200) και
αυτό είναι το σημείο από όπου θα αρχίσει και το ευθύγραμμο τμήμα που θα σχεδιάσουμε παρακάτω.

3.2 ΓΡΑΜΜΕΣ

Ακολουθεί ένα απλό πρόγραμμα, το οποίο σχεδιάζει ένα ευθύγραμμο τμήμα, στο οποίο θα δούμε τις
βασικές αρχές σχεδιασμού της PS.



             newpath
             100 100 moveto
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                     15



             200 200 lineto
             closepath
             stroke
             showpage


Αρχικά βλέπουμε μια γνωστή σε μας εντολή, τη moveto, η οποία τοποθετεί το δείκτη στο σημείο
(100,100). Εύκολα μπορούμε να υποψιαστούμε τι κάνει η lineto. Η lineto ορίζει ένα ευθύγραμμα
τμήμα από το τρέχον σημείο (το σημείο που βρίσκεται ο δείκτης) ως το σημείο (200,200), όπως
φαίνεται στο παρακάτω σχήμα.




Τώρα ας πάμε στο "μονοπάτι" (path). Η εντολή newpath αδειάζει το τρέχον path και δηλώνει ότι
αρχίζουμε ένα νέο. Στο παράδειγμα μας φτιάχνουμε ένα ευθύγραμμο path που αντιστοιχεί στο
ευθύγραμμο τμήμα που θέλουμε να σχεδιάσουμε. Ένα path δημιουργείται μετακινώντας ένα
φανταστικό μολύβι πάνω στην σελίδα. Αυτό το μολύβι αφήνει ένα αόρατο ίχνος στη σελίδα το οποίο
αντιπροσωπεύει το τρέχον path. Η closepath θέτει το τέλος στο path που άρχισε με την αμέσως
προηγούμενη newpath. Στο παράδειγμα μας το τρέχον path δημιουργείται από τις moveto και lineto.
Αν θέλουμε να σχεδιαστεί το path που φτιάξαμε με το τρέχον χρώμα (εξ ορισμού μαύρο) αυτό θα το
πούμε με την stroke. Η stroke σχεδιάζει το περιεχόμενο του αμέσως προηγούμενου path.
Η τελευταία εντολή του παραδείγματος, η showpage, είναι ίσως από τις πιο σημαντικές εντολές της
PS. Αν στείλουμε στον εκτυπωτή το πιο πάνω πρόγραμμα χωρίς τη showpage τότε αυτός θα το
εκτελέσει (θα το "τρέξει") στη μνήμη αλλά δε θα τυπώσει τίποτα γιατί δεν του το είπαμε. Όλες οι
άλλες εντολές λένε στον εκτυπωτή τί να σχεδιάσει και πώς, η showpage όμως λέει στον εκτυπωτή να
το τυπώσει στο χαρτί.
Στην προηγούμενη παράγραφο είδαμε την εντολή rmoveto η οποία μετακινεί το δείκτη σε σχέση με το
τρέχον σημείο. Ανάλογη εντολή υπάρχει και για τις γραμμές, η rlineto. Η rlineto ορίζει το τελικό
σημείο του ευθύγραμμου τμήματος σε σχέση με το τρέχον σημείο, τη δουλεία που κάνει το
προηγούμενο πρόγραμμα δηλαδή μια γραμμή με αρχή το (100,100) και τέλος το (200,200) μπορούμε
να την κάνουμε και με την rlineto με το παρακάτω πρόγραμμα



             newpath
             100 100 moveto
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                          16



             100 100 rlineto
             closepath
             stroke
             showpage


Η moveto τοποθετεί το δείκτη στο σημείο (100,100) και η rlineto λέει ότι θέλουμε μια γραμμή από το
τρέχον σημείο, το (100,100) μέχρι το σημείο (100+100, 100+100) δηλαδή το (200,200) όπως και το
πρώτο πρόγραμμα. Αν θα χρησιμοποιήσουμε τη lineto ή την rlineto εξαρτάται από το αν ξέρουμε τις
συντεταγμένες του τελικού σημείου ή αν ξέρουμε το πόσο απέχει το τελικό από το αρχικό σημείο. Για
παράδειγμα αν θέλουμε να σχεδιάσουμε ένα τετράγωνο πλευράς 50 σημείων με την κάτω αριστερά
του γωνία στο (100,100) βολεύει η rlineto. Ενα τέτοιο τετράγωνο σχεδιάζει και αυτό το πρόγραμμα



             newpath
             100 100 moveto
             0 50 rlineto
             50 0 rlineto
             0 -50 rlineto
             -50 0 rlineto
             closepath
             stroke
             showpage


Αρχικά τοποθετεί το δείκτη στο σημείο (100,100). Η πρώτη rlineto σχεδιάζει μια κατακόρυφη γραμμή
προς τα πάνω μήκους 50 σημείων. Η δεύτερη μια οριζόντια προς τα δεξιά. Η τρίτη μια κατακόρυφη
προς τα κάτω, αφαιρούμε 50 σημεία από την y συντεταγμένη του τρέχοντος σημείου. Τέλος η τέταρτη
rlineto σχεδιάζει τη βάση του τετραγώνου, μια γραμμή μήκους 50 προς τα αριστερά. Ας δούμε πώς θα
γεμίσουμε με χρώμα το τετράγωνό μας.




3.3 ΧΡΩΜΑ


Ας πάρουμε το πρόγραμμα που σχεδιάζει το τετράγωνο, και να του κάνουμε μια μικρή αλλαγή



             newpath
             100 100 moveto
             0 50 rlineto
             50 0 rlineto
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                      17



             0 -50 rlineto
             -50 0 rlineto
             closepath
             fill
             showpage


θα αλλάξουμε την εντολή stoke με τη fill και το αποτέλεσμα είναι




ένα μαύρο τετράγωνο. Η fill λέει στην PS να γεμίσει με χρώμα το path που ορίσαμε. Ο χώρος που θα
γεμίσει είναι το κλειστό σχήμα που ορίζεται από τις γραμμές που αρχίζουν στο αρχικό σημείο που θα
βάλουμε το δείκτη και τελειώνουν ξανά σε αυτό. Αν δεν κλείνει το σχήμα στο αρχικό σημείο το
αποτέλεσμα είναι απρόβλεπτο και σίγουρα όχι το επιθυμητό. Πολύ εύκολα μπορούμε να αλλάξουμε
την απόχρωση του γκρι που θα γεμίσει το τετράγωνο μας με τη setgray όπως κάνει το παρακάτω
πρόγραμμα



             newpath
             100 100 moveto
             0 50 rlineto
             50 0 rlineto
             0 -50 rlineto
             -50 0 rlineto
             closepath
             0.5 setgray
             fill
             showpage


και το τετράγωνο που παίρνουμε είναι κάπως έτσι
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        18




Η setgray περιμένει να βρει στη στοίβα έναν αριθμό μεταξύ 0 και 1, το 0 είναι μαύρο και το 1 άσπρο.
Αν δε βάλουμε άλλη setgray ό,τι σχεδιάσουμε μετά (στο ίδιο πρόγραμμα) θα έχει τον ίδιο τόνο γκρι
που ορίσαμε.
Τα σχέδια μας, όμως, δεν είναι υποχρεωτικά σε αποχρώσεις του γκρι, μπορούν να είναι και έγχρωμα.
Η PS έχει και χρώματα, αλλά τα καθορίζει με ένα λίγο παράξενο τρόπο. Υπάρχει η θεωρία που λέει,
και πράγματι ισχύει, ότι όλα τα χρώματα και οι αποχρώσεις τους μπορούν να παραχθούν με την
ανάμειξη του κόκκινου (Red), του πράσινου (Green) και του μπλε (Blue). Από τα ονόματα αυτών των
χρωμάτων βγαίνει η ονομασία RGB. 'Ετσι μπορούμε να προσδιορίσουμε όλα τα χρώματα από την
ποσότητα κάθε συνθετικού που περιέχει. Κάνοντας τη σύμβαση οι ποσότητες να είναι από 0 έως 1,
πολύ απλά το κόκκινο ορίζεται από την τριάδα (1,0,0), δηλαδή 1 κόκκινο, 0 πράσινο, 0 μπλε. Μαύρο
στην ίδια θεωρία είναι κάτι χωρίς χρώμα, δηλαδή το (0,0,0) και το άσπρο όλα τα χρώματα μαζί στο
μέγιστο δηλαδή (1,1,1). Με αυτό τον τρόπο καθορίζει τα χρώματα και η PS. Με την εντολή
setrgbcolor αλλάζουμε το τρέχον χρώμα, το μαύρο, σε κάποιο άλλο. Τώρα μπορούμε να βάψουμε το
τετράγωνο μας με κάποιο χρώμα,




               newpath
               100 100 moveto
               0 50 rlineto
               50 0 rlineto
               0 -50 rlineto
               -50 0 rlineto
               closepath
               0.98 0.98 0.31 setrgbcolor
               fill
               showpage


και το αποτέλεσμα είναι ένα κίτρινο τετράγωνο, το οποίο αν τυπωθεί σε έναν ασπρόμαυρο εκτυπωτή
μοιάζει κάπως έτσι
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                       19




'Οπως και με τη setgray η setrgbcolor αλλάζει το τρέχον χρώμα, το οποίο εξ ορισμού είναι το μαύρο,
σε κάποιο άλλο και παραμένει μέχρι να το ξανά αλλάξουμε. Κάτι χρήσιμο εκτός από το χρώμα είναι
και το πώς σχεδιάζουμε κύκλους και τόξα.




3.4 ΚΥΚΛΟΙ ΚΑΙ ΤΟΞΑ


Ας δούμε πώς ορίζουμε ένα τόξο στην PS. Τόξο είναι κομμάτι ενός κύκλου, και το μήκος του
προσδιορίζεται απ'τη γωνία μεταξύ των ακτινών στα άκρα του. Τη γωνία αυτή την ορίζουμε σαν τη
διαφορά δύο γωνιών που τις μετράμε από τη δεξιά πλευρά της οριζόντιας διαμέτρου του κύκλου.
Δηλαδή χρειαζόμαστε, τις συντεταγμένες του κέντρου, την ακτίνα, την αρχική γωνία (θ1) και την
τελική γωνία (θ2). Οι γωνίες είναι όπως φαίνονται στο παρακάτω σχήμα




Η εντολή arc σχεδιάζει τόξα με αυτό τον τρόπο, για παράδειγμα το πρόγραμμα



             newpath
             100 100 50 30 60 arc
             closepath
             stroke
             showpage



σχεδιάζει τόξο ενός κύκλου με κέντρο το (100,100) και ακτίνα 50 από γωνία 30ο έως γωνία 60ο.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        20




Τώρα πια μπορούμε πολύ εύκολα να σχεδιάσουμε ένα κύκλο. Πολύ απλά θα αλλάξουμε τις γωνίες, θα

αρχίζει από τη γωνία 0 και θα τελειώνει στις 360ο. Δηλαδή θα πούμε



             newpath
             100 100 50 0 360 arc
             closepath
             stroke
             showpage


και αυτό που θα πάρουμε είναι ένας κύκλος με κέντρο το (100,100) και ακτίνα 50 σημεία. Με ένα
μικρό κόλπο μπορούμε να σχεδιάσουμε μια έλλειψη. Το κόλπο είναι να αλλάξουμε την κλίμακα, είτε
κατά x είτε κατά y, ώστε να "τραβήξουμε" τον κύκλο από τη μια του διάμετρο να πλατύνει και να γίνει
έλλειψη. Όπως ξέρουμε η PS έχει μια ειδική εντολή για την αλλαγή κλίμακας τη scale. Το επόμενο
πρόγραμμα σχεδιάζει μια έλλειψη, μεγαλώνοντας την x κλίμακα και στη συνέχεια σχεδιάζει έναν
κύκλο.



             100 100 translate
             1.5 1 scale
             newpath
             0 0 50 0 360 arc
             closepath
             stroke
             showpage


Το αποτέλεσμα όπως φαίνεται και στο σχήμα είναι πράγματι μια έλλειψη.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                          21




Αυτό το πρόγραμμα έχει δύο παραξενιές, η πρώτη είναι η translate στην αρχή από το πρόγραμμα και η
δεύτερη, ότι το κέντρο του κύκλου είναι στο (0,0). Αν δεν υπήρχε η translate και σχεδιάζαμε τον κύκλο
με κέντρο το (100,100), το πρόβλημα θα ήταν ότι η έλλειψη μας δε θα σχεδιαζόταν εκεί που θέλουμε
γιατί έχουμε μεγαλώσει την κλίμακα στα x και συνεπώς θα σχεδιαζόταν πιο δεξιά από το επιθυμητό
μέρος. Γι' αυτό το λόγο μεταφέρουμε αρχικά το σύστημα αναφοράς εκεί που θέλουμε το κέντρο του
κύκλου, δηλαδή το (100,100), μετά αλλάζουμε την κλίμακα και τέλος σχεδιάζουμε έναν κύκλο στην
αρχή του συστήματος με ακτίνα 50. Το μόνο πρόβλημα τώρα είναι ότι για να συνεχίσουμε το σχέδιο
μας πρέπει να ξαναλλάξουμε την κλίμακα και να ξαναβάλουμε το σύστημα αναφοράς στην αρχική του
θέση. Δηλαδή έπρεπε μετά τη stroke να υπάρχουν οι εντολές



             0.66 1 scale
             -100 -100 translate


Μια πιο εύκολη λύση σ' αυτό το πρόβλημα θα δούμε στη συνέχεια.




3.5 ΚΑΤΑΣΤΑΣΗ ΓΡΑΦΙΚΩΝ


Κατάσταση γραφικών (graphics state) είναι η θέση, ο προσανατολισμός, και η κλίμακα του
συστήματος αναφοράς και το χρώμα. Η εντολή gsave αποθηκεύει στη μνήμη την κατάσταση γραφικών
και η grestore την επαναφέρει. Έτσι στο προηγούμενο παράδειγμα αν είχαμε αποθηκεύσει την
κατάσταση γραφικών πριν την translate μετά το σχεδιασμό της έλλειψης θα μπορούσαμε να
επαναφέρουμε τα πράγματα στην κατάσταση που ήταν στην αρχή. Το επόμενο πρόγραμμα σχεδιάζει
την προηγούμενη έλλειψη και τον κύκλο με κέντρο το (100,100) και ακτίνα 50 χωρίς την αλλαγή
κλίμακας.



             gsave
             100 100 translate
             1.5 1 scale
             newpath
             0 0 50 0 360 arc
             closepath
             stroke
             grestore
             newpath
             100 100 50 0 360 arc
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                            22



              closepath
              stroke
              showpage


Αποθηκεύουμε την κατάσταση γραφικών, σχεδιάζουμε την έλλειψη, με το γνωστό τρόπο,
επαναφέρουμε την κατάσταση γραφικών και μετά σχεδιάζουμε τον κύκλο.




Στο σχήμα βλέπουμε ότι το "κόλπο" με τη μεταφορά και την αλλαγή κλίμακας όντως δουλεύει και το
κέντρο της έλλειψης είναι το (100,100).




3.6 ΨΑΛΙΔΙΣΜΑ


Ας υποθέσουμε ότι θέλουμε να σχεδιάσουμε ένα ριγέ κύκλο, αυτό που πρέπει να κάνουμε είναι
σχεδιάσουμε ένα κύκλο και μερικές οριζόντιες γραμμές. Όμως το μήκος των γραμμών δεν είναι
σταθερό, και καταλαβαίνουμε ότι δεν είναι εύκολο να υπολογίσουμε τις συντεταγμένες των άκρων των
γραμμών. Κάτι που θα μας βόλευε είναι να σχεδιάσουμε τον κύκλο, μετά οριζόντιες γραμμές ίσου
μήκους και με κάποιο τρόπο να "σβήσουμε" το μέρος των γραμμών που είναι έξω από τον κύκλο.
Δηλαδή χρειαζόμαστε ένα τρόπο να πούμε στην PS την περιοχή, το path, μέσα στην οποία θέλουμε να
"φαίνεται" ότι σχεδιάζουμε. Αυτό γίνεται ορίζοντας ένα path και στη συνέχεια αντί να το κάνουμε
stroke ή κάτι τέτοιο λέμε clip. Ο τελεστής clip ορίζει το path ψαλιδίσματος (clipping path), ό,τι είναι
έξω από αυτό "ψαλιδίζεται" δηλαδή δε σχεδιάζεται. Αν σχεδιάσουμε τον κύκλο και τις γραμμές, ίσου
μήκους, αυτό που θέλουμε να ψαλιδιστεί είναι ό,τι είναι έξω από τον κύκλο, άρα το clipping path εδώ
είναι ο κύκλος. Ας δούμε πώς γίνεται στην πράξη.



              %σχεδιάζει τον κύκλο
              newpath
              100 100 50 0 360 arc
              closepath
              stroke
              % ορίζει το clipping path
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        23



             newpath
             100 100 50 0 360 arc
             closepath
             clip
             % σχεδιάζει μερικές οριζόντιες γραμμές
             newpath
             50 55 moveto
             100 0 rlineto
             0 10 rmoveto
             -100 0 rlineto
             0 10 rmoveto
             100 0 rlineto
             0 10 rmoveto
             -100 0 rlineto
             closepath
             stroke
             showpage


Αυτό το πρόγραμμα σχεδιάζει έναν κύκλο με μερικές οριζόντιες γραμμές μέσα του,




βλέπουμε ότι καμιά δεν προεξέχει από την περιφέρεια του αν και όλες έχουν το ίδιο μήκος, 100
σημεία. Αυτό το φρόντισαν οι γραμμές το προγράμματος που όρισαν το clipping path, το οποίο είναι ο
κύκλος. Στη συνέχεια σχεδιάζονται οι οριζόντιες γραμμές. Θα παρατηρήσατε ότι πρώτα σχεδιάζεται ο
κύκλος και μετά ορίζεται το clipping path. Επειδή το clipping path είναι ο ίδιος κύκλος, αν ορίζαμε
πρώτα το clipping path και μετά σχεδιάζαμε τον κύκλο τότε το αποτέλεσμα θα ήταν απρόβλεπτο. Το
πιο πιθανό είναι να είναι "κομμένα" μερικά σημεία της περιφέρειας του κύκλου. Γι'αυτό το λόγο αν
θέλουμε και να σχεδιάσουμε το clipping path πρέπει πρώτα να το σχεδιάζουμε και μετά να το
ορίζουμε.
Αυτό το παράδειγμα έχει ένα ακόμα στοιχείο για τα προγράμματα PS. Σίγουρα θα παρατηρήσατε ότι
υπάρχουν γραμμές που αρχίζουν με το σύμβολο %. Όσες γραμμές αρχίζουν με αυτό το σύμβολο είναι
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                              24


σχόλια και όταν η PS συναντήσει μια γραμμή που αρχίζει με αυτό το σύμβολο την αγνοεί, όπως αγνοεί
και τις κενές γραμμές.




3.7 BITMAPPED IMAGES


Τώρα θα δούμε ένα ποιό πολύπλοκο θέμα. Ας υποθέσουμε ότι θέλουμε σε μια σελίδας να
προσθέσουμε και το λογοτυπό μας, το οποίο είναι μια περίεργη μη γραμμική εικόνα και είναι αδύνατο
να την ζωγραφίσουμε με εντολές postscript, αλλά είναι αρκετά εύκολο να την αναπαραστήσουμε με
ένα bitmapped image. Τότε είναι ώρα να χρησιμοποιήσουμε την εντολή image. Εδώ σημειώστε ότι η
postscript υποστηρίζει, δυστυχώς, μόνο greyscalled images. Η σύνταξη της εντολής image είναι η
παρακάτω:


              ScanLength scanLines bitsPerSample transformMatrix
              procedure image


Είναι λίγο παράξενη. Αλλά αν πάρουμε τα πράγματα από την αρχή θα γίνει πολύ κατανοητή.
Ένα bitmapped image στην πραγματικότα είναι ένας διδιάστατος πίνακας που οι διαστάσεις του είναι
το μέγεθος του bitmap. Για παράδειγμα ένα bitmap με ύψος 5 pixel και πλάτος 10 pixel αντιστοιχεί σε
ένα πίνακα 5x10. Το κάθε στοιχείο του πίνακα είναι ένα pixel. Το pixel αυτό μπορεί να είναι μαύρο,
άσπρο ή και να έχει κάποια απόχρωση του γκρί, άρα το αντίστοιχο στοιχείο του πίνακα θα έχει τιμές 0
για μαύρο, 255 για άσπρο και τις ενδιάμεσες τιμές για τις αποχρώσεις του γκρί. Δυστυχώς οι τιμές
αυτές πρέπει να είναι σε διαδικό. Βέβαια για ένα ασπρόμαυρο bitmap τα πράγματα είναι απλά, 0
μαύρο, 1 άσπρο. Έτσι ένα 5x5 ασπρόμαυρο bitmap είναι ένας πίνακας σαν τον παρακάτω
                                 1          0 0 0 1
                                 0          1 0 1 0
                                 0          0 1 0 0
                                 0          1 0 1 0
                                 1          0 0 0 1
Εδώ μπερδεύουν τα πράγματα. Η image        δεν δέχεται έναν τέτοιο πίνακα, πρέπει να βάλουμε τα
στοιχεία του πίνακα σε ένα string που περιέχει τα στοιχεία του πίνακα στη σειρά, δηλαδή κάτι τέτοιο

            1000101010001000101010001
το οποίο πρέπει να το μεταφράσουμε σε δεκαεξαδικούς αριθμούς (η image δέχεται δεκαεξαδικά
δεδομένα τα οποία μεταφράζει σε διαδικά). Έτσι ανά οκτώ μας δίνουν ένα δεκαεξαδικό αριθμό. Τα
δεδομένα κάθε γραμμής πρέπει να είναι σε συμπληρωμένες οκτάδες. Τα επιπλέον δεδομένα σε κάθε
γραμμή η image τα «πετάει». Εμείς όμως έχουμε πέντε ανά γραμμή, δεν πειράζει, συμπληρώνουμε τα
υπόλοιπα με μηδενικά. Τα δεδομένα μας πρέπει να συμπληρωθούν ώστε να γίνουν πέντε οκτάδες,
δηλαδή σαράντα, οπότε γίνονται:

            10001000 01010000 00100000 01010000 10001000
Τώρα τα χωρίζουμε σε οκτάδες
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        25


     10001000         01010000          00100000             01010000           10001000
     1η               2η                3η                   4η                 5η
και κάθε οκτάδα τη μετατρέπουμε σε δεκαεξαδικό:
                                  Διαδική τιμή          Δεκαεξαδική
                          1η      10001000              88
                          2η      01010000              50
                          3η      00100000              20
                          4η      01010000              50
                          5η      10001000              88
Τελικά τα δεδομένα για την image είναι το string
88 50 20 50 88
Τώρα αν θέλουμε το bitmap να έχει τόνους του γκρί το 0 και 1 δεν αρκεί. Για κάθε pixel χρειαζόμαστε
περισότερα bit. Έστω ότι βάζουμε δύο bit ανά pixel τότε ο αρχικός πίνακας γίνεται
                                    01    00       00   00   01
                                    00    01       00   01   00
                                    00    00       01   00   00
                                    00    01       00   01   00
                                    01    00       00   00   01
Και τα διαδικά δεδομένα είναι
01000000010001000100000010000000010001000100000001
συμπληρώνουμε τις οκτάδες
01000000 01000000
00010001 00000000
00000100 00000000
00010001 00000000
01000000 01000000
μετατρέπουμε κάθε οκτάδα σε δεκαεξαδικό και παίρνουμε
40 40 11 00 04 00 11 00 40 40
Μέχρι εδώ είδαμε πως μετατρέπουμε ένα bitmap σε δεδομένα κατάλληλα για την image. Τώρα ας
δούμε πως θα πούμε στην image πως να μεταφράσει αυτά τα δεδομένα.
Η image μετατρέπει το string που της δίνουμε σε διαδικά δεδομένα. Θεωρεί ότι κάθε δύο ψηφία είναι
ένας δεκαεξαδικός αριθμός, γι’ αυτό πρέπει να γράφουμε όλους τους αρθμούς με δύο ψηφία (π.χ. το F
πρέπει να το γράψουμε 0F). Αφού το κάνει αυτό πρέπει να ξέρει πόσα bit αντιστοιχούν σε κάθε pixel,
έτσι στο πρώτο παράδειγμα αντιστοιχεί 1bit ενώ στο δεύτερο 2. Επίσης πρέπει να ξέρει και πόσα pixel
έχει κάθε γραμμή, στο παραδειγμά μας κάθε γραμμή έχει πέντε pixel, καθώς και πόσες γραμμές έχει η
εικόνα, εδώ πέντε. Με αυτά νέα δεδομένα η image μπορεί να μετατρέψει το string με τους
δεκαεξαδικούς αριθμούς σε bitmap.
Τώρα ας δούμε πως τοποθετεί η PS στο χαρτί αυτό το bitmap. To bitmap τοποθετείται μέσα στο
στοιχειώδες τετράγωνο με πλευρά 1/72 της ίντσας. Έτσι αν θέλουμε το bitmap που τοποθετούμε να
είναι μεγαλύτερο κάνουμε πρίν ένα scale. Για το bitmap του παραδείγματος αν θέλουμε να
καταλαμβάνει μια τετραγωνική ιντσα στο χαρτί, κάνουμε το

             72 72 scale
και μετά βάζουμε την image.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                         26


Μέχρι εδώ έχουμε δεί τι σημαίνουν όλα τα ορίσματα της image. Ας τα βάλουμε όλα μαζί. Πρώτο είναι
το scanlines, είναι ο αριθμός των γραμμών που έχει το bitmap, στα παράδειγμά μας έχει 5. Δεύτερο
είναι bitPerSample, είναι πόσα bit από τα δεδομένα αντιστοιχούν σε κάθε pixel. Στη συνέχεια είναι το
transformMatrix, είναι ένας πίνακας τηε μορφής [n 0 0 m 0 0] όπου n είναι τα pixel ανά γραμμή και m
είναι ο αριθμός των γραμμών του bitmap. Τα pixel αρχίζουν να τοποθετούνται από την κάτω αριστερή
γωνία. Αν θέλουμε όμως τα pixel να αρχίζουν τοποθετούνται από την πάνω αριστερή γωνία γράφουμε
[n 0 0 –m 0 0]. Τέλος procedure είναι μια postscript υπορουτίνα που τροφοδοτεί την image με
δεδομένα του τύπου που περιγράψαμε ποιο πάνω. Αν την καλέσει μια φορά και τα δεδομένα δεν
φτάνουν για το bitmap που δηλώσαμε τότε η image την ξανακαλεί μέχρι να πάρει αρκετά δεδομένα.
Ας δούμε πως θα καλούσαμε την image για το bitmap που περιγράψαμε στην αρχή.



             72 72 scale
             5 5 1 [5 0 0 –5 0 0] {<8850205088>} image

Βάλαμε πρώτα την scale για να είναι αρκετά μεγάλο το αποτέλεσμα που θα δούμε.




Περίεργο; Αν κάνουμε inverse τα χρώματα βλέπουμε ένα ωραίο Χ.




Για να πάρουμε αυτό το σχήμα πρέπει στα δεδομένα μας να αντικαταστήσουμε τα 1 με 0 και
αντίστροφα.

Τώρα το ερώτημα είναι που στη σελίδα σχεδιάζει η PS το bitmap. Η απάντηση είναι, στο (0,0). Οπότε
για να σχεδιαστεί το bitmap στο σημείο που θέλουμε πρέπει να κάνουμε πρώτα ένα translate στο
σημείο που θέλουμε και μετά να το σχεδιάσουμε. Οπότε για να σχεδιαστεί το bitmap του
παραδειγματός μας στο σημείο 300,400 γράφουμε

             300 400 translate
             72 72 scale
             5 5 1 [5 0 0 –5 0 0] {<8850205088>} image

Εδώ τονίζουμε ξανά την λεπτομέρια του τέταρτου στοιχείου του tansformMatrix. Αν είναι θετικό και
κάνουμε transform στο 300,400 τότε το bitmap θα τοποθετηθεί ως εξής




Ενώ αν είναι αρνητικό
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        27




Τέλος θα αναφέρουμε και μια σχετική εντολή την imagemask. H imagemask συντάσεται ως εξής

             Width height invert matrix proc imagemask

Όπου width είναι το πλάτος του bitmap, height είναι το πλάτος του bitmap, matrix και proc είναι ότι
και στην image. Η imagemask «βάφει» μάυρα τα pixel που αντιστοιχούν σε μηδέν (0) και αφήνει
απείραχτα τα υπόλοιπα. Η παράμετρος invert αντιστρέφει και «βάφει» μάυρα τα pixel που
αντιστοιχούν σε άσσο (1) και αφήνει απείραχτα τα υπόλοιπα. Στο κεφάλαιο πέντε υπάρχει ένα πολύ
καλό πράδειγμα χρήσης της imagemask.




4.ΥΠΟΡΟΥΤΙΝΕΣ ΚΑΙ ΜΕΤΑΒΛΗΤΕΣ
4.1 ΥΠΟΡΟΥΤΙΝΕΣ
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                         28




Το τελευταίο παράδειγμα του προηγούμενου κεφαλαίου σχεδίαζε ένα "ριγέ" κύκλο, και το μεγαλύτερο
μέρος του προγράμματος ήταν αυτό που σχεδίαζε τις οριζόντιες γραμμές. Ένας λίγο πιο έξυπνος
τρόπος για να σχεδιάσουμε τις οριζόντιες γραμμές είναι να φτιάξουμε μια υπορουτίνα η οποία να
σχεδιάζει μια οριζόντια γραμμή και σαν ορίσματα να παίρνει την x και την y θέση που θα σχεδιαστεί η
γραμμή. Ας δούμε τη βελτιωμένη έκδοση.



             %υπορουτίνα που σχεδιάζει
             % οριζόντιες γραμμές
             /hline
             {
                   moveto
                  100 0 rlineto
             }def
             %σχεδιάζει τον κύκλο
             newpath
             100 100 50 0 360 arc
             closepath
             stroke
             % ορίζει το clipping path
             newpath
             100 100 50 0 360 arc
             closepath
             clip
             % σχεδιάζει μερικές οριζόντιες γραμμές
             newpath
             50 60 hline
             50 70 hline
             50 80 hline
             50 90 hline
             50 100 hline
             closepath
             stroke
             showpage



Αρχικά ορίζουμε την υπορουτίνα hline (Horizontal Line). Για να καταλάβει η PS ότι η λέξη hline δεν
είναι δεδομένο, βάζουμε στην αρχή της λέξης μια κάθετο (/). Τότε η PS καταλαβαίνει ότι πρόκειται για
όνομα "ορισμού". Ο ορισμός αρχίζει με την αριστερή αγκύλη ({) και τελειώνει με τη δεξιά αγκύλη (}).
Δηλαδή ο ορισμός μιας υπορουτίνας είναι
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        29




               /όνομα
               {
               ...
               εντολές
               ...
               } def



Μετά τη δεξιά αγκύλη ακολουθεί ο τελεστής def. Αυτός λέει στην PS ότι υπάρχει όνομα και ορισμός
στη στοίβα δεδομένων, τότε η PS γυρνάει πίσω στη στοίβα να βρει το όνομα και τον ορισμό και μετά
τα βάζει στον πίνακα των εντολών. Οι εντολές που περιέχονται στον ορισμό της υπορουτίνας μπορούν
να είναι οποιεσδήποτε εντολές PS ή και άλλες υπορουτίνες που έχουν οριστεί πιο πριν στο πρόγραμμα.
Αυτό που κάνει η υπορουτίνα του παραδείγματος, hline, είναι ένα moveto σε κάποια θέση και στη
συνέχεια μια ευθεία μήκους 100 σημείων. Το αποτέλεσμα είναι ίδιο με αυτό του προγράμματος στο
προηγούμενο κεφάλαιο. Αν προσέξετε θα δείτε ότι στη moveto δεν έχουμε δώσει ορίσματα και
πουθενά στον ορισμό της hline δε γίνεται καμιά αναφορά σ’αυτά. Το ερώτημα είναι πώς δίνουμε
δεδομένα στις υπορουτίνες. Την απάντηση θα τη βρούμε αν δούμε πώς γίνεται η κλήση της
υπορουτίνας.
Όταν πιο κάτω, στο πρόγραμμα, που καλούμε την hline λέμε,



                50 60 hline



δηλαδή, γράφουμε πρώτα τα δεδομένα, το σημείο από όπου θα αρχίζει η γραμμή, και μετά την hline. Η
PS όταν συναντήσει αυτή τη γραμμή θα βάλει στη στοίβα το 50 και το 60 και μετά θα ελέγξει αν
υπάρχει εντολή με το όνομα hline. Αν υπάρχει θα την εκτελέσει. Η πρώτη εντολή της hline είναι η
moveto. Η moveto παίρνει τα δύο πρώτα στοιχεία της στοίβας σαν το σημείο που θα τοποθετήσει το
δείκτη. Θυμηθείτε ότι έχουμε ήδη βάλει στη στοίβα δύο αριθμούς, αυτοί είναι οι αριθμοί που θα πάρει
η moveto. Δηλαδή τα δεδομένα που χρειάζονται οι εντολές μιας υπορουτίνας ψάχνουν να τα βρουν
στη στοίβα, σα να ήταν εντολές του κυρίως προγράμματος. Έτσι, πριν καλέσουμε την hline πρέπει να
βάλουμε στη στοίβα τους δύο αριθμούς που χρειάζεται η moveto. Το ίδιο πρέπει να κάνουμε αν έχουμε
και άλλες εντολές που χρειάζονται δεδομένα. Για παράδειγμα αν θέλαμε η hline να μη σχεδιάζει μόνο
οριζόντιες γραμμές μήκους 100 σημείων, αλλά να σχεδιάζει γενικά γραμμές που αρχίζουν από κάποιο
σημείο, τότε θα έπρεπε και η rlineto να μην έχει σταθερά δεδομένα αλλά να τα ορίζουμε κατά την
κλίση της hline. Ας δούμε πως θα ήταν το πιο πάνω πρόγραμμα με μια τέτοια hline.



               %υπορουτίνα που σχεδιάζει γραμμές
               /hline
               {
                     moveto
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                         30


                   rlineto
             }def
             %σχεδιάζει τον κύκλο
             newpath
             100 100 50 0 360 arc
             closepath
             stroke
             % ορίζει το clipping path
             newpath
             100 100 50 0 360 arc
             closepath
             clip
             % σχεδιάζει μερικές οριζόντιες γραμμές
             newpath
             100 0 50 60 hline
             100 0 50 70 hline
             100 0 50 80 hline
             100 0 50 90 hline
             100 0 50 100 hline
             closepath
             stroke
             showpage



Τώρα η rlineto δεν έχει και αυτή δεδομένα, μέσα στον ορισμό της hline. Πριν όμως καλέσουμε την
hline βάζουμε στη στοίβα ένα επιπλέον ζευγάρι αριθμών, που είναι τα δεδομένα της rlineto. Ίσως
φαίνεται παράξενο ότι πρώτα γράψαμε στη γραμμή τα δεδομένα για την rlineto και μετά τα δεδομένα
για την moveto μιας και εκτελείται πρώτα η moveto και μετά η rlineto. Αυτό είναι κάτι που πρέπει να
προσεχθεί πάρα πολύ. Η moveto εκτελείται πρώτη και συνεπώς πρέπει τα δεδομένα γι'αυτή να είναι
πρώτα στη στοίβα. Αν γράφαμε πρώτα το ζευγάρι της moveto και μετά το ζευγάρι της rlineto τότε
πρώτο στη στοίβα θα ήταν το ζευγάρι της rlineto, γιατί όπως είπαμε και στο πρώτο κεφάλαιο το
στοιχείο που θα μπεί πρώτο στη στοίβα θα βγει τελευταίο, άρα πρώτα γράφουμε τα δεδομένα της
εντολής που θα εκτελεστεί τελευταία, μετά της αμέσως προηγούμενης και συνεχίζουμε έτσι μέχρι την
πρώτη. Δηλαδή τα δεδομένα της τελευταίας τα γράφουμε πρώτα και της πρώτης τελευταία.




4.2 ΜΕΤΑΒΛΗΤΕΣ
Ας υποθέσουμε τώρα ότι κάποιος θέλει να σχεδιάσει το "ριγέ" κύκλο αλλά βαριέται να κάνει τις
προσθέσεις για να βρει την y θέση της κάθε οριζόντιας γραμμής και θέλει να βάλει την PS να κάνει τις
προσθέσεις. Για να γίνει αυτό χρειαζόμαστε μια μεταβλητή που να έχει αρχικά τη θέση της πρώτης
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                      31


γραμμής και μετά την πρώτη κλίση της hline να αυξάνει η τιμή της κατά 10 σημεία. Η νέα παραλλαγή
του προγράμματος είναι η παρακάτω.



             %υπορουτίνα που σχεδιάζει γραμμές
             /hline
             {
                  moveto
                  rlineto
             }def
             %ορίζουμε τη μεταβλητή
             /ypos 50 def
             %σχεδιάζει τον κύκλο
             newpath
             100 100 50 0 360 arc
             closepath
             stroke
             % ορίζει το clipping path
             newpath
             100 100 50 0 360 arc
             closepath
             clip
             % σχεδιάζει μερικές οριζόντιες γραμμές
             newpath
             100 0 50 ypos hline
             %αυξάνει την τιμή της ypos κατά 10
             /ypos ypos 10 add def
             100 0 50 ypos hline
             /ypos ypos 10 add def
             100 0 50 ypos hline
             /ypos ypos 10 add def
             100 0 50 ypos hline
             /ypos ypos 10 add def
             100 0 50 ypos hline
             closepath
             stroke
             showpage
Στην αρχή έχουμε τον ορισμό της hline, που είναι ίδιος με προηγουμένως, και στη συνέχεια ορίζουμε
τη μεταβλητή ypos. Παρατηρούμε ότι ο ορισμός της μεταβλητής είναι παρόμοιος με τον ορισμό της
υπορουτίνας, δηλαδή
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                    32


             /όνομα      τιμή    def



Εδώ δεν έχουμε τον ορισμό της μεταβλητής κλεισμένο μέσα σε αγκύλες. Μια μεταβλητή στην PS είναι
σαν μια υπορουτίνα που η δουλειά της είναι να βάζει ένα στοιχείο στη στοίβα. Το άλλο μέρος του
προγράμματος που έχει αλλάξει είναι το κομμάτι που σχεδιάζει τις οριζόντιες γραμμές. Στη γραμμή
που καλεί την hline έχουμε βάλει τη μεταβλητή μας στη θέση της μεταβαλλόμενης y συντεταγμένης.
Μετά την πρώτη κλήση της hline αυξάνουμε την τιμή της μεταβλητής, με ένα φαινομενικά παράξενο
τρόπο. Ο τρόπος που αλλάζουμε την τιμή μιας μεταβλητής έχει την ίδια λογική με αυτόν που
ακολουθούμε σε άλλες γλώσσες προγραμματισμού. Για παράδειγμα στη BASIC θα λέγαμε



             ypos = ypos + 10



το οποίο αν το αναλύσουμε σημαίνει, όρισε τιμή της μεταβλητής ypos, την τιμή που είχε, αφού της
προσθέσεις το δέκα. Το ypos + 10, μεταφράζεται σε PS



             ypos 10 add



και ίσον (=) της BASIC είναι ανάλογο με το



             /όνομα      τιμή    def



έτσι τελικά η ανάθεση της νέας τιμής στην ypos γίνεται με τη γραμμή



             /ypos ypos 10 add def



Το συμπέρασμα που καταλήγουμε είναι ότι το όρισμα μια μεταβλητής μπορεί να είναι και μια
έκφραση που το αποτέλεσμα της είναι μια σταθερά.
Τέλος ενδιαφέρον έχει να δούμε πώς ορίζουμε μεταβλητές που οι τιμές τους έχουν τα δεδομένα που
χρησιμοποιεί μια υπορουτίνα. Ας δούμε μια ακόμα παραλλαγή της hline, που βάζει τα δεδομένα που
χρησιμοποιεί σε μεταβλητές.



             /hline
             {
                 /y exch def
                 /x exch def
                 /ry exch def
                 /rx exch def
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        33


                   x y moveto
                   rx ry rlineto
             }def



Οι ορισμοί των μεταβλητών πρέπει να είναι μέσα στη δήλωση της υπορουτίνας. Η exch που ακολουθεί
το όνομα παίζει ένα πολύ σημαντικό ρόλο. Όταν καλούμε την υπορουτίνα υπάρχουν ήδη στη στοίβα
τα δεδομένα που θέλουμε να αποθηκεύσουμε στις μεταβλητές. Η πρώτη γραμμή της υπορουτίνας
αρχικά βάζει στη στοίβα το /y. Αυτή τη στιγμή στη στοίβα έχουμε πρώτα την τιμή και μετά το όνομα,
δηλαδή είναι ανάποδα από ότι πρέπει για να ορίσουμε τη μεταβλητή. Η σωστή σειρά είναι, όνομα τιμή.
Γι'αυτό βάζουμε και την exch, για να εναλλάξει το /y με την τιμή και έτσι μπαίνουν στη σωστή σειρά,
όνομα και τιμή. Τέλος η def τα παίρνει από τη στοίβα και ορίζει τη μεταβλητή y. Όμοια ορίζουμε και
τις υπόλοιπες μεταβλητές. Πρέπει να προσέχουμε τη σειρά με την οποία ορίζουμε τις μεταβλητές
ώστε να παίρνουν τις σωστές τιμές από τη στοίβα, πολύ απλά πρέπει να είναι με την αντίστροφη σειρά
από αυτή που βάζουμε τις τιμές στη γραμμή που καλούμε την υπορουτίνα.




5. ΕΛΕΓΧΟΣ ΡΟΗΣ


5.1 ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        34




Ας επανέρθουμε στο "ριγέ" κύκλο μας για να δούμε έναν ακόμα πιο έξυπνο τρόπο για να σχεδιάσουμε
τις οριζόντιες γραμμές. Θα ήταν πολύ πιο εύκολο να πούμε στην PS πόσες οριζόντιες γραμμές θέλουμε
να σχεδιάσουμε, αντί να γράψουμε κώδικα για κάθε μία από αυτές. Γνωρίζουμε, μάλλον, όλοι ότι αυτό
το πετυχαίνουμε με ένα βρόχο επανάληψης. Ας δούμε ένα βρόχο επανάληψης που σχεδιάζει δέκα
οριζόντιες γραμμές μέσα στον κύκλο μας.



             %υπορουτίνα που σχεδιάζει γραμμές
             /hline
             {
                   moveto
                   rlineto
             }def
             %ορίζουμε τη μεταβλητή
             /ypos 50 def
             %σχεδιάζει τον κύκλο
             newpath
             100 100 50 0 360 arc
             closepath
             stroke
             % ορίζει το clipping path
             newpath
             100 100 50 0 360 arc
             closepath
             clip
             newpath
             %σχεδιάζει 10 οριζόντιες γραμμές
             10 {
                       %αυξάνει την τιμή της ypos κατά 10
                       /ypos ypos 10 add def
                       100 0 50 ypos hline
             } repeat
             closepath
             stroke
             showpage
Η δομή του προγράμματος είναι ίδια με αυτή των προγραμμάτων του προηγούμενου κεφαλαίου.
Σχεδιάζει τον κύκλο, ορίζει το clipping path και τέλος σχεδιάζει τις γραμμές. Αυτό που έχει αλλάξει
είναι ότι δεν έχουμε δέκα γραμμές που καλούν την hline αλλά, μία. Θα παρατηρήσατε τη δομή repeat.
Η repeat συντάσσεται ως εξής
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                         35


             n {
             ...
             εντολές
             ...
             } repeat


όπου n είναι ένας ακέραιος αριθμός. Η δομή αυτή εκτελεί τις εντολές που περικλείονται στις αγκύλες n
φορές. Έτσι πολύ εύκολα παίρνουμε ένα καλύτερο από πριν αποτέλεσμα.




Αν τώρα έρθει πάλι αυτός που βαριέται να κάνει προσθέσεις και βαριέται να κάνει και διαίρεση, για να
βρει πόσες γραμμές χρειάζονται για να γεμίσει ο κύκλος, πρέπει να βάλει την PS να κάνει και αυτή τη
δουλειά. Τότε, θα γράψουμε το παρακάτω πρόγραμμα.



             %υπορουτίνα που σχεδιάζει γραμμές
             /hline
             {
                   moveto
                   rlineto
             }def
             %σχεδιάζει τον κύκλο
             newpath
             100 100 50 0 360 arc
             closepath
             stroke
             % ορίζει το clipping path
             newpath
             100 100 50 0 360 arc
             closepath
             clip
             newpath
             %σχεδιάζει 10 οριζόντιες γραμμές
             50 10 150 {
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                         36


                         /ypos exch def
                         100 0 50 ypos hline
                } for
                closepath
                stroke
                showpage



Ο βρόχος που μας δίνει όλες τις τιμές από μια αρχική μέχρι μια τελική τιμή με κάποιο βήμα, είναι ο
βρόχος for. Η λειτουργία της for, είναι κοινή σε όλες τις γλώσσες προγραμματισμού. Η σύνταξη της
στην PS είναι



                start_val step end_val {
                ...
                εντολές
                ...
                } for



όπου start_val είναι η αρχική τιμή, end_val είναι η τελική τιμή και step είναι το βήμα με το οποίο
μεταβάλλεται η start_val μέχρι να γίνει ίση ή να ξεπεράσει την end_val. Τους αριθμούς που "βγάζει" η
for τους βάζει στη στοίβα, δηλαδή αν δεν υπάρχει καμιά εντολή, μέσα στο βρόχο, που να παίρνει τους
αριθμούς αυτούς από τη στοίβα τότε μετά το τέλος του βρόχου, όλοι αυτοί οι αριθμοί θα είναι ακόμα
στη στοίβα και αν δεν τους χρειαζόμαστε θα πρέπει να τους "πετάξουμε". Αυτό είναι κάτι που πρέπει
να προσέχουμε όταν χρησιμοποιούμε for-βρόχους απλά για να επαναλαμβάνουμε κάποιες εντολές,
γιατί η for θα γεμίσει τη στοίβα άχρηστα δεδομένα και αν είναι πάρα πολλά υπάρχει ο κίνδυνος να
έχουμε ένα "stack overflow". Δηλαδή να γεμίσει η στοίβα, το μέγεθος της οποίας εξαρτάται από τη
μνήμη του εκτυπωτή, και να μην υπάρχει χώρος για τίποτα άλλο, οπότε σταματάει η εκτέλεση του
προγράμματος. Στο παράδειγμά μας τον αριθμού που βάζει, σε κάθε επανάληψη, η for στη στοίβα το
βάζουμε στη μεταβλητή y και τελικά το χρησιμοποιεί η moveto.




5.2 ΕΛΕΓΧΟΙ


Είναι καιρός να μάθουμε πώς κάνουμε ελέγχους στην PS. Η εντολή, σε όλες σχεδόν τις γλώσσες
προγραμματισμού, για ελέγχους είναι η if. Η σύνταξη της if στην PS είναι
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                            37




              bool proc if


όπου bool είναι μια λογική (boolean) έκφραση, μια σύγκριση, και όπου proc είναι η διαδικασία, σειρά
εντολών, που θα εκτελεστεί αν η bool είναι αληθείς. Για παράδειγμα



              4 3 gt {
              100 100 moveto
              100 100 rlineto
              } if



Η γραμμή αυτή ελέγχει αν το 4 είναι μεγαλύτερο από το 3, που όντως είναι, εκτελεί τη διαδικασία, τις
εντολές μέσα στις αγκύλες. Η σύγκριση γίνεται, σ'αυτό το παράδειγμα, με τον τελεστή gt. Όπως σε
όλες τις πράξεις, αριθμητικές και λογικές, στην PS πρώτα βάζουμε, στη στοίβα, τους αριθμούς και
μετά τον τελεστή. Δηλαδή η γενική μορφή μιας έκφρασης σύγκρισης είναι



              val1 val2 oper


όπου val1 είναι η τιμή που θα συγκριθεί με τη val2 και oper είναι ο τελεστής σύγκρισης. Οι τελεστές
σύγκρισης της PS είναι ίδιοι με αυτούς της FORTRAN. Ακολουθεί ένας πίνακας με τους τελεστές
σύγκρισης της PS.
                              eq            ίσο
                              ne            διάφορο (όχι ίσο)
                              gt            μεγαλύτερο από
                              lt            μικρότερο από
                              ge            μεγαλύτερο ή ίσο
                              le            μικρότερο ή ίσο


Αφού μπορούμε να ορίσουμε τι θα εκτελεστεί αν η σύγκριση είναι αληθείς, λογικό είναι να μπορούμε
να ορίσουμε τι θα εκτελεστεί αν είναι ψευδείς. Αυτό μπορούμε να το κάνουμε με την ifelse. Η σύνταξη
της είναι παρόμοια με της if, δηλαδή



              val1 val2 oper {true proc} {false proc} ifelse


όπου val1 είναι η τιμή που θα συγκριθεί με τη val2 και oper είναι ο τελεστής σύγκρισης. true proc είναι
η διαδικασία που θα εκτελεστεί αν η σύγκριση είναι αληθής και false proc είναι η διαδικασία που θα
εκτελεστεί αν η σύγκριση είναι ψευδής. Ένα απλό παράδειγμα είναι



              3 4 gt
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        38


             % true proc
             { 100 100 moveto
                  100 100 rlineto}
             % false proc
             { 100 100 moveto
                -100 -100 rlineto} ifelse


αρχικά γίνεται η σύγκριση αν το 3 είναι μεγαλύτερο ή ίσο του 4. Αν αυτό είναι αληθές θα εκτελεστούν
οι εντολές
               100 100 moveto
               100 100 rlineto


ενώ στην αντίθετη περίπτωση θα εκτελεστούν οι γραμμές
               100 100 moveto
                -100 -100 rlineto
Στην προκειμένη περίπτωση, που το 3 δεν είναι μεγαλύτερο ή ίσο του 4, θα εκτελεστεί το δεύτερο
ζευγάρι εντολών. Μια χρήση της if στην PS θα δούμε στη συνέχεια.




5.3 ΕΝΑΣ ΑΚΟΜΑ ΒΡΟΧΟΣ ΕΠΑΝΑΛΗΨΗΣ


Τώρα θα δούμε τον τρίτο βρόχο επανάληψης που διαθέτει η PS. Ο βρόχος αυτός είναι ο loop, ο οποίος
είναι ένας βρόχος χωρίς συνθήκη, δηλαδή είναι ατέρμονος. Συντάσσεται πολύ απλά



             {proc} loop



όπου proc είναι η διαδικασία που θα εκτελείται επ'άπειρων. Για παράδειγμα το παρακάτω πρόγραμμα
             { 100 } loop
θα βάζει τον αριθμό 100 στη στοίβα μέχρι που θα πάρουμε ένα "stack overflow" και θα σταματήσει
βίαια η εκτέλεση του. Αν κάποιοι αναρωτηθήκατε αν μπορούμε με κάποιο τρόπο να σταματήσουμε
τον ατέρμονο αυτό βρόχο, η απάντηση έρχεται με την εντολή exit. Η exit αναγκάζει τη loop να
σταματήσει και μεταφέρει την εκτέλεση του προγράμματος στην αμέσως επόμενη γραμμή από τη loop.
Δηλαδή το



             { 100 exit } loop



βάζει στη στοίβα το 100 και η exit μας βγάζει από το βρόχο.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                        39


Αυτό το παράδειγμα δε μας πείθει για τη χρησιμότητα της loop, μιας και η διαδικασία εκτελείται μόνο
μία φορά. Αυτό που θα μας έπειθε είναι μια συνθήκη. Ας δούμε το πρόγραμμα του "ριγέ" κύκλου με
χρήση της loop.



             %υπορουτίνα που σχεδιάζει γραμμές
             /hline
             {
                   moveto
                   rlineto
             }def
             %ορίζουμε τη μεταβλητή
             /ypos 50 def
             %σχεδιάζει τον κύκλο
             newpath
             100 100 50 0 360 arc
             closepath
             stroke
             % ορίζει το clipping path
             newpath
             100 100 50 0 360 arc
             closepath
             clip
             newpath
             %σχεδιάζει 10 οριζόντιες γραμμές
             {
                  %αυξάνει την τιμή της ypos κατά 10
                  /ypos ypos 10 add def
                  100 0 50 ypos hline
                  %ελέγχει αν η τιμή της ypos είναι ίση με 100
                  ypos 150 eq {exit} if
             } loop
             closepath
             stroke
             showpage



Εδώ χρησιμοποιούμε τη loop για το σχεδιασμό των οριζόντιων γραμμών. Το πρόγραμμα είναι μια
παραλλαγή αυτού που χρησιμοποιεί τη repeat. Έχουμε όμως προσθέσει έναν έλεγχο για την τιμή της
ypos. Η γραμμή



                  ypos 150 eq {exit} if
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                         40




ελέγχει αν η τιμή της ypos είναι ίση με 150, που είναι η πάνω "άκρη" του κύκλου. Αν η ypos είναι
μικρότερη από το 150 ο βρόχος συνεχίζεται, όταν όμως γίνει ίση με 150 τότε εκτελείται η exit και
εγκαταλείπεται η loop. Μετά την έξοδο από τη loop εκτελείται η closepath, δηλαδή η αμέσως επόμενη
εντολή απ'τη loop.



5.4 ΜΙΑ ΠΟΛΥΠΛΟΚΗ ΥΠΟΡΟΥΤΙΝΑ

Έστω θέλουμε μια υπορουτίνα που να σχεδιάζει ένα κύκλο σε κάποιο σημείο της σελίδας, ο οποίος
έχει περίγραμμα μαύρο, είναι γεμισμένος με χρώμα που θα περνάει σαν παράμετρος, και θα έχει
texture fill που και αυτό θα παιρνάει σαν παράμετρος. Η σύνταξη αυτής της υπορουτίνας θα είναι

             x y ratio pW pH hexData red green blue paternCircle
Όπου x,y οι συνταταγμένες του κέντρου του κύκλου, ratio η ακτίνα, pW και pH το πλάτος και το ύψος
του bitmap που θα χρησιποποιηθεί ως pattern για το texture fill, hexData τα δεδομένα που
περιγράφουν το pattern και τέλος red, green και blue οι συνηστώσες του χρώτος για το γέμισμα. Mια
τυπική της κλήση θα είναι κάπως έτσι

             495 259 50 5 5 <8850205088> 1.0 1.0 1.0 patternCircle

Ο κώδικας της είναι ο παρακάτω



             /patternCircle {
                % αποθηκεύουμε τις παραμέτρους σε μεταβλητές
                /cb exch def
                /cg exch def
                /cr exch def
                /hdata exch def
                /ph exch def
                /pw exch def
                /rat exch def
                /y0 exch def
                /x0 exch def
                % υπολογίζουμε την πάνω αριστερά γωνία, το ύψος και το
                % πλάτος του τετραγώνου που πρειγράφει τον κύκλο για
                % να το χρησιμοποιήσουμε για το texture fill.
                /top y0 rat sub def
                /left x0 rat sub def
                /w rat 2 mul def
                /h rat 2 mul def
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                              41



           % ορίζουμε το χρώμα του γεμίσματος
           cr cg cb setrgbcolor
           % ζωγραφίζουμε τον κυκλικό δίσκο
           newpath
           x0 y0 rat 0 360 arc
           closepath fill
           % ζωγραφίζουμε τον κύκλο του περιγράμματος
           0 0 0 setrgbcolor
           newpath
           x0 y0 rat 0 360 arc
           closepath stroke
           % αποθηκέυουμε την κατάσταση γραφικών, ώστε
           % μετά την εκτέλεση της υπορουτίνας να την
           % επαναφέρουμε ως ήταν πρίν.
           gsave
           % ορίζουμε το clipping path για να μην βγάνει το
           % texture έξω από τον κύκλο.
           newpath
           x0 y0 rat 0 360 arc
           closepath clip
           % κάνουμε ένα loop από την πάνω πλευρά του τετραγώνου
           % που περιβάλει τον κύκλο μέχρι την κάτω
           top ph top h add {
             % κράταμε τη νεα y συντεταγμένη
             /ty exch def
             % κάνουμε ένα δεύτερο loop από την αριστερή μέχρι την
             % δεξιά πλευρά του τετραγώνου
             left pw left w add {
               % κράταμε τη νεα y συντεταγμένη
               /tx exch def
               % αποθηκεύουμε την κατάσταση γραφικών, γιατί για να
               % σχεδιάσει η imagemask κάνουμε translate. Έτσι μετά
               % το σχεδιασμό κάνουμε grestore για να μην έχουμε
               % να κρατάμε σχετικές συντεταγμένες για τις
               % μετατοπίσεις
               gsave
               0 setgray
               % μεταφέρουμε την αρχή των αξόνων στο σημείο που
ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT                                                                      42



                     % πρέπει να σχεδιαστεί το επόμενο τμήμα του texture
                     tx ty ph add translate
                     % κάνουμε scale ώστε το pattern να έχει το μέγεθος
                     % που ζητήθηκε
                     pw ph scale
                     % ζωγραφίζουμε το pattern
                     pw ph true [pw 0 0 ph 0 0] {hdata} imagemask
                     % επαναφέρουμε την κατάσταση γραφικών
                     grestore
                  } for
                } for
                % επαναφέρουμε την κατάσταση γραφικών εκεί που ήταν
                % πριν την εκτέλεση της υπορουτίνας.
                grestore
             } def

Η λογική της ρουτίνας είναι απλή. Σχεδιάζουμε πρώτα τον κύκλο και στη συνέχεια σχεδιάζουμε το ένα
δίπλα στο άλλο bitmaps ώστε να καλυφθεί η επιφάνεια του κύκλου.




Το αποτέλεσμα που παίρνουμε έιναι κάπως έτσι




Φυσικά σε ένα postscript εκτυπωτή το οπτικό αποτέλεσμα είναι καλύτερο.


Μέχρι εδώ έχουμε μάθει αρκετά ώστε να μπορούμε να σχεδιάζουμε αρκετά πολύπλοκα σχέδια το
τελευταίο που θα μάθουμε είναι πως προσθέτουμε κείμενο στα σχέδια μας.




6. ΚΕΙΜΕΝΟ ΚΑΙ ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ
Εισαγωγή στην PostScript
Εισαγωγή στην PostScript
Εισαγωγή στην PostScript
Εισαγωγή στην PostScript
Εισαγωγή στην PostScript
Εισαγωγή στην PostScript
Εισαγωγή στην PostScript
Εισαγωγή στην PostScript

More Related Content

Featured

Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 
Good Stuff Happens in 1:1 Meetings: Why you need them and how to do them well
Good Stuff Happens in 1:1 Meetings: Why you need them and how to do them wellGood Stuff Happens in 1:1 Meetings: Why you need them and how to do them well
Good Stuff Happens in 1:1 Meetings: Why you need them and how to do them well
Saba Software
 

Featured (20)

Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 
More than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike RoutesMore than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike Routes
 
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
 
Barbie - Brand Strategy Presentation
Barbie - Brand Strategy PresentationBarbie - Brand Strategy Presentation
Barbie - Brand Strategy Presentation
 
Good Stuff Happens in 1:1 Meetings: Why you need them and how to do them well
Good Stuff Happens in 1:1 Meetings: Why you need them and how to do them wellGood Stuff Happens in 1:1 Meetings: Why you need them and how to do them well
Good Stuff Happens in 1:1 Meetings: Why you need them and how to do them well
 

Εισαγωγή στην PostScript

  • 1. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 1 ΠΡΟΛΟΓΟΣ 1ης έκδοσης Οι σημειώσεις που κρατάτε γράφτηκαν για να βοηθήσουν αυτούς που θέλουν να μάθουν γρήγορα Postscript, για να κάνουν κάποια δουλειά, και όχι όσους φιλοδοξούν να γίνουν "masters" της Postscript. Φυσικά όλοι χρειάζονται μια εισαγωγή. Εδώ περιγράφονται τα βασικά στοιχεία, περίπου το 1/3 των δυνατοτήτων της Postscript Level Ι, που όμως είναι αρκετά για να κάνετε, πραγματικά, πολλές και απαιτητικές δουλειές. Έχουν συμπεριληφθεί αρκετά παραδείγματα που εκτός από το διδακτικό ρόλο, παρουσιάζουν και κάποιες χρήσιμες τεχνικές. Όλα τα προγράμματα που υπάρχουν στο κείμενο έχουν ελεγχθεί και λειτουργούν σωστά. Το γνωσιολογικό υπόβαθρο που χρειάζεται για να διαβάσει κάποιος αυτές τις σημειώσεις, είναι η γνώση κάποιας γλώσσας προγραμματισμού υψηλού επιπέδου, προϋποθέτει κάποια εξοικείωση με τις βασικές έννοιες του προγραμματισμού, και στοιχειώδεις γνώσεις αναλυτικής γεωμετρίας. Π.Β.Κυριακάκης Ιούνιος 1995 2ης έκδοσης Δεν άλλαξαν πολλά πράγματα από την προηγούμενη έκδοση. Προστέθηκε μια παράγραφος στο τρίτο κεφάλαιο σχετικά με τα bitmap και ένα σχετικό παράδειγμα στο πέμπτο κεφάλαιο και έγιναν κάποιες «βελτιωσεις» στην εμφάνιση. Π.Β.Κυριακάκης Σεπτέμβριος 2001
  • 2. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 2 ΠΕΡΙΕΧΟΜΕΝΑ ΕΙΣΑΓΩΓΗ 3 1. ΣΤΟΙΒΑ ΚΑΙ ΑΡΙΘΜΗΤΙΚΗ 1.1 Η ΣΤΟΙΒΑ 4 1.2 Ο ΧΕΙΡΙΣΜΟΣ ΤΗΣ ΣΤΟΙΒΑΣ 4 1.3 ΑΡΙΜΘΗΤΙΚΗ ΣΤΗ ΣΤΟΙΒΑ 6 2. ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ & ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΙ 2.1 ΤΟ ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ 10 2.2 ΜΕΤΑΦΟΡΑ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ 10 2.3 ΠΕΡΙΣΤΡΟΦΗ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ 11 2.4 ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ 12 3. ΕΝΤΟΛΕΣ ΓΡΑΦΙΚΩΝ 3.1 ΜΕΤΑΚΙΝΗΣΗ ΤΟΥ ΔΕΙΚΤΗ 14 3.2 ΓΡΑΜΜΕΣ 14 3.3 ΧΡΩΜΑ 16 3.4 ΚΥΚΛΟΙ ΚΑΙ ΤΟΞΑ 19 3.5 ΚΑΤΑΣΤΑΣΗ ΓΡΑΦΙΚΩΝ 21 3.6 ΨΑΛΙΔΙΣΜΑ 22 3.7 BITMAPPED IMAGES 24 4. ΥΠΟΡΟΥΤΙΝΕΣ ΚΑΙ ΜΕΤΑΒΛΗΤΕΣ 4.1 ΥΠΟΡΟΥΤΙΝΕΣ 28 4.2 ΜΕΤΑΒΛΗΤΕΣ 31 5. ΕΛΕΓΧΟΣ ΡΟΗΣ 5.1 ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ 34 5.2 ΕΛΕΓΧΟΙ 37 5.3 ΕΝΑΣ ΑΚΟΜΑ ΒΡΟΧΟΣ ΕΠΑΝΑΛΗΨΗΣ 38 5.4 ΜΙΑ ΠΟΛΥΠΛΟΚΗ ΥΠΟΡΟΥΤΙΝΑ 40 6. ΚΕΙΜΕΝΟ ΚΑΙ ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ 6.1 ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ 43 6.2 ΚΕΙΜΕΝΟ 44 ΠΑΡΑΡΤΗΜΑ - ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΤΩΝ ΕΝΤΟΛΩΝ ΤΗΣ POSTSCRIPT 48 ΒΙΒΛΙΟΓΡΑΦΙΑ 51 ΕΙΣΑΓΩΓΗ Η PostScript είναι μια γλώσσα προγραμματισμού περιγραφής σελίδας. Περιγράφει μια εικονική σελίδα, με διάφορες εντολές γραφικών, η οποία και τελικά θα τυπωθεί. Τα προγράμματα PS μπορούν να εκτελεστούν σε κάθε είδους συσκευή σχεδιασμού, εκτυπωτές, ploter ακόμα και οθόνες. Το λειτουργικό σύστημα NeXTSTEP χρησιμοποιεί Postscript Display για το χειρισμό των γραφικών. Αλλά τα Postscript προγράμματα συνήθως είναι κείμενα προς εκτύπωση. Στους εκτυπωτές που υποστηρίζουν Postscript υπάρχει στη ROM ένας μεταφραστής (interpreter) στον οποίο εκτελούνται τα προγράμματα. Αν δεν έχετε στη διάθεση σας έναν Postscript εκτυπωτή μπορείτε να βλέπετε το αποτέλεσμα ενός προγράμματος σε κάποιο Postscript previewer. Ένας γνωστός free proviewer είναι το GSVIEW, το οποία τρέχει σε αρκετές πλατφόρμες.
  • 3. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 3 Συνήθως Postscript αρχεία παίρνουμε σαν έξοδο από διάφορες εφαρμογές (π.χ. σχεδιαστικό πακέτο) όμως υπάρχουν πολλοί προγραμματιστές που γράφουν Postscript "με το χέρι" για διάφορες γραφικές εργασίες. Εδώ θα μάθουμε να γράφουμε Postscript "με το χέρι", ώστε να μπορούμε να σχεδιάσουμε με ακρίβεια τα σχήματα μας, τότε όμως είμαστε σε θέση να γράψουμε κάποια εφαρμογή που να έχει και Postscript έξοδο. Πολλά φίλτρα εκτύπωσης, για παράδειγμα αυτό του UNIX (lpr), για να καταλάβουν ότι αυτό που στέλνουμε για εκτύπωση είναι Postscript θέλουν το αρχείο να αρχίζει με τον παρακάτω header %!PS-Adobe-2.0 %%Version: 3.15 %%DocumentFonts: (atend) %%Pages: (atend) %%EndComents χωρίς κενές γραμμές πάνω από αυτόν. Το τί σημαίνει δεν έχει σημασία σε πρώτη φάση. Μια αναλυτική παρουσίαση του header μπορείτε να διαβάσετε στο "Postscript language program design". Σημειώστε ότι, όλες οι εντολές πρέπει να είναι γραμμένες με πεζά γράμματα. Ας αρχίσουμε. 1. ΣΤΟΙΒΑ ΚΑΙ ΑΡΙΘΜΗΤΙΚΗ 1.1 Η ΣΤΟΙΒΑ. Η PS δε χειρίζεται τα δεδομένα όπως οι γνωστές γλώσσες προγραμματισμού υψηλού επιπέδου, όπου έχουμε μεταβλητές (θέσεις στη μνήμη) και τελεστές που δρούν στις τιμές των μεταβλητών παράγοντας κάποιο αποτέλεσμα το οποίο τοποθετείται σε κάποια θέση της μνήμης αλλά τα χειρίζεται η στοίβα. Η στοίβα στην PS είναι σαν ένας σωρός από κουτιά τοποθετημένα το ένα πάνω στο άλλο, από όπου μπορούμε να πάρουμε μόνο αυτό που τοποθετήσαμε τελευταίο, αυτό λέγεται LIFO (Last In First Out).
  • 4. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 4 Έτσι αν υποθέσουμε ότι αρχικά η στοίβα είναι κενή, και στη συνέχεια εκτελέσουμε τον παρακάτω κώδικα PS 12 35 14 τότε το περιεχόμενο της στοίβας θα είναι 14 35 12 Δηλαδή πρώτα εκτελέστηκε η πρώτη γραμμή που τοποθέτησε στη στοίβα το 12 στη συνέχεια η δεύτερη γραμμή που τοποθέτησε το 35 πάνω από το 12 και τέλος η τρίτη γραμμή που τοποθέτησε το 14 πάνω από το 35. Τώρα αν τραβήξουμε τα δεδομένα της στοίβας θα τα πάρουμε με την αντίστροφη σειρά από αυτή που τα τοποθετήσαμε, δηλαδή 14, 35, 12. 1.2 Ο ΧΕΙΡΙΣΜΟΣ ΤΗΣ ΣΤΟΙΒΑΣ Εύλογο είναι να αναρωτηθεί κανείς πώς χειριζόμαστε τη στοίβα, για παράδειγμα πως πετάμε κάτι που δε χρειαζόμαστε ή πώς εναλλάσσουμε τη σειρά 2 αντικειμένων στη στοίβα. Στην PS υπάρχουν διάφορες εντολές για το χειρισμό της στοίβας. Αν έχουμε τη στοίβα του προηγούμενου παραδείγματος και θέλουμε να απαλλαγούμε από το πρώτο στοιχείο της στοίβας τότε πολύ απλά το πετάμε έξω από αυτή κάνοντας το pop. Για παράδειγμα το πρόγραμμα 12 35 14 pop . κάνει το εξής. Οι πρώτες τρεις γραμμές τοποθετούν τα δεδομένα στη στοίβα έτσι η στοίβα γίνεται
  • 5. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 5 14 35 12 η τέταρτη γραμμή κάνει ένα pop στη στοίβα, πετάει το πρώτο αντικείμενο της στοίβας, έτσι τα περιεχόμενα της στοίβας είναι 35 12 Αν τώρα θέλουμε να εναλλάξουμε τη σειρά των 35 και 12, δηλαδή να είναι πάνω πάνω στη στοίβα το 12 τότε θα κάνουμε ένα exch (exchange), μια εναλλαγή. Έτσι αν η στοίβα είναι ως έχει, και πούμε exch τότε η στοίβα θα γίνει 12 35 Τέλος αν για κάποιο λόγο θέλουμε να έχουμε στη στοίβα μας δύο φορές το πρώτο της στοιχείο, το 12, θα πρέπει να το αναπαράγουμε (duplicate). Αυτή τη δουλειά την κάνει η εντολή dup. Αν πράγματι πούμε dup τότε η στοίβα γίνεται 12 12 35 'Ετσι, τώρα που μάθαμε να πετάμε (pop), να εναλλάσσουμε (exch) και να αναπαράγουμε (dup) τα αντικείμενα της στοίβας, μπορούμε να μάθουμε να κάνουμε και αριθμητικές πράξεις στη στοίβα.
  • 6. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 6 1.3 ΑΡΙΘΜΗΤΙΚΗ ΣΤΗ ΣΤΟΙΒΑ Ας ξεκινήσουμε με την πιο απλή πράξη, την πρόσθεση. Πρόσθεση γίνεται μεταξύ των δύο πρώτων μελών της στοίβας με τον τελεστή add. Ένα παράδειγμα πρόσθεσης είναι το παρακάτω πρόγραμμα 12 13 add αρχικά τοποθετεί στη στοίβα το 12 και το 13 και στη συνέχεια ο τελεστής add τα προσθέτει και τοποθετεί στη στοίβα το αποτέλεσμα, το 25. Δηλαδή αρχικά η στοίβα γίνεται 13 12 όταν δράσει ο add, γίνεται η πρόσθεση και η στοίβα γίνεται 25 δηλαδή περιέχει το αποτέλεσμα της πρόσθεσης. Κατά τον ίδιο τρόπο γίνονται και οι υπόλοιπες πράξεις. Χωρίς κανένα πρόβλημα κάνουνε πολλαπλασιασμό (mul), 12 13 mul και το αποτέλεσμα είναι στη στοίβα 156 Η αφαίρεση (sub) και η διαίρεση (div) θέλουν προσοχή για το πως θα τοποθετήσουμε στη στοίβα τους όρους. Για παράδειγμα, αν γράψουμε το πιο κάτω
  • 7. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 7 12 4 sub τότε το περιεχόμενο της στοίβας είναι 4 12 και ο τελεστής sub αφαιρεί το πρώτος μέλος της στοίβας από το δεύτερο και τοποθετεί στη στοίβα το αποτέλεσμα 8 Με το ίδιο σκεπτικό γίνεται και η διαίρεση (div). Η παρακάτω γραμμή 5 2 div αρχικά βάζει στη στοίβα τα δεδομένα, και τότε το περιεχόμενο της στοίβας είναι 2 5 μόλις δράσει ο div, γίνεται η διαίρεση και τοποθετείται στη στοίβα το αποτέλεσμα 2.5 Παρατηρούμε ότι έγινε πραγματική διαίρεση (διαίρεση μεταξύ πραγματικών αριθμών). Στην PS μπορούμε να κάνουμε και διαίρεση ακέραιων με των τελεστή idiv. Ο idiv τοποθετεί στη στοίβα το πηλίκο της διαίρεσης, ενώ το υπόλοιπο το παίρνουμε με τον τελεστή mod. Δηλαδή η γραμμή 5 2 idiv τοποθετεί στη στοίβα το 2 και η 5 2 mod
  • 8. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 8 τοποθετεί το υπόλοιπο δηλαδή το 1. Τώρα πια μπορούμε να κάνουμε και πολύπλοκους υπολογισμούς. Για παράδειγμα μπορούμε να υπολογίσουμε το (10-5)2. Για να κάνουμε αυτόν τον υπολογισμό, θα χρησιμοποιήσουμε και μια εντολή από την προηγούμενη παράγραφο, την dup. Τη dup θα τη χρειαστούμε για τον υπολογισμό του τετραγώνου. Ένας απλοϊκός τρόπος, για να το υπολογίσουμε, είναι να κάνουμε δύο φορές την αφαίρεση και μετά να πολλαπλασιάσουμε τα αποτελέσματα, δηλαδή 10 5 sub 10 5 sub mul . Ας δούμε τι γίνεται στη στοίβα η πρώτη γραμμή αφαιρεί το 5 από το 10 και τοποθετεί στη στοίβα το . αποτέλεσμα, δηλαδή το 5. Η δεύτερη τοποθετεί το 10 και μετά το 5 έτσι η στοίβα γίνεται 5 10 5 Η sub αφαιρεί το πρώτο 5 από το 10 και τοποθετεί το αποτέλεσμα στη στοίβα πάνω από το προηγούμενο 5, έτσι στη στοίβα έχουμε τα δύο 5 και τέλος η mul τα πολλαπλασιάζει και τοποθετεί το . αποτέλεσμα στη στοίβα. Ένας πιο έξυπνος τρόπος είναι ο εξής αρχικά κάνουμε την αφαίρεση και μετά αναπαράγουμε το αποτέλεσμα με τη dup και μετά εκτελούμε τον πολλαπλασιασμό, δηλαδή 10 5 sub dup mul Οι πράξεις στην PS απατούν κάποια εξοικείωση με τη στοίβα και το χειρισμό της ώστε να μην οδηγούμαστε σε λανθασμένα αποτελέσματα. Τέλος, υπάρχει και ένας πολύ ενδιαφέρον τελεστής, neg. Η δουλειά του είναι να αλλάζει το πρόσημο ένας αριθμού. Δηλαδή αν πούμε -4 neg
  • 9. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 9 το αποτέλεσμα είναι το 4. Τώρα που μάθαμε να χειριζόμαστε τα δεδομένα στη στοίβα και να κάνουμε πράξεις μπορούμε να αρχίσουμε να σχεδιάζουμε με την PS. 2.ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ & ΜΕΤΑΣΧΗΜΑΤΙΣΜΟΙ 2.1 ΤΟ ΣΥΣΤΗΜΑ ΑΝΑΦΟΡΑΣ Για να προσδιορίσουμε ένα σημείο πάνω σ' ένα επίπεδο, όπως γνωρίζουμε και από τα μαθηματικά, χρειαζόμαστε ένα σύστημα αναφοράς. Η PS έχει ένα ορθογώνιο σύστημα αξόνων, η αρχή του οποίου (το 0,0) είναι στην κάτω αριστερά γωνία της σελίδας.
  • 10. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 10 Σε σελίδα Α4 ο x (οριζόντιος) άξονας έχει μήκος 595 σημεία και ο y (κατακόρυφος) άξονας έχει μήκος 842 σημεία. Το "σημείο" είναι η μονάδα μέτρησης. Το φυσικό μήκος ενός σημείου είναι 1/72 της ίντσας. Λέγοντας φυσικό μήκος εννοούμε το πραγματικό μήκος, δηλαδή το μήκος που έχει αν τυπωθεί στο χαρτί. Έτσι αν πούμε στην PS να μας τυπώσει ένα ευθύγραμμο τμήμα 72 σημείων και μετά το μετρήσουμε στο χαρτί θα δούμε ότι έχει μήκος μια ίντσα. Σε αντίθεση με άλλες γλώσσες γραφικών στην PS μπορούμε να μεταφέρουμε και να περιστρέψουμε το σύστημα των αξόνων καθώς να αλλάξουμε και την κλίμακα του. 2.2 ΜΕΤΑΦΟΡΑ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ Μια απλή περίπτωση που θελήσουμε να μεταφέρουμε το σύστημα αναφοράς είναι όταν θέλουμε να σχεδιάσουμε ένα σχήμα του οποίου γνωρίζουμε τις συντεταγμένες και κάποιες από αυτές είναι αρνητικές. Στην PS αν χρησιμοποιήσουμε το αρχικό σύστημα και δώσουμε αρνητικές συντεταγμένες π.χ. -100,-40 τότε δε θα τυπωθεί τίποτα γιατί αυτά τα σημεία είναι έξω από το χαρτί. Αν όμως μεταφέρουμε το σύστημα στο 200,200 τότε το σημείο μας (-100,-40) είναι μέσα στο χαρτί και συνεπώς θα πάρουμε το επιθυμητό αποτέλεσμα. Η μεταφορά του συστήματος γίνεται με την εντολή translate. Η εντολή 200 200 translate θα μεταφέρει την αρχή του συστήματος στα σημείο 200,200 του τρέχοντος συστήματος.
  • 11. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 11 Οι μετασχηματισμοί στο σύστημα γίνονται ως προς το τρέχον σύστημα. Δηλαδή για να ξαναφέρουμε το συστημα στην αρχική του θέση θα πούμε -200 -200 translate Χρήσιμο είναι να πούμε ότι σε όλες τις εντολές της PS πρώτα δίνουμε τη x συντεταγμένη και μετά την y. Τώρα ας δούμε πως περιστρέφουμε το σύστημα αναφοράς. 2.3 ΠΕΡΙΣΤΡΟΦΗ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ Η περιστροφή του συστήματος είναι εξίσου απλή μα και χρήσιμη. Για παράδειγμα αν θέλουμε να τυπώσουμε μια λέξη με κλίση 60 μοιρών, το κάνουμε περιστρέφοντας το σύστημα αναφοράς κατά 60 μοίρες. Τη δουλειά αυτή την κάνει η εντολή rotate. Η rotate έχει ένα όρισμα, τη γωνία στροφής. Αν η γωνία αυτή είναι θετική, τότε το σύστημα περιστρέφεται ανάποδα από τη φορά των δεικτών του ρολογιού και κατά συνέπεια αν είναι αρνητική, περιστρέφεται κατά τη φορά των δεικτών του ρολογιού. 'Ετσι η εντολή 60 rotate περιστρέφει το σύστημα προς τα αριστερά
  • 12. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 12 ενώ η -60 rotate το επαναφέρει στη θέση του. 2.4 ΑΛΛΑΓΗ ΚΛΙΜΑΚΑΣ Στο αρχικό σύστημα στον x και στον y άξονα, όπως είναι λογικό, τα μήκη είναι ίδια. Μπορούμε όμως να αλλάξουμε την κλίμακα, με την εντολή scale. Έτσι αν αρχικά έχουμε το σχήμα και στη συνέχεια πούμε 1.5 1 scale τότε το x έχει 1.5 φορές μεγαλύτερο μήκος από ένα ίσο του στα y. Δηλαδή το πιο πάνω σχήμα θα γίνει κάπως έτσι.
  • 13. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 13 Τώρα που μάθαμε για το σύστημα αναφοράς της PS, μάθαμε το χώρο μέσα στον οποίο θα σχεδιάσουμε με τα "εργαλεία" του επόμενου κεφαλαίου. 3. ΕΝΤΟΛΕΣ ΓΡΑΦΙΚΩΝ
  • 14. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 14 3.1 Ο ΔΕΙΚΤΗΣ ΚΑΙ ΜΕΤΑΚΙΝΗΣΗ ΤΟΥ ΔΕΙΚΤΗ Ο τρόπος που σχεδιάζει η PS μοιάζει με τα "turtle graphics" της logo, όπου έχουμε ένα δείκτη πάνω στο χαρτί και τον μετακινούμε είτε αφήνοντας ίχνος (ζωγραφίζοντας) είτε όχι. Έτσι η PS έχει ένα δείκτη ο οποίος αρχικά είναι τοποθετημένος στο σημείο (x=0, y=0). Αυτό είναι και το σημείο από όπου αρχίζουμε πάντα. Έτσι αν θέλουμε να σχεδιάσουμε κάτι στο σημείο (100,100) πρέπει να τοποθετήσουμε το δείκτη εκεί. Δηλαδή χρειαζόμαστε μια εντολή που να τοποθετεί το δείκτη σε κάποιο σημείο, αυτή είναι η moveto. Η moveto παίρνει τα δύο πρώτα στοιχεία της στοίβας ως το σημείο που θα τοποθετήσει το δείκτη. Έτσι η 100 100 moveto τοποθετεί το δείκτη στο σημείο (100,100). Αν τώρα πούμε 100 100 moveto 50 100 moveto η πρώτη εντολή τοποθετεί το δείκτη στο σημείο (100,100) και η δεύτερη τον τοποθετεί στο σημείο (50,100). Δηλαδή η moveto μετακινεί το δείκτη ως προς την αρχή του συστήματος αναφοράς. Υπάρχει όμως και η rmoveto (relative move), η οποία μετακινεί το δείκτη ως προς το σημείο που βρίσκεται. Τα ορίσματα της rmoveto δεν είναι οι συντεταγμένες ως προς την αρχή αλλά το πόσο θέλουμε να κινηθεί ως προς το x και ως προς το y από το σημείο που βρίσκεται. Για παράδειγμα αν πούμε 100 100 moveto 50 100 rmoveto τότε η moveto θα τοποθετήσει το δείκτη στο σημείο (100,100) και η rmoveto θα τον μετακινήσει κατά 50 σημεία στα x και κατά 100 σημεία στα y δηλαδή τελικά ο δείκτης θα είναι στο σημείο (150,200) και αυτό είναι το σημείο από όπου θα αρχίσει και το ευθύγραμμο τμήμα που θα σχεδιάσουμε παρακάτω. 3.2 ΓΡΑΜΜΕΣ Ακολουθεί ένα απλό πρόγραμμα, το οποίο σχεδιάζει ένα ευθύγραμμο τμήμα, στο οποίο θα δούμε τις βασικές αρχές σχεδιασμού της PS. newpath 100 100 moveto
  • 15. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 15 200 200 lineto closepath stroke showpage Αρχικά βλέπουμε μια γνωστή σε μας εντολή, τη moveto, η οποία τοποθετεί το δείκτη στο σημείο (100,100). Εύκολα μπορούμε να υποψιαστούμε τι κάνει η lineto. Η lineto ορίζει ένα ευθύγραμμα τμήμα από το τρέχον σημείο (το σημείο που βρίσκεται ο δείκτης) ως το σημείο (200,200), όπως φαίνεται στο παρακάτω σχήμα. Τώρα ας πάμε στο "μονοπάτι" (path). Η εντολή newpath αδειάζει το τρέχον path και δηλώνει ότι αρχίζουμε ένα νέο. Στο παράδειγμα μας φτιάχνουμε ένα ευθύγραμμο path που αντιστοιχεί στο ευθύγραμμο τμήμα που θέλουμε να σχεδιάσουμε. Ένα path δημιουργείται μετακινώντας ένα φανταστικό μολύβι πάνω στην σελίδα. Αυτό το μολύβι αφήνει ένα αόρατο ίχνος στη σελίδα το οποίο αντιπροσωπεύει το τρέχον path. Η closepath θέτει το τέλος στο path που άρχισε με την αμέσως προηγούμενη newpath. Στο παράδειγμα μας το τρέχον path δημιουργείται από τις moveto και lineto. Αν θέλουμε να σχεδιαστεί το path που φτιάξαμε με το τρέχον χρώμα (εξ ορισμού μαύρο) αυτό θα το πούμε με την stroke. Η stroke σχεδιάζει το περιεχόμενο του αμέσως προηγούμενου path. Η τελευταία εντολή του παραδείγματος, η showpage, είναι ίσως από τις πιο σημαντικές εντολές της PS. Αν στείλουμε στον εκτυπωτή το πιο πάνω πρόγραμμα χωρίς τη showpage τότε αυτός θα το εκτελέσει (θα το "τρέξει") στη μνήμη αλλά δε θα τυπώσει τίποτα γιατί δεν του το είπαμε. Όλες οι άλλες εντολές λένε στον εκτυπωτή τί να σχεδιάσει και πώς, η showpage όμως λέει στον εκτυπωτή να το τυπώσει στο χαρτί. Στην προηγούμενη παράγραφο είδαμε την εντολή rmoveto η οποία μετακινεί το δείκτη σε σχέση με το τρέχον σημείο. Ανάλογη εντολή υπάρχει και για τις γραμμές, η rlineto. Η rlineto ορίζει το τελικό σημείο του ευθύγραμμου τμήματος σε σχέση με το τρέχον σημείο, τη δουλεία που κάνει το προηγούμενο πρόγραμμα δηλαδή μια γραμμή με αρχή το (100,100) και τέλος το (200,200) μπορούμε να την κάνουμε και με την rlineto με το παρακάτω πρόγραμμα newpath 100 100 moveto
  • 16. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 16 100 100 rlineto closepath stroke showpage Η moveto τοποθετεί το δείκτη στο σημείο (100,100) και η rlineto λέει ότι θέλουμε μια γραμμή από το τρέχον σημείο, το (100,100) μέχρι το σημείο (100+100, 100+100) δηλαδή το (200,200) όπως και το πρώτο πρόγραμμα. Αν θα χρησιμοποιήσουμε τη lineto ή την rlineto εξαρτάται από το αν ξέρουμε τις συντεταγμένες του τελικού σημείου ή αν ξέρουμε το πόσο απέχει το τελικό από το αρχικό σημείο. Για παράδειγμα αν θέλουμε να σχεδιάσουμε ένα τετράγωνο πλευράς 50 σημείων με την κάτω αριστερά του γωνία στο (100,100) βολεύει η rlineto. Ενα τέτοιο τετράγωνο σχεδιάζει και αυτό το πρόγραμμα newpath 100 100 moveto 0 50 rlineto 50 0 rlineto 0 -50 rlineto -50 0 rlineto closepath stroke showpage Αρχικά τοποθετεί το δείκτη στο σημείο (100,100). Η πρώτη rlineto σχεδιάζει μια κατακόρυφη γραμμή προς τα πάνω μήκους 50 σημείων. Η δεύτερη μια οριζόντια προς τα δεξιά. Η τρίτη μια κατακόρυφη προς τα κάτω, αφαιρούμε 50 σημεία από την y συντεταγμένη του τρέχοντος σημείου. Τέλος η τέταρτη rlineto σχεδιάζει τη βάση του τετραγώνου, μια γραμμή μήκους 50 προς τα αριστερά. Ας δούμε πώς θα γεμίσουμε με χρώμα το τετράγωνό μας. 3.3 ΧΡΩΜΑ Ας πάρουμε το πρόγραμμα που σχεδιάζει το τετράγωνο, και να του κάνουμε μια μικρή αλλαγή newpath 100 100 moveto 0 50 rlineto 50 0 rlineto
  • 17. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 17 0 -50 rlineto -50 0 rlineto closepath fill showpage θα αλλάξουμε την εντολή stoke με τη fill και το αποτέλεσμα είναι ένα μαύρο τετράγωνο. Η fill λέει στην PS να γεμίσει με χρώμα το path που ορίσαμε. Ο χώρος που θα γεμίσει είναι το κλειστό σχήμα που ορίζεται από τις γραμμές που αρχίζουν στο αρχικό σημείο που θα βάλουμε το δείκτη και τελειώνουν ξανά σε αυτό. Αν δεν κλείνει το σχήμα στο αρχικό σημείο το αποτέλεσμα είναι απρόβλεπτο και σίγουρα όχι το επιθυμητό. Πολύ εύκολα μπορούμε να αλλάξουμε την απόχρωση του γκρι που θα γεμίσει το τετράγωνο μας με τη setgray όπως κάνει το παρακάτω πρόγραμμα newpath 100 100 moveto 0 50 rlineto 50 0 rlineto 0 -50 rlineto -50 0 rlineto closepath 0.5 setgray fill showpage και το τετράγωνο που παίρνουμε είναι κάπως έτσι
  • 18. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 18 Η setgray περιμένει να βρει στη στοίβα έναν αριθμό μεταξύ 0 και 1, το 0 είναι μαύρο και το 1 άσπρο. Αν δε βάλουμε άλλη setgray ό,τι σχεδιάσουμε μετά (στο ίδιο πρόγραμμα) θα έχει τον ίδιο τόνο γκρι που ορίσαμε. Τα σχέδια μας, όμως, δεν είναι υποχρεωτικά σε αποχρώσεις του γκρι, μπορούν να είναι και έγχρωμα. Η PS έχει και χρώματα, αλλά τα καθορίζει με ένα λίγο παράξενο τρόπο. Υπάρχει η θεωρία που λέει, και πράγματι ισχύει, ότι όλα τα χρώματα και οι αποχρώσεις τους μπορούν να παραχθούν με την ανάμειξη του κόκκινου (Red), του πράσινου (Green) και του μπλε (Blue). Από τα ονόματα αυτών των χρωμάτων βγαίνει η ονομασία RGB. 'Ετσι μπορούμε να προσδιορίσουμε όλα τα χρώματα από την ποσότητα κάθε συνθετικού που περιέχει. Κάνοντας τη σύμβαση οι ποσότητες να είναι από 0 έως 1, πολύ απλά το κόκκινο ορίζεται από την τριάδα (1,0,0), δηλαδή 1 κόκκινο, 0 πράσινο, 0 μπλε. Μαύρο στην ίδια θεωρία είναι κάτι χωρίς χρώμα, δηλαδή το (0,0,0) και το άσπρο όλα τα χρώματα μαζί στο μέγιστο δηλαδή (1,1,1). Με αυτό τον τρόπο καθορίζει τα χρώματα και η PS. Με την εντολή setrgbcolor αλλάζουμε το τρέχον χρώμα, το μαύρο, σε κάποιο άλλο. Τώρα μπορούμε να βάψουμε το τετράγωνο μας με κάποιο χρώμα, newpath 100 100 moveto 0 50 rlineto 50 0 rlineto 0 -50 rlineto -50 0 rlineto closepath 0.98 0.98 0.31 setrgbcolor fill showpage και το αποτέλεσμα είναι ένα κίτρινο τετράγωνο, το οποίο αν τυπωθεί σε έναν ασπρόμαυρο εκτυπωτή μοιάζει κάπως έτσι
  • 19. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 19 'Οπως και με τη setgray η setrgbcolor αλλάζει το τρέχον χρώμα, το οποίο εξ ορισμού είναι το μαύρο, σε κάποιο άλλο και παραμένει μέχρι να το ξανά αλλάξουμε. Κάτι χρήσιμο εκτός από το χρώμα είναι και το πώς σχεδιάζουμε κύκλους και τόξα. 3.4 ΚΥΚΛΟΙ ΚΑΙ ΤΟΞΑ Ας δούμε πώς ορίζουμε ένα τόξο στην PS. Τόξο είναι κομμάτι ενός κύκλου, και το μήκος του προσδιορίζεται απ'τη γωνία μεταξύ των ακτινών στα άκρα του. Τη γωνία αυτή την ορίζουμε σαν τη διαφορά δύο γωνιών που τις μετράμε από τη δεξιά πλευρά της οριζόντιας διαμέτρου του κύκλου. Δηλαδή χρειαζόμαστε, τις συντεταγμένες του κέντρου, την ακτίνα, την αρχική γωνία (θ1) και την τελική γωνία (θ2). Οι γωνίες είναι όπως φαίνονται στο παρακάτω σχήμα Η εντολή arc σχεδιάζει τόξα με αυτό τον τρόπο, για παράδειγμα το πρόγραμμα newpath 100 100 50 30 60 arc closepath stroke showpage σχεδιάζει τόξο ενός κύκλου με κέντρο το (100,100) και ακτίνα 50 από γωνία 30ο έως γωνία 60ο.
  • 20. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 20 Τώρα πια μπορούμε πολύ εύκολα να σχεδιάσουμε ένα κύκλο. Πολύ απλά θα αλλάξουμε τις γωνίες, θα αρχίζει από τη γωνία 0 και θα τελειώνει στις 360ο. Δηλαδή θα πούμε newpath 100 100 50 0 360 arc closepath stroke showpage και αυτό που θα πάρουμε είναι ένας κύκλος με κέντρο το (100,100) και ακτίνα 50 σημεία. Με ένα μικρό κόλπο μπορούμε να σχεδιάσουμε μια έλλειψη. Το κόλπο είναι να αλλάξουμε την κλίμακα, είτε κατά x είτε κατά y, ώστε να "τραβήξουμε" τον κύκλο από τη μια του διάμετρο να πλατύνει και να γίνει έλλειψη. Όπως ξέρουμε η PS έχει μια ειδική εντολή για την αλλαγή κλίμακας τη scale. Το επόμενο πρόγραμμα σχεδιάζει μια έλλειψη, μεγαλώνοντας την x κλίμακα και στη συνέχεια σχεδιάζει έναν κύκλο. 100 100 translate 1.5 1 scale newpath 0 0 50 0 360 arc closepath stroke showpage Το αποτέλεσμα όπως φαίνεται και στο σχήμα είναι πράγματι μια έλλειψη.
  • 21. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 21 Αυτό το πρόγραμμα έχει δύο παραξενιές, η πρώτη είναι η translate στην αρχή από το πρόγραμμα και η δεύτερη, ότι το κέντρο του κύκλου είναι στο (0,0). Αν δεν υπήρχε η translate και σχεδιάζαμε τον κύκλο με κέντρο το (100,100), το πρόβλημα θα ήταν ότι η έλλειψη μας δε θα σχεδιαζόταν εκεί που θέλουμε γιατί έχουμε μεγαλώσει την κλίμακα στα x και συνεπώς θα σχεδιαζόταν πιο δεξιά από το επιθυμητό μέρος. Γι' αυτό το λόγο μεταφέρουμε αρχικά το σύστημα αναφοράς εκεί που θέλουμε το κέντρο του κύκλου, δηλαδή το (100,100), μετά αλλάζουμε την κλίμακα και τέλος σχεδιάζουμε έναν κύκλο στην αρχή του συστήματος με ακτίνα 50. Το μόνο πρόβλημα τώρα είναι ότι για να συνεχίσουμε το σχέδιο μας πρέπει να ξαναλλάξουμε την κλίμακα και να ξαναβάλουμε το σύστημα αναφοράς στην αρχική του θέση. Δηλαδή έπρεπε μετά τη stroke να υπάρχουν οι εντολές 0.66 1 scale -100 -100 translate Μια πιο εύκολη λύση σ' αυτό το πρόβλημα θα δούμε στη συνέχεια. 3.5 ΚΑΤΑΣΤΑΣΗ ΓΡΑΦΙΚΩΝ Κατάσταση γραφικών (graphics state) είναι η θέση, ο προσανατολισμός, και η κλίμακα του συστήματος αναφοράς και το χρώμα. Η εντολή gsave αποθηκεύει στη μνήμη την κατάσταση γραφικών και η grestore την επαναφέρει. Έτσι στο προηγούμενο παράδειγμα αν είχαμε αποθηκεύσει την κατάσταση γραφικών πριν την translate μετά το σχεδιασμό της έλλειψης θα μπορούσαμε να επαναφέρουμε τα πράγματα στην κατάσταση που ήταν στην αρχή. Το επόμενο πρόγραμμα σχεδιάζει την προηγούμενη έλλειψη και τον κύκλο με κέντρο το (100,100) και ακτίνα 50 χωρίς την αλλαγή κλίμακας. gsave 100 100 translate 1.5 1 scale newpath 0 0 50 0 360 arc closepath stroke grestore newpath 100 100 50 0 360 arc
  • 22. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 22 closepath stroke showpage Αποθηκεύουμε την κατάσταση γραφικών, σχεδιάζουμε την έλλειψη, με το γνωστό τρόπο, επαναφέρουμε την κατάσταση γραφικών και μετά σχεδιάζουμε τον κύκλο. Στο σχήμα βλέπουμε ότι το "κόλπο" με τη μεταφορά και την αλλαγή κλίμακας όντως δουλεύει και το κέντρο της έλλειψης είναι το (100,100). 3.6 ΨΑΛΙΔΙΣΜΑ Ας υποθέσουμε ότι θέλουμε να σχεδιάσουμε ένα ριγέ κύκλο, αυτό που πρέπει να κάνουμε είναι σχεδιάσουμε ένα κύκλο και μερικές οριζόντιες γραμμές. Όμως το μήκος των γραμμών δεν είναι σταθερό, και καταλαβαίνουμε ότι δεν είναι εύκολο να υπολογίσουμε τις συντεταγμένες των άκρων των γραμμών. Κάτι που θα μας βόλευε είναι να σχεδιάσουμε τον κύκλο, μετά οριζόντιες γραμμές ίσου μήκους και με κάποιο τρόπο να "σβήσουμε" το μέρος των γραμμών που είναι έξω από τον κύκλο. Δηλαδή χρειαζόμαστε ένα τρόπο να πούμε στην PS την περιοχή, το path, μέσα στην οποία θέλουμε να "φαίνεται" ότι σχεδιάζουμε. Αυτό γίνεται ορίζοντας ένα path και στη συνέχεια αντί να το κάνουμε stroke ή κάτι τέτοιο λέμε clip. Ο τελεστής clip ορίζει το path ψαλιδίσματος (clipping path), ό,τι είναι έξω από αυτό "ψαλιδίζεται" δηλαδή δε σχεδιάζεται. Αν σχεδιάσουμε τον κύκλο και τις γραμμές, ίσου μήκους, αυτό που θέλουμε να ψαλιδιστεί είναι ό,τι είναι έξω από τον κύκλο, άρα το clipping path εδώ είναι ο κύκλος. Ας δούμε πώς γίνεται στην πράξη. %σχεδιάζει τον κύκλο newpath 100 100 50 0 360 arc closepath stroke % ορίζει το clipping path
  • 23. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 23 newpath 100 100 50 0 360 arc closepath clip % σχεδιάζει μερικές οριζόντιες γραμμές newpath 50 55 moveto 100 0 rlineto 0 10 rmoveto -100 0 rlineto 0 10 rmoveto 100 0 rlineto 0 10 rmoveto -100 0 rlineto closepath stroke showpage Αυτό το πρόγραμμα σχεδιάζει έναν κύκλο με μερικές οριζόντιες γραμμές μέσα του, βλέπουμε ότι καμιά δεν προεξέχει από την περιφέρεια του αν και όλες έχουν το ίδιο μήκος, 100 σημεία. Αυτό το φρόντισαν οι γραμμές το προγράμματος που όρισαν το clipping path, το οποίο είναι ο κύκλος. Στη συνέχεια σχεδιάζονται οι οριζόντιες γραμμές. Θα παρατηρήσατε ότι πρώτα σχεδιάζεται ο κύκλος και μετά ορίζεται το clipping path. Επειδή το clipping path είναι ο ίδιος κύκλος, αν ορίζαμε πρώτα το clipping path και μετά σχεδιάζαμε τον κύκλο τότε το αποτέλεσμα θα ήταν απρόβλεπτο. Το πιο πιθανό είναι να είναι "κομμένα" μερικά σημεία της περιφέρειας του κύκλου. Γι'αυτό το λόγο αν θέλουμε και να σχεδιάσουμε το clipping path πρέπει πρώτα να το σχεδιάζουμε και μετά να το ορίζουμε. Αυτό το παράδειγμα έχει ένα ακόμα στοιχείο για τα προγράμματα PS. Σίγουρα θα παρατηρήσατε ότι υπάρχουν γραμμές που αρχίζουν με το σύμβολο %. Όσες γραμμές αρχίζουν με αυτό το σύμβολο είναι
  • 24. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 24 σχόλια και όταν η PS συναντήσει μια γραμμή που αρχίζει με αυτό το σύμβολο την αγνοεί, όπως αγνοεί και τις κενές γραμμές. 3.7 BITMAPPED IMAGES Τώρα θα δούμε ένα ποιό πολύπλοκο θέμα. Ας υποθέσουμε ότι θέλουμε σε μια σελίδας να προσθέσουμε και το λογοτυπό μας, το οποίο είναι μια περίεργη μη γραμμική εικόνα και είναι αδύνατο να την ζωγραφίσουμε με εντολές postscript, αλλά είναι αρκετά εύκολο να την αναπαραστήσουμε με ένα bitmapped image. Τότε είναι ώρα να χρησιμοποιήσουμε την εντολή image. Εδώ σημειώστε ότι η postscript υποστηρίζει, δυστυχώς, μόνο greyscalled images. Η σύνταξη της εντολής image είναι η παρακάτω: ScanLength scanLines bitsPerSample transformMatrix procedure image Είναι λίγο παράξενη. Αλλά αν πάρουμε τα πράγματα από την αρχή θα γίνει πολύ κατανοητή. Ένα bitmapped image στην πραγματικότα είναι ένας διδιάστατος πίνακας που οι διαστάσεις του είναι το μέγεθος του bitmap. Για παράδειγμα ένα bitmap με ύψος 5 pixel και πλάτος 10 pixel αντιστοιχεί σε ένα πίνακα 5x10. Το κάθε στοιχείο του πίνακα είναι ένα pixel. Το pixel αυτό μπορεί να είναι μαύρο, άσπρο ή και να έχει κάποια απόχρωση του γκρί, άρα το αντίστοιχο στοιχείο του πίνακα θα έχει τιμές 0 για μαύρο, 255 για άσπρο και τις ενδιάμεσες τιμές για τις αποχρώσεις του γκρί. Δυστυχώς οι τιμές αυτές πρέπει να είναι σε διαδικό. Βέβαια για ένα ασπρόμαυρο bitmap τα πράγματα είναι απλά, 0 μαύρο, 1 άσπρο. Έτσι ένα 5x5 ασπρόμαυρο bitmap είναι ένας πίνακας σαν τον παρακάτω 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 Εδώ μπερδεύουν τα πράγματα. Η image δεν δέχεται έναν τέτοιο πίνακα, πρέπει να βάλουμε τα στοιχεία του πίνακα σε ένα string που περιέχει τα στοιχεία του πίνακα στη σειρά, δηλαδή κάτι τέτοιο 1000101010001000101010001 το οποίο πρέπει να το μεταφράσουμε σε δεκαεξαδικούς αριθμούς (η image δέχεται δεκαεξαδικά δεδομένα τα οποία μεταφράζει σε διαδικά). Έτσι ανά οκτώ μας δίνουν ένα δεκαεξαδικό αριθμό. Τα δεδομένα κάθε γραμμής πρέπει να είναι σε συμπληρωμένες οκτάδες. Τα επιπλέον δεδομένα σε κάθε γραμμή η image τα «πετάει». Εμείς όμως έχουμε πέντε ανά γραμμή, δεν πειράζει, συμπληρώνουμε τα υπόλοιπα με μηδενικά. Τα δεδομένα μας πρέπει να συμπληρωθούν ώστε να γίνουν πέντε οκτάδες, δηλαδή σαράντα, οπότε γίνονται: 10001000 01010000 00100000 01010000 10001000 Τώρα τα χωρίζουμε σε οκτάδες
  • 25. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 25 10001000 01010000 00100000 01010000 10001000 1η 2η 3η 4η 5η και κάθε οκτάδα τη μετατρέπουμε σε δεκαεξαδικό: Διαδική τιμή Δεκαεξαδική 1η 10001000 88 2η 01010000 50 3η 00100000 20 4η 01010000 50 5η 10001000 88 Τελικά τα δεδομένα για την image είναι το string 88 50 20 50 88 Τώρα αν θέλουμε το bitmap να έχει τόνους του γκρί το 0 και 1 δεν αρκεί. Για κάθε pixel χρειαζόμαστε περισότερα bit. Έστω ότι βάζουμε δύο bit ανά pixel τότε ο αρχικός πίνακας γίνεται 01 00 00 00 01 00 01 00 01 00 00 00 01 00 00 00 01 00 01 00 01 00 00 00 01 Και τα διαδικά δεδομένα είναι 01000000010001000100000010000000010001000100000001 συμπληρώνουμε τις οκτάδες 01000000 01000000 00010001 00000000 00000100 00000000 00010001 00000000 01000000 01000000 μετατρέπουμε κάθε οκτάδα σε δεκαεξαδικό και παίρνουμε 40 40 11 00 04 00 11 00 40 40 Μέχρι εδώ είδαμε πως μετατρέπουμε ένα bitmap σε δεδομένα κατάλληλα για την image. Τώρα ας δούμε πως θα πούμε στην image πως να μεταφράσει αυτά τα δεδομένα. Η image μετατρέπει το string που της δίνουμε σε διαδικά δεδομένα. Θεωρεί ότι κάθε δύο ψηφία είναι ένας δεκαεξαδικός αριθμός, γι’ αυτό πρέπει να γράφουμε όλους τους αρθμούς με δύο ψηφία (π.χ. το F πρέπει να το γράψουμε 0F). Αφού το κάνει αυτό πρέπει να ξέρει πόσα bit αντιστοιχούν σε κάθε pixel, έτσι στο πρώτο παράδειγμα αντιστοιχεί 1bit ενώ στο δεύτερο 2. Επίσης πρέπει να ξέρει και πόσα pixel έχει κάθε γραμμή, στο παραδειγμά μας κάθε γραμμή έχει πέντε pixel, καθώς και πόσες γραμμές έχει η εικόνα, εδώ πέντε. Με αυτά νέα δεδομένα η image μπορεί να μετατρέψει το string με τους δεκαεξαδικούς αριθμούς σε bitmap. Τώρα ας δούμε πως τοποθετεί η PS στο χαρτί αυτό το bitmap. To bitmap τοποθετείται μέσα στο στοιχειώδες τετράγωνο με πλευρά 1/72 της ίντσας. Έτσι αν θέλουμε το bitmap που τοποθετούμε να είναι μεγαλύτερο κάνουμε πρίν ένα scale. Για το bitmap του παραδείγματος αν θέλουμε να καταλαμβάνει μια τετραγωνική ιντσα στο χαρτί, κάνουμε το 72 72 scale και μετά βάζουμε την image.
  • 26. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 26 Μέχρι εδώ έχουμε δεί τι σημαίνουν όλα τα ορίσματα της image. Ας τα βάλουμε όλα μαζί. Πρώτο είναι το scanlines, είναι ο αριθμός των γραμμών που έχει το bitmap, στα παράδειγμά μας έχει 5. Δεύτερο είναι bitPerSample, είναι πόσα bit από τα δεδομένα αντιστοιχούν σε κάθε pixel. Στη συνέχεια είναι το transformMatrix, είναι ένας πίνακας τηε μορφής [n 0 0 m 0 0] όπου n είναι τα pixel ανά γραμμή και m είναι ο αριθμός των γραμμών του bitmap. Τα pixel αρχίζουν να τοποθετούνται από την κάτω αριστερή γωνία. Αν θέλουμε όμως τα pixel να αρχίζουν τοποθετούνται από την πάνω αριστερή γωνία γράφουμε [n 0 0 –m 0 0]. Τέλος procedure είναι μια postscript υπορουτίνα που τροφοδοτεί την image με δεδομένα του τύπου που περιγράψαμε ποιο πάνω. Αν την καλέσει μια φορά και τα δεδομένα δεν φτάνουν για το bitmap που δηλώσαμε τότε η image την ξανακαλεί μέχρι να πάρει αρκετά δεδομένα. Ας δούμε πως θα καλούσαμε την image για το bitmap που περιγράψαμε στην αρχή. 72 72 scale 5 5 1 [5 0 0 –5 0 0] {<8850205088>} image Βάλαμε πρώτα την scale για να είναι αρκετά μεγάλο το αποτέλεσμα που θα δούμε. Περίεργο; Αν κάνουμε inverse τα χρώματα βλέπουμε ένα ωραίο Χ. Για να πάρουμε αυτό το σχήμα πρέπει στα δεδομένα μας να αντικαταστήσουμε τα 1 με 0 και αντίστροφα. Τώρα το ερώτημα είναι που στη σελίδα σχεδιάζει η PS το bitmap. Η απάντηση είναι, στο (0,0). Οπότε για να σχεδιαστεί το bitmap στο σημείο που θέλουμε πρέπει να κάνουμε πρώτα ένα translate στο σημείο που θέλουμε και μετά να το σχεδιάσουμε. Οπότε για να σχεδιαστεί το bitmap του παραδειγματός μας στο σημείο 300,400 γράφουμε 300 400 translate 72 72 scale 5 5 1 [5 0 0 –5 0 0] {<8850205088>} image Εδώ τονίζουμε ξανά την λεπτομέρια του τέταρτου στοιχείου του tansformMatrix. Αν είναι θετικό και κάνουμε transform στο 300,400 τότε το bitmap θα τοποθετηθεί ως εξής Ενώ αν είναι αρνητικό
  • 27. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 27 Τέλος θα αναφέρουμε και μια σχετική εντολή την imagemask. H imagemask συντάσεται ως εξής Width height invert matrix proc imagemask Όπου width είναι το πλάτος του bitmap, height είναι το πλάτος του bitmap, matrix και proc είναι ότι και στην image. Η imagemask «βάφει» μάυρα τα pixel που αντιστοιχούν σε μηδέν (0) και αφήνει απείραχτα τα υπόλοιπα. Η παράμετρος invert αντιστρέφει και «βάφει» μάυρα τα pixel που αντιστοιχούν σε άσσο (1) και αφήνει απείραχτα τα υπόλοιπα. Στο κεφάλαιο πέντε υπάρχει ένα πολύ καλό πράδειγμα χρήσης της imagemask. 4.ΥΠΟΡΟΥΤΙΝΕΣ ΚΑΙ ΜΕΤΑΒΛΗΤΕΣ 4.1 ΥΠΟΡΟΥΤΙΝΕΣ
  • 28. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 28 Το τελευταίο παράδειγμα του προηγούμενου κεφαλαίου σχεδίαζε ένα "ριγέ" κύκλο, και το μεγαλύτερο μέρος του προγράμματος ήταν αυτό που σχεδίαζε τις οριζόντιες γραμμές. Ένας λίγο πιο έξυπνος τρόπος για να σχεδιάσουμε τις οριζόντιες γραμμές είναι να φτιάξουμε μια υπορουτίνα η οποία να σχεδιάζει μια οριζόντια γραμμή και σαν ορίσματα να παίρνει την x και την y θέση που θα σχεδιαστεί η γραμμή. Ας δούμε τη βελτιωμένη έκδοση. %υπορουτίνα που σχεδιάζει % οριζόντιες γραμμές /hline { moveto 100 0 rlineto }def %σχεδιάζει τον κύκλο newpath 100 100 50 0 360 arc closepath stroke % ορίζει το clipping path newpath 100 100 50 0 360 arc closepath clip % σχεδιάζει μερικές οριζόντιες γραμμές newpath 50 60 hline 50 70 hline 50 80 hline 50 90 hline 50 100 hline closepath stroke showpage Αρχικά ορίζουμε την υπορουτίνα hline (Horizontal Line). Για να καταλάβει η PS ότι η λέξη hline δεν είναι δεδομένο, βάζουμε στην αρχή της λέξης μια κάθετο (/). Τότε η PS καταλαβαίνει ότι πρόκειται για όνομα "ορισμού". Ο ορισμός αρχίζει με την αριστερή αγκύλη ({) και τελειώνει με τη δεξιά αγκύλη (}). Δηλαδή ο ορισμός μιας υπορουτίνας είναι
  • 29. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 29 /όνομα { ... εντολές ... } def Μετά τη δεξιά αγκύλη ακολουθεί ο τελεστής def. Αυτός λέει στην PS ότι υπάρχει όνομα και ορισμός στη στοίβα δεδομένων, τότε η PS γυρνάει πίσω στη στοίβα να βρει το όνομα και τον ορισμό και μετά τα βάζει στον πίνακα των εντολών. Οι εντολές που περιέχονται στον ορισμό της υπορουτίνας μπορούν να είναι οποιεσδήποτε εντολές PS ή και άλλες υπορουτίνες που έχουν οριστεί πιο πριν στο πρόγραμμα. Αυτό που κάνει η υπορουτίνα του παραδείγματος, hline, είναι ένα moveto σε κάποια θέση και στη συνέχεια μια ευθεία μήκους 100 σημείων. Το αποτέλεσμα είναι ίδιο με αυτό του προγράμματος στο προηγούμενο κεφάλαιο. Αν προσέξετε θα δείτε ότι στη moveto δεν έχουμε δώσει ορίσματα και πουθενά στον ορισμό της hline δε γίνεται καμιά αναφορά σ’αυτά. Το ερώτημα είναι πώς δίνουμε δεδομένα στις υπορουτίνες. Την απάντηση θα τη βρούμε αν δούμε πώς γίνεται η κλήση της υπορουτίνας. Όταν πιο κάτω, στο πρόγραμμα, που καλούμε την hline λέμε, 50 60 hline δηλαδή, γράφουμε πρώτα τα δεδομένα, το σημείο από όπου θα αρχίζει η γραμμή, και μετά την hline. Η PS όταν συναντήσει αυτή τη γραμμή θα βάλει στη στοίβα το 50 και το 60 και μετά θα ελέγξει αν υπάρχει εντολή με το όνομα hline. Αν υπάρχει θα την εκτελέσει. Η πρώτη εντολή της hline είναι η moveto. Η moveto παίρνει τα δύο πρώτα στοιχεία της στοίβας σαν το σημείο που θα τοποθετήσει το δείκτη. Θυμηθείτε ότι έχουμε ήδη βάλει στη στοίβα δύο αριθμούς, αυτοί είναι οι αριθμοί που θα πάρει η moveto. Δηλαδή τα δεδομένα που χρειάζονται οι εντολές μιας υπορουτίνας ψάχνουν να τα βρουν στη στοίβα, σα να ήταν εντολές του κυρίως προγράμματος. Έτσι, πριν καλέσουμε την hline πρέπει να βάλουμε στη στοίβα τους δύο αριθμούς που χρειάζεται η moveto. Το ίδιο πρέπει να κάνουμε αν έχουμε και άλλες εντολές που χρειάζονται δεδομένα. Για παράδειγμα αν θέλαμε η hline να μη σχεδιάζει μόνο οριζόντιες γραμμές μήκους 100 σημείων, αλλά να σχεδιάζει γενικά γραμμές που αρχίζουν από κάποιο σημείο, τότε θα έπρεπε και η rlineto να μην έχει σταθερά δεδομένα αλλά να τα ορίζουμε κατά την κλίση της hline. Ας δούμε πως θα ήταν το πιο πάνω πρόγραμμα με μια τέτοια hline. %υπορουτίνα που σχεδιάζει γραμμές /hline { moveto
  • 30. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 30 rlineto }def %σχεδιάζει τον κύκλο newpath 100 100 50 0 360 arc closepath stroke % ορίζει το clipping path newpath 100 100 50 0 360 arc closepath clip % σχεδιάζει μερικές οριζόντιες γραμμές newpath 100 0 50 60 hline 100 0 50 70 hline 100 0 50 80 hline 100 0 50 90 hline 100 0 50 100 hline closepath stroke showpage Τώρα η rlineto δεν έχει και αυτή δεδομένα, μέσα στον ορισμό της hline. Πριν όμως καλέσουμε την hline βάζουμε στη στοίβα ένα επιπλέον ζευγάρι αριθμών, που είναι τα δεδομένα της rlineto. Ίσως φαίνεται παράξενο ότι πρώτα γράψαμε στη γραμμή τα δεδομένα για την rlineto και μετά τα δεδομένα για την moveto μιας και εκτελείται πρώτα η moveto και μετά η rlineto. Αυτό είναι κάτι που πρέπει να προσεχθεί πάρα πολύ. Η moveto εκτελείται πρώτη και συνεπώς πρέπει τα δεδομένα γι'αυτή να είναι πρώτα στη στοίβα. Αν γράφαμε πρώτα το ζευγάρι της moveto και μετά το ζευγάρι της rlineto τότε πρώτο στη στοίβα θα ήταν το ζευγάρι της rlineto, γιατί όπως είπαμε και στο πρώτο κεφάλαιο το στοιχείο που θα μπεί πρώτο στη στοίβα θα βγει τελευταίο, άρα πρώτα γράφουμε τα δεδομένα της εντολής που θα εκτελεστεί τελευταία, μετά της αμέσως προηγούμενης και συνεχίζουμε έτσι μέχρι την πρώτη. Δηλαδή τα δεδομένα της τελευταίας τα γράφουμε πρώτα και της πρώτης τελευταία. 4.2 ΜΕΤΑΒΛΗΤΕΣ Ας υποθέσουμε τώρα ότι κάποιος θέλει να σχεδιάσει το "ριγέ" κύκλο αλλά βαριέται να κάνει τις προσθέσεις για να βρει την y θέση της κάθε οριζόντιας γραμμής και θέλει να βάλει την PS να κάνει τις προσθέσεις. Για να γίνει αυτό χρειαζόμαστε μια μεταβλητή που να έχει αρχικά τη θέση της πρώτης
  • 31. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 31 γραμμής και μετά την πρώτη κλίση της hline να αυξάνει η τιμή της κατά 10 σημεία. Η νέα παραλλαγή του προγράμματος είναι η παρακάτω. %υπορουτίνα που σχεδιάζει γραμμές /hline { moveto rlineto }def %ορίζουμε τη μεταβλητή /ypos 50 def %σχεδιάζει τον κύκλο newpath 100 100 50 0 360 arc closepath stroke % ορίζει το clipping path newpath 100 100 50 0 360 arc closepath clip % σχεδιάζει μερικές οριζόντιες γραμμές newpath 100 0 50 ypos hline %αυξάνει την τιμή της ypos κατά 10 /ypos ypos 10 add def 100 0 50 ypos hline /ypos ypos 10 add def 100 0 50 ypos hline /ypos ypos 10 add def 100 0 50 ypos hline /ypos ypos 10 add def 100 0 50 ypos hline closepath stroke showpage Στην αρχή έχουμε τον ορισμό της hline, που είναι ίδιος με προηγουμένως, και στη συνέχεια ορίζουμε τη μεταβλητή ypos. Παρατηρούμε ότι ο ορισμός της μεταβλητής είναι παρόμοιος με τον ορισμό της υπορουτίνας, δηλαδή
  • 32. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 32 /όνομα τιμή def Εδώ δεν έχουμε τον ορισμό της μεταβλητής κλεισμένο μέσα σε αγκύλες. Μια μεταβλητή στην PS είναι σαν μια υπορουτίνα που η δουλειά της είναι να βάζει ένα στοιχείο στη στοίβα. Το άλλο μέρος του προγράμματος που έχει αλλάξει είναι το κομμάτι που σχεδιάζει τις οριζόντιες γραμμές. Στη γραμμή που καλεί την hline έχουμε βάλει τη μεταβλητή μας στη θέση της μεταβαλλόμενης y συντεταγμένης. Μετά την πρώτη κλήση της hline αυξάνουμε την τιμή της μεταβλητής, με ένα φαινομενικά παράξενο τρόπο. Ο τρόπος που αλλάζουμε την τιμή μιας μεταβλητής έχει την ίδια λογική με αυτόν που ακολουθούμε σε άλλες γλώσσες προγραμματισμού. Για παράδειγμα στη BASIC θα λέγαμε ypos = ypos + 10 το οποίο αν το αναλύσουμε σημαίνει, όρισε τιμή της μεταβλητής ypos, την τιμή που είχε, αφού της προσθέσεις το δέκα. Το ypos + 10, μεταφράζεται σε PS ypos 10 add και ίσον (=) της BASIC είναι ανάλογο με το /όνομα τιμή def έτσι τελικά η ανάθεση της νέας τιμής στην ypos γίνεται με τη γραμμή /ypos ypos 10 add def Το συμπέρασμα που καταλήγουμε είναι ότι το όρισμα μια μεταβλητής μπορεί να είναι και μια έκφραση που το αποτέλεσμα της είναι μια σταθερά. Τέλος ενδιαφέρον έχει να δούμε πώς ορίζουμε μεταβλητές που οι τιμές τους έχουν τα δεδομένα που χρησιμοποιεί μια υπορουτίνα. Ας δούμε μια ακόμα παραλλαγή της hline, που βάζει τα δεδομένα που χρησιμοποιεί σε μεταβλητές. /hline { /y exch def /x exch def /ry exch def /rx exch def
  • 33. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 33 x y moveto rx ry rlineto }def Οι ορισμοί των μεταβλητών πρέπει να είναι μέσα στη δήλωση της υπορουτίνας. Η exch που ακολουθεί το όνομα παίζει ένα πολύ σημαντικό ρόλο. Όταν καλούμε την υπορουτίνα υπάρχουν ήδη στη στοίβα τα δεδομένα που θέλουμε να αποθηκεύσουμε στις μεταβλητές. Η πρώτη γραμμή της υπορουτίνας αρχικά βάζει στη στοίβα το /y. Αυτή τη στιγμή στη στοίβα έχουμε πρώτα την τιμή και μετά το όνομα, δηλαδή είναι ανάποδα από ότι πρέπει για να ορίσουμε τη μεταβλητή. Η σωστή σειρά είναι, όνομα τιμή. Γι'αυτό βάζουμε και την exch, για να εναλλάξει το /y με την τιμή και έτσι μπαίνουν στη σωστή σειρά, όνομα και τιμή. Τέλος η def τα παίρνει από τη στοίβα και ορίζει τη μεταβλητή y. Όμοια ορίζουμε και τις υπόλοιπες μεταβλητές. Πρέπει να προσέχουμε τη σειρά με την οποία ορίζουμε τις μεταβλητές ώστε να παίρνουν τις σωστές τιμές από τη στοίβα, πολύ απλά πρέπει να είναι με την αντίστροφη σειρά από αυτή που βάζουμε τις τιμές στη γραμμή που καλούμε την υπορουτίνα. 5. ΕΛΕΓΧΟΣ ΡΟΗΣ 5.1 ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ
  • 34. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 34 Ας επανέρθουμε στο "ριγέ" κύκλο μας για να δούμε έναν ακόμα πιο έξυπνο τρόπο για να σχεδιάσουμε τις οριζόντιες γραμμές. Θα ήταν πολύ πιο εύκολο να πούμε στην PS πόσες οριζόντιες γραμμές θέλουμε να σχεδιάσουμε, αντί να γράψουμε κώδικα για κάθε μία από αυτές. Γνωρίζουμε, μάλλον, όλοι ότι αυτό το πετυχαίνουμε με ένα βρόχο επανάληψης. Ας δούμε ένα βρόχο επανάληψης που σχεδιάζει δέκα οριζόντιες γραμμές μέσα στον κύκλο μας. %υπορουτίνα που σχεδιάζει γραμμές /hline { moveto rlineto }def %ορίζουμε τη μεταβλητή /ypos 50 def %σχεδιάζει τον κύκλο newpath 100 100 50 0 360 arc closepath stroke % ορίζει το clipping path newpath 100 100 50 0 360 arc closepath clip newpath %σχεδιάζει 10 οριζόντιες γραμμές 10 { %αυξάνει την τιμή της ypos κατά 10 /ypos ypos 10 add def 100 0 50 ypos hline } repeat closepath stroke showpage Η δομή του προγράμματος είναι ίδια με αυτή των προγραμμάτων του προηγούμενου κεφαλαίου. Σχεδιάζει τον κύκλο, ορίζει το clipping path και τέλος σχεδιάζει τις γραμμές. Αυτό που έχει αλλάξει είναι ότι δεν έχουμε δέκα γραμμές που καλούν την hline αλλά, μία. Θα παρατηρήσατε τη δομή repeat. Η repeat συντάσσεται ως εξής
  • 35. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 35 n { ... εντολές ... } repeat όπου n είναι ένας ακέραιος αριθμός. Η δομή αυτή εκτελεί τις εντολές που περικλείονται στις αγκύλες n φορές. Έτσι πολύ εύκολα παίρνουμε ένα καλύτερο από πριν αποτέλεσμα. Αν τώρα έρθει πάλι αυτός που βαριέται να κάνει προσθέσεις και βαριέται να κάνει και διαίρεση, για να βρει πόσες γραμμές χρειάζονται για να γεμίσει ο κύκλος, πρέπει να βάλει την PS να κάνει και αυτή τη δουλειά. Τότε, θα γράψουμε το παρακάτω πρόγραμμα. %υπορουτίνα που σχεδιάζει γραμμές /hline { moveto rlineto }def %σχεδιάζει τον κύκλο newpath 100 100 50 0 360 arc closepath stroke % ορίζει το clipping path newpath 100 100 50 0 360 arc closepath clip newpath %σχεδιάζει 10 οριζόντιες γραμμές 50 10 150 {
  • 36. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 36 /ypos exch def 100 0 50 ypos hline } for closepath stroke showpage Ο βρόχος που μας δίνει όλες τις τιμές από μια αρχική μέχρι μια τελική τιμή με κάποιο βήμα, είναι ο βρόχος for. Η λειτουργία της for, είναι κοινή σε όλες τις γλώσσες προγραμματισμού. Η σύνταξη της στην PS είναι start_val step end_val { ... εντολές ... } for όπου start_val είναι η αρχική τιμή, end_val είναι η τελική τιμή και step είναι το βήμα με το οποίο μεταβάλλεται η start_val μέχρι να γίνει ίση ή να ξεπεράσει την end_val. Τους αριθμούς που "βγάζει" η for τους βάζει στη στοίβα, δηλαδή αν δεν υπάρχει καμιά εντολή, μέσα στο βρόχο, που να παίρνει τους αριθμούς αυτούς από τη στοίβα τότε μετά το τέλος του βρόχου, όλοι αυτοί οι αριθμοί θα είναι ακόμα στη στοίβα και αν δεν τους χρειαζόμαστε θα πρέπει να τους "πετάξουμε". Αυτό είναι κάτι που πρέπει να προσέχουμε όταν χρησιμοποιούμε for-βρόχους απλά για να επαναλαμβάνουμε κάποιες εντολές, γιατί η for θα γεμίσει τη στοίβα άχρηστα δεδομένα και αν είναι πάρα πολλά υπάρχει ο κίνδυνος να έχουμε ένα "stack overflow". Δηλαδή να γεμίσει η στοίβα, το μέγεθος της οποίας εξαρτάται από τη μνήμη του εκτυπωτή, και να μην υπάρχει χώρος για τίποτα άλλο, οπότε σταματάει η εκτέλεση του προγράμματος. Στο παράδειγμά μας τον αριθμού που βάζει, σε κάθε επανάληψη, η for στη στοίβα το βάζουμε στη μεταβλητή y και τελικά το χρησιμοποιεί η moveto. 5.2 ΕΛΕΓΧΟΙ Είναι καιρός να μάθουμε πώς κάνουμε ελέγχους στην PS. Η εντολή, σε όλες σχεδόν τις γλώσσες προγραμματισμού, για ελέγχους είναι η if. Η σύνταξη της if στην PS είναι
  • 37. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 37 bool proc if όπου bool είναι μια λογική (boolean) έκφραση, μια σύγκριση, και όπου proc είναι η διαδικασία, σειρά εντολών, που θα εκτελεστεί αν η bool είναι αληθείς. Για παράδειγμα 4 3 gt { 100 100 moveto 100 100 rlineto } if Η γραμμή αυτή ελέγχει αν το 4 είναι μεγαλύτερο από το 3, που όντως είναι, εκτελεί τη διαδικασία, τις εντολές μέσα στις αγκύλες. Η σύγκριση γίνεται, σ'αυτό το παράδειγμα, με τον τελεστή gt. Όπως σε όλες τις πράξεις, αριθμητικές και λογικές, στην PS πρώτα βάζουμε, στη στοίβα, τους αριθμούς και μετά τον τελεστή. Δηλαδή η γενική μορφή μιας έκφρασης σύγκρισης είναι val1 val2 oper όπου val1 είναι η τιμή που θα συγκριθεί με τη val2 και oper είναι ο τελεστής σύγκρισης. Οι τελεστές σύγκρισης της PS είναι ίδιοι με αυτούς της FORTRAN. Ακολουθεί ένας πίνακας με τους τελεστές σύγκρισης της PS. eq ίσο ne διάφορο (όχι ίσο) gt μεγαλύτερο από lt μικρότερο από ge μεγαλύτερο ή ίσο le μικρότερο ή ίσο Αφού μπορούμε να ορίσουμε τι θα εκτελεστεί αν η σύγκριση είναι αληθείς, λογικό είναι να μπορούμε να ορίσουμε τι θα εκτελεστεί αν είναι ψευδείς. Αυτό μπορούμε να το κάνουμε με την ifelse. Η σύνταξη της είναι παρόμοια με της if, δηλαδή val1 val2 oper {true proc} {false proc} ifelse όπου val1 είναι η τιμή που θα συγκριθεί με τη val2 και oper είναι ο τελεστής σύγκρισης. true proc είναι η διαδικασία που θα εκτελεστεί αν η σύγκριση είναι αληθής και false proc είναι η διαδικασία που θα εκτελεστεί αν η σύγκριση είναι ψευδής. Ένα απλό παράδειγμα είναι 3 4 gt
  • 38. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 38 % true proc { 100 100 moveto 100 100 rlineto} % false proc { 100 100 moveto -100 -100 rlineto} ifelse αρχικά γίνεται η σύγκριση αν το 3 είναι μεγαλύτερο ή ίσο του 4. Αν αυτό είναι αληθές θα εκτελεστούν οι εντολές 100 100 moveto 100 100 rlineto ενώ στην αντίθετη περίπτωση θα εκτελεστούν οι γραμμές 100 100 moveto -100 -100 rlineto Στην προκειμένη περίπτωση, που το 3 δεν είναι μεγαλύτερο ή ίσο του 4, θα εκτελεστεί το δεύτερο ζευγάρι εντολών. Μια χρήση της if στην PS θα δούμε στη συνέχεια. 5.3 ΕΝΑΣ ΑΚΟΜΑ ΒΡΟΧΟΣ ΕΠΑΝΑΛΗΨΗΣ Τώρα θα δούμε τον τρίτο βρόχο επανάληψης που διαθέτει η PS. Ο βρόχος αυτός είναι ο loop, ο οποίος είναι ένας βρόχος χωρίς συνθήκη, δηλαδή είναι ατέρμονος. Συντάσσεται πολύ απλά {proc} loop όπου proc είναι η διαδικασία που θα εκτελείται επ'άπειρων. Για παράδειγμα το παρακάτω πρόγραμμα { 100 } loop θα βάζει τον αριθμό 100 στη στοίβα μέχρι που θα πάρουμε ένα "stack overflow" και θα σταματήσει βίαια η εκτέλεση του. Αν κάποιοι αναρωτηθήκατε αν μπορούμε με κάποιο τρόπο να σταματήσουμε τον ατέρμονο αυτό βρόχο, η απάντηση έρχεται με την εντολή exit. Η exit αναγκάζει τη loop να σταματήσει και μεταφέρει την εκτέλεση του προγράμματος στην αμέσως επόμενη γραμμή από τη loop. Δηλαδή το { 100 exit } loop βάζει στη στοίβα το 100 και η exit μας βγάζει από το βρόχο.
  • 39. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 39 Αυτό το παράδειγμα δε μας πείθει για τη χρησιμότητα της loop, μιας και η διαδικασία εκτελείται μόνο μία φορά. Αυτό που θα μας έπειθε είναι μια συνθήκη. Ας δούμε το πρόγραμμα του "ριγέ" κύκλου με χρήση της loop. %υπορουτίνα που σχεδιάζει γραμμές /hline { moveto rlineto }def %ορίζουμε τη μεταβλητή /ypos 50 def %σχεδιάζει τον κύκλο newpath 100 100 50 0 360 arc closepath stroke % ορίζει το clipping path newpath 100 100 50 0 360 arc closepath clip newpath %σχεδιάζει 10 οριζόντιες γραμμές { %αυξάνει την τιμή της ypos κατά 10 /ypos ypos 10 add def 100 0 50 ypos hline %ελέγχει αν η τιμή της ypos είναι ίση με 100 ypos 150 eq {exit} if } loop closepath stroke showpage Εδώ χρησιμοποιούμε τη loop για το σχεδιασμό των οριζόντιων γραμμών. Το πρόγραμμα είναι μια παραλλαγή αυτού που χρησιμοποιεί τη repeat. Έχουμε όμως προσθέσει έναν έλεγχο για την τιμή της ypos. Η γραμμή ypos 150 eq {exit} if
  • 40. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 40 ελέγχει αν η τιμή της ypos είναι ίση με 150, που είναι η πάνω "άκρη" του κύκλου. Αν η ypos είναι μικρότερη από το 150 ο βρόχος συνεχίζεται, όταν όμως γίνει ίση με 150 τότε εκτελείται η exit και εγκαταλείπεται η loop. Μετά την έξοδο από τη loop εκτελείται η closepath, δηλαδή η αμέσως επόμενη εντολή απ'τη loop. 5.4 ΜΙΑ ΠΟΛΥΠΛΟΚΗ ΥΠΟΡΟΥΤΙΝΑ Έστω θέλουμε μια υπορουτίνα που να σχεδιάζει ένα κύκλο σε κάποιο σημείο της σελίδας, ο οποίος έχει περίγραμμα μαύρο, είναι γεμισμένος με χρώμα που θα περνάει σαν παράμετρος, και θα έχει texture fill που και αυτό θα παιρνάει σαν παράμετρος. Η σύνταξη αυτής της υπορουτίνας θα είναι x y ratio pW pH hexData red green blue paternCircle Όπου x,y οι συνταταγμένες του κέντρου του κύκλου, ratio η ακτίνα, pW και pH το πλάτος και το ύψος του bitmap που θα χρησιποποιηθεί ως pattern για το texture fill, hexData τα δεδομένα που περιγράφουν το pattern και τέλος red, green και blue οι συνηστώσες του χρώτος για το γέμισμα. Mια τυπική της κλήση θα είναι κάπως έτσι 495 259 50 5 5 <8850205088> 1.0 1.0 1.0 patternCircle Ο κώδικας της είναι ο παρακάτω /patternCircle { % αποθηκεύουμε τις παραμέτρους σε μεταβλητές /cb exch def /cg exch def /cr exch def /hdata exch def /ph exch def /pw exch def /rat exch def /y0 exch def /x0 exch def % υπολογίζουμε την πάνω αριστερά γωνία, το ύψος και το % πλάτος του τετραγώνου που πρειγράφει τον κύκλο για % να το χρησιμοποιήσουμε για το texture fill. /top y0 rat sub def /left x0 rat sub def /w rat 2 mul def /h rat 2 mul def
  • 41. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 41 % ορίζουμε το χρώμα του γεμίσματος cr cg cb setrgbcolor % ζωγραφίζουμε τον κυκλικό δίσκο newpath x0 y0 rat 0 360 arc closepath fill % ζωγραφίζουμε τον κύκλο του περιγράμματος 0 0 0 setrgbcolor newpath x0 y0 rat 0 360 arc closepath stroke % αποθηκέυουμε την κατάσταση γραφικών, ώστε % μετά την εκτέλεση της υπορουτίνας να την % επαναφέρουμε ως ήταν πρίν. gsave % ορίζουμε το clipping path για να μην βγάνει το % texture έξω από τον κύκλο. newpath x0 y0 rat 0 360 arc closepath clip % κάνουμε ένα loop από την πάνω πλευρά του τετραγώνου % που περιβάλει τον κύκλο μέχρι την κάτω top ph top h add { % κράταμε τη νεα y συντεταγμένη /ty exch def % κάνουμε ένα δεύτερο loop από την αριστερή μέχρι την % δεξιά πλευρά του τετραγώνου left pw left w add { % κράταμε τη νεα y συντεταγμένη /tx exch def % αποθηκεύουμε την κατάσταση γραφικών, γιατί για να % σχεδιάσει η imagemask κάνουμε translate. Έτσι μετά % το σχεδιασμό κάνουμε grestore για να μην έχουμε % να κρατάμε σχετικές συντεταγμένες για τις % μετατοπίσεις gsave 0 setgray % μεταφέρουμε την αρχή των αξόνων στο σημείο που
  • 42. ΕΙΣΑΓΩΓΗ ΣΤΗΝ POSTSCRIPT 42 % πρέπει να σχεδιαστεί το επόμενο τμήμα του texture tx ty ph add translate % κάνουμε scale ώστε το pattern να έχει το μέγεθος % που ζητήθηκε pw ph scale % ζωγραφίζουμε το pattern pw ph true [pw 0 0 ph 0 0] {hdata} imagemask % επαναφέρουμε την κατάσταση γραφικών grestore } for } for % επαναφέρουμε την κατάσταση γραφικών εκεί που ήταν % πριν την εκτέλεση της υπορουτίνας. grestore } def Η λογική της ρουτίνας είναι απλή. Σχεδιάζουμε πρώτα τον κύκλο και στη συνέχεια σχεδιάζουμε το ένα δίπλα στο άλλο bitmaps ώστε να καλυφθεί η επιφάνεια του κύκλου. Το αποτέλεσμα που παίρνουμε έιναι κάπως έτσι Φυσικά σε ένα postscript εκτυπωτή το οπτικό αποτέλεσμα είναι καλύτερο. Μέχρι εδώ έχουμε μάθει αρκετά ώστε να μπορούμε να σχεδιάζουμε αρκετά πολύπλοκα σχέδια το τελευταίο που θα μάθουμε είναι πως προσθέτουμε κείμενο στα σχέδια μας. 6. ΚΕΙΜΕΝΟ ΚΑΙ ΓΡΑΜΜΑΤΟΣΕΙΡΕΣ