Απλή μεγέθυνση εικόνας

 

Οδηγίες για την Pascal

Tο περιβάλλον της Pascal προσφέρεται σε διάφορες εκδόσεις. Σκοπός του σεναρίου είναι να διερευνήσουν οι μαθητές τη γεωμετρία της οθόνης και τους γεωμετρικούς μετασχηματισμούς με απλό τρόπο και σύμφωνα με την απλή εμπειρία που διαθέτουν πάνω στον προγραμματισμό. Για το λόγο αυτό θα χρησιμοποιήσετε την έκδοση της Pascal σε παραθυρικό περιβάλλον, όμως σε πλατφόρμα του λειτουργικού συστήματος DOS, με την οποία έχετε εξοικειωθεί στη συγγραφή απλών προγραμμάτων και στη χρήση βασικών εντολών. Για να μεταγλωττίσετε τα γραμμένα σε Pascal προγράμματά σας μπορείτε να χρησιμοποιήσετε τον compiler Free Pascal που χρησιμοποιείται στις Διεθνείς Ολυμπιάδες Πληροφορικής.

Για να χρησιμοποιήσετε το γραφικό περιβάλλον της Pascal θα πρέπει να δηλώσετε την κατάλληλη μονάδα (unit). Στο πρόγραμμά σας, μετά την ονομασία program, θα ορίσετε τη μονάδα γραφικών, δίνοντας uses graph;. Στη συνέχεια, με την εντολή Initgraph, το πρόγραμμα επιλέγει την κάρτα γραφικών του υπολογιστή και το mode της κάρτας. Η σύνταξή της έχει ως εξής:

Initgraph (graphdriver, graphmode, drivepath) όπου:

 

ü  Η παράμετρος graphdriver := Detect; επιλέγει αυτόματα την κάρτα.

ü  Η παράμετρος graphmode λαμβάνει την τιμή της μεγίστης ανάλυσης.

ü  Η παράμετρος drivepath ορίζει το μονοπάτι που βρίσκονται τα αρχεία με κατάληξη bgi.

 

Σημείωση: Αν εργάζεστε σε έκδοση της Pascal, που για το γραφικό περιβάλλον χρειάζεται τα αρχεία με κατάληξη bgi, θα πρέπει να δηλώνετε το πλήρες μονοπάτι (drivepath) του φακέλου bgi που περιέχει αυτά τα αρχεία (π.χ. c:/pascal/bgi). Μπορείτε βέβαια να έχετε ένα αντίγραφο του φακέλου bgi στο χώρο αποθήκευσης και εκτέλεσης των προγραμμάτων σας, οπότε δεν χρειάζεται το πλήρες μονοπάτι. Η έκδοση της Free Pascal δεν χρειάζεται το φάκελο bgi. Ωστόσο, δεν δημιουργείται πρόβλημα αν έχει δηλωθεί, ώστε να τρέχουν τα προγράμματα και στις δύο περιπτώσεις.

 

Κάθε πρόγραμμα Pascal που θέλει να απεικονίζει pixels θα πρέπει να περιλαμβάνει τα παραπάνω. Για παράδειγμα, αν θέλουμε να τυπώσουμε ένα pixel (θέση 120,100 κόκκινο), θα πρέπει να γράψουμε το παρακάτω πρόγραμμα:

 

Program open-graphika;

uses Graph;

var grDriver,grMode, X,Y,: Integer;

const drivepath='bgi';

begin

grDriver := Detect;

InitGraph(grDriver, grMode, drivepath);

 

X:= 120;

Y:= 100;

PutPixel(X,Y,LightRED);

 

writeln ('πατήστε ENTER για έξοδο');

Readln;

CloseGraph;

end.

 

Οδηγίες εκτέλεσης προγράμματος

Κατά την εκτέλεση του προγράμματος με τη Free Pascal θα εμφανίζονται δύο παράθυρα:

·         Παράθυρο εκτέλεσης εντολών (Free pascal IDE)

·         Παράθυρο γραφικών (graph window applicacion)

Όταν σας ζητείται κάποια εντολή εκτέλεσης θα πρέπει να τη δίνετε από το παράθυρο (Free Pascal IDE), εμφανίζοντάς το, και να επιστρέφετε στο παράθυρο (graph window applicacion) για να βλέπετε τα αποτελέσματα.

 

Μερικές ρουτίνες για τα γραφικά της οθόνης είναι οι εξής:

ü  Line (x1, y1, x2, y2): Σχηματίζει γραμμή μεταξύ 2 σημείων (χ1, y1) και (x2, y2).

ü  GetMaxX: Επιστρέφει τη μεγίστη τιμή της οριζόντιας συντεταγμένης.

ü  GetMaxY: Επιστρέφει τη μεγίστη τιμή της κατακόρυφης συντεταγμένης.

ü  Circle (x, y, radius): Σχεδιάζει κύκλο με κέντρο (x, y) και radius=ακτίνα.

ü  OutTextXY(X,Y: Integer; TextString: string); Στέλνει ένα string στην οθόνη.

 

Με βάση τις ρουτίνες getmaxX και getmaxY η οθόνη του υπολογιστή έχει συντεταγμένες όπως φαίνονται στο σχήμα 2.

 

 

 

 

 

 

 

 

 

 

 

 

                                                          σχήμα 2

 

Το πρόβλημα που προκύπτει είναι ότι δεν μπορούμε να αναπαραστήσουμε σημεία που έχουν μία ή δύο αρνητικές συντεταγμένες. Για το λόγο αυτό θα πρέπει να κατασκευάσετε δύο νέους άξονες με κέντρο κάποιο άλλο σημείο Κ της οθόνης, ορίζοντας τα κατάλληλα σημεία (2 για κάθε άξονα) και χρησιμοποιώντας την εντολή line. Αν Κ(χκκ) το νέο κέντρο, τότε, όπως φαίνεται στο σχήμα 3, τα σημεία που χρειαζόσαστε, μαζί με τις συντεταγμένες τους, είναι τα:

 

Μ(0, yκ), Μ΄(getmaxX, yκ), Ν(χκ ,0) και Ν΄(χκ, getmaxY)

 

 

 

 

 

 

 

 

                                                σχήμα 3

 

Μετά τη δημιουργία αξόνων, το ερώτημα είναι πώς θα προκύψει ο μετασχηματισμός της συμμετρίας. Οι εξισώσεις διαφοροποιούνται, αφού έχουμε μεταφορά των αρχικών μας αξόνων. Εδώ θα μελετήσουμε την περίπτωση, όπου το κέντρο Κ(χκκ) των αξόνων έχει μεταφερθεί στο κέντρο της οθόνης.

 

 

 

 

 

 

 

 

 

 

 

 

                                                σχήμα 4

 

Όπως θα παρατηρήσετε στο παραπάνω σχήμα, αν (X,Y) είναι οι συντεταγμένες ενός σημείου ως προς το νέο σύστημα αξόνων και (X1,Y1) οι συντεταγμένες που εσείς θέλετε να αναπαραστήσετε (τις δίνετε από πληκτρολόγιο), τότε οι μεταξύ τους σχέσεις δίνονται από τους τύπους X=(AB/2)+X1, Y=(AΓ/2)-Υ1.

 

Για να απεικονίσετε σημεία στο νέο σύστημα αξόνων, θα πρέπει να μετατρέψετε τις συντεταγμένες (Χ1, Υ1) σε (Χ, Υ) σύμφωνα με τους παραπάνω τύπους.

         

 

Μια ψηφιογραφική εικόνα στον υπολογιστή σας αναπαρίσταται από ένα πλήθος pixels (εικονοστοιχείων). Για την περιγραφή τους χρησιμοποιούνται 16 ή 32 bits, αν υπάρχει χρώμα, και 1 ή 8 bits, αν δεν υπάρχει χρώμα. Το σύνολο των pixels που συνθέτουν την εικόνα αποθηκεύεται σε ψηφιογραφικά αρχεία. Συνήθως χρησιμοποιούνται όταν επεξεργαζόμαστε εικόνες που είναι δύσκολο να μετατραπούν σε γεωμετρικά σχήματα, π.χ. φωτογραφίες ή αεροφωτογραφίες. Ωστόσο, μπορείτε να εμφανίσετε ψηφιογραφικά και ένα γεωμετρικό σχήμα, π.χ. έναν κύκλο, ως ένα σύνολο pixels που έχουν διαφορετικό χρώμα, ώστε να καθορίζουν την περιφέρεια και το χρώμα του σχήματος αυτού. Τα σημεία αυτά μπορεί να έχουν τη μορφή κύκλου ή οποιουδήποτε άλλου γεωμετρικού σχήματος, χωρίς όμως να εμφανίζουν και κάποια άλλη από τις μαθηματικές του ιδιότητες. Το ίδιο ισχύει για ένα γράμμα ή ένα σύμβολο. Κάθε μετατροπή του αρχικού σχήματος γίνεται πλέον χωρίς τη χρήση των γεωμετρικών του ιδιοτήτων.

 

 

Στην εργασία αυτή θα πρέπει να ακολουθήσετε τα παρακάτω βήματα:

·         Με τη βοήθεια της εντολής Circle να εμφανίσετε στην οθόνη σας έναν κύκλο.

Circle (x, y, radius): Σχεδιάζει κύκλο με κέντρο (x,y) και radius=ακτίνα.

 

π.χ. Circle(150,140,15); Σχεδιάζει κύκλο με κέντρο το σημείο (150,140) και ακτίνα 15 pixels.

·         Με τη βοήθεια της εντολής OutTextXY να εμφανίσετε μέσα στον κύκλο ένα χαρακτήρα, δίνοντάς του ένα σύμβολο.

 

π.χ. OutTextXY(148,138,'A+');

·         Με τη βοήθεια της εντολής Rectangle να ορίσετε μια περιοχή διαβάσματος που να περιέχει όλα τα pixels του σχήματός σας.

 

Rectangle (x1, y1, x2, y2: Integer); Ορίζει περιοχή διαβάσματος με συντεταγμένες, όπως στο σχήμα που ακολουθεί.

 

Θα πρέπει σαφέστατα να ισχύει:

        (0<=X1<X2<=GetMaxX, and 0<=Y1<Y2<=GetMaxY)

 

 

·         Να μεταβάλλετε το αρχικό σχέδιο, ακολουθώντας την εξής επαναληπτική διαδικασία (ομοιοθεσία):

Απεικονίστε κάθε pixel (Χ,Υ) του σχήματός σας σε ένα άλλο pixelm,Ym) με Χm=συντελεστής*Χ και Υm=συντελεστής*Υ. Για να διατηρήσετε το χρώμα του χρησιμοποιήστε την εντολή getpixel(x,y) η οποία επιστρέφει το χρώμα του pixel με συντεταγμένες (x,y). Το σύνολο των pixelsm,Ym) θα εμφανίζουν την ίδια εικόνα σε διαφορετική θέση και μέγεθος, ανάλογα με το συντελεστή που έχετε επιλέξει.

 

Το παρακάτω πρόγραμμα αποτελείται από διαδοχικές εντολές οι οποίες ορίζουν: (α) το γραφικό περιβάλλον, (β) την εικόνα και (γ) μια επαναληπτική διαδικασία που καθορίζει τα pixels της νέας εικόνας. Να γράψετε, να μεταφράσετε και να εκτελέσετε το παρακάτω πρόγραμμα στο περιβάλλον Pascal του εργαστηρίου σας (ονομάστε το my9_6a).

 

 

Program zoom_aplo;

{ APLH MEGENTHYSH}

uses crt, Graph;

var

 grDriver,grMode : Integer;

 var X,Y, Xm,Ym, P : integer;

 L: real;

Begin

Clrscr;

 grDriver := Detect;

 InitGraph(grDriver, grMode,'bgi');

 {DHMIOYRGIA SXEDIOY}

 SetColor(LightCyan);

 Circle(150,140,15);

 SetColor(LightRed);

 OutTextXY(148,138,'A+');

 {DHMIOYRGIA MEGENTHYSHS}

 Rectangle(125,120,175,160); {PERIOXH DIABASMATOS }

 L:= 2.3;

 for y:=120 to 160 do { diavasma perioxis sximatos }

 for x:=125 to 175 do

 begin

 P:=GetPixel(x,y); { dimiourgia antigrafou }

 Xm:=Round(X*L);

 Ym:=Round(Y*L);

 PutPixel(Xm,Ym,p);

 end;

 {EXODOS}

 setcolor(YELLOW);

 outtextXY (550,550, 'MINIMIZE GIA EPISTROFI ');

 writeln ( 'ENTER GIA EXODO');

 Readln;

end.

 

 

 

Κατεβάστε εδώ τον κώδικα του προγράμματος σε Pascal.

Κατεβάστε εδώ το εκτελέσιμο αρχείο.

 

 

Ερωτήματα – Διερευνήσεις

 

1.    Πειραματιστείτε, δίνοντας διάφορες τιμές στη θέση του σχήματος και στο συντελεστή μεταβολής. Σχολιάστε τα αποτελέσματα που προκύπτουν.

 

2.    Ποιες προσθήκες θα πρέπει να κάνετε στο πρόγραμμα my9_6a, ώστε:

(α)   Να δίνεται από το πληκτρολόγιο ο συντελεστής.

(β)   Το σχήμα να μεταβάλλεται προς την κατεύθυνση που ορίζετε εσείς.

(γ)   Να μην εμφανίζεται το αρχικό σχήμα.

        Αποθηκεύστε ως my9_6b το πρόγραμμα στο φάκελό σας.

 

 

Κατεβάστε εδώ τον κώδικα του προγράμματος σε Pascal.

Κατεβάστε εδώ το εκτελέσιμο αρχείο.

 

 

Περαιτέρω ενασχόληση

 

1.    Προσθέστε έλεγχο τέλους στο πρόγραμμα, ώστε να μπορείτε να παρακολουθείτε τις μεταβολές με διαφορετικούς συντελεστές.

 

2.    Ποιες αλλαγές θα πρέπει να κάνετε στο πρόγραμμα my9_6a, ώστε η δημιουργία του σχήματος να γίνεται από μια διαδικασία (procedure) που θα φτιάξετε (π.χ. ονομάστε την plot) και η μεταβολή του από άλλη διαδικασία (procedure) (π.χ. ονομάστε τη zoom). Κάντε τις κατάλληλες αλλαγές και αποθηκεύστε ως my9_6c το πρόγραμμα στο φάκελό σας.

 

 


 Ολοκληρωμένη μεγέθυνση εικόνας

         

 

Στην εργασία 1 συνθέσατε ένα πρόγραμμα με το οποίο μπορείτε να μεταβάλλετε ένα σχέδιο (μεγέθυνση-σμίκρυνση). Για την κατασκευή του νέου σχεδίου χρησιμοποιήσατε ένα γεωμετρικό μετασχηματισμό (ομοιοθεσία), ακολουθώντας μια επαναληπτική διαδικασία, και συνθέσατε το πρόγραμμα my9_6a. Εκτελώντας το πρόγραμμα αυτό, θα παρατηρήσετε ότι κατά τη μεγέθυνση δημιουργούνται κενά στο νέο σχέδιο. Αυτό συμβαίνει, διότι τα νέα pixels έχουν μεταξύ τους αποστάσεις, εξαιτίας των νέων θέσεων που καταλαμβάνουν.

 

Με ποιον τρόπο μπορείτε να βελτιώσετε την εμφάνιση του νέου σχήματος, όπως ακριβώς συμβαίνει με όλα τα πακέτα επεξεργασίας ψηφιογραφικών εικόνων;    

 

Ορίστε ένα συντελεστή ομοιοθεσίας λ=3 και μερικά διαδοχικά pixels της οθόνης σας, π.χ. (1,1), (1,2), (2,1), (2,2). Τα pixels που θα προκύψουν μετά την ομοιοθεσία είναι τα εξής: (3,3), (3,6), (6,3), (6,6). Ωστόσο, μεταξύ τους υπάρχουν αρκετά γειτονικά pixels που δεν χρωματίζονται. Το ερώτημα είναι πώς θα δώσετε και σε αυτά το ίδιο χρώμα, ώστε να μην υπάρχουν κενά.

Επιλέξτε το πρόγραμμα my9_6a που δημιουργήσατε στην εργασία. Κατά την απλή μεγέθυνση χρησιμοποιήστε τις παρακάτω εντολές:

 

{DHMIOYRGIA MEGENTHYSHS}

Rectangle(125,120,175,160); {PERIOXH DIABASMATOS }

L:= 2.3;

for y:=120 to 160 do { diavasma perioxis sximatos }

for x:=125 to 175 do

begin

P:=GetPixel(x,y); { dimiourgia antigrafou }

Xm:=Round(X*L);

Ym:=Round(Y*L);

PutPixel(Xm,Ym,p);

end;

 

Για να καλύψετε τα κενά που δημιουργούνται θα πρέπει να τοποθετήσετε μεταξύ αυτών που εμφανίζονται και άλλα pixels. Για να γίνει η τοποθέτηση θα πρέπει να ελέγξετε αν η μεταβλητή P:=GetPixel(x,y), η οποία επιστρέφει το χρώμα του pixel με συντεταγμένες (x,y), είναι διάφορη του 0 και να προσθέσετε μια επαναληπτική διαδικασία για τη συμπλήρωση χρώματος με τις παρακάτω εντολές:

 

if p<>0 then

      for xx:=0 to Trunc(L) do

      for yy:=0 to Trunc(L) do

      PutPixel(Xm+xx-1,Ym+yy-1,p);

 

Η εντολή Trunc(L) επιστρέφει το ακέραιο μέρος της πραγματικής μεταβλητής L.

 

Ερωτήματα – Διερευνήσεις

 

1.    Κάντε τις κατάλληλες προσθήκες και αλλαγές στο πρόγραμμα my9_6a, ώστε να γίνονται τα παραπάνω. Αποθηκεύστε το πρόγραμμα στο φάκελο σας ως my9_6d.

 

2.    Συνθέστε ένα ολοκληρωμένο πρόγραμμα, που να επιτρέπει στο χρήστη να παρατηρεί το σχέδιο που δημιουργείται και στη συνέχεια να ορίζει την περιοχή, όπου θα κάνει πλήρη μεγέθυνση, και το συντελεστή της.

 

 

Κατεβάστε εδώ τον κώδικα του προγράμματος σε Pascal.

Κατεβάστε εδώ το εκτελέσιμο αρχείο.