Δημιουργία και μετασχηματισμός κύκλου

 

Οδηγίες για την 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) σε (Χ, Υ) σύμφωνα με τους παραπάνω τύπους.

 

Δημιουργία κύκλου

 

Με την Pascal μπορείτε να σχεδιάσετε γεωμετρικά σχήματα, ακολουθώντας τις κατάλληλες εντολές. Στην περίπτωση που θέλετε να σχεδιάσετε έναν κύκλο, μπορείτε να χρησιμοποιήσετε την εντολή:

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

 

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

 

 

 

Σχήμα 2

 

Για να σχεδιάσετε με pixels έναν κύκλο θα πρέπει:

ü  Να ορίσετε το κέντρο του, έστω Κ(χ00).

ü  Να ορίσετε την ακτίνα του ρ.

ü  Να ορίσετε μια διαδικασία που να δημιουργεί τα pixels της περιφέρειάς του.

 

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

 

Ωστόσο, αν κέντρο του κύκλου είναι το σημείο Κ(χ00) της οθόνης του υπολογιστή, τότε οι συντεταγμένες του θα δίνονται από τους τύπους χ=χ0+ρ*ημφ και ψ=ψ0+ρ*συνφ (βλ. ενότητα 1, παράγραφος 1.7).

 

Όπως παρατηρείτε:

ü  Για φ=0ο έχουμε χ=χ0 και ψ=ψ0.

ü  Για φ=2ο έχουμε χ=χ0+ρ*ημ2 και ψ=ψ0+ρ*συν2 κ.τ.λ.

 

Ανάλογα, λοιπόν, με την πυκνότητα των pixels που θέλετε να κατασκευάσετε, μπορείτε να ορίσετε μια επαναληπτική διαδικασία, ξεκινώντας από 0ο και προσθέτοντας ένα βήμα bο, έως ότου κλείσει ο κύκλος στις 360ο. Σε κάθε βήμα θα σχηματίζεται ένα σημείο με συντεταγμένες οι οποίες θα ορίζονται από τις παραπάνω σχέσεις. Στο πρόγραμμα η γωνία φο θα πρέπει να εκφράζεται σε ακτίνια φο*π/180.

 

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

 

Program kyklos;

{KATASKEYH KYKLOY}

uses Crt,Graph;

 var

 grDriver,grMode : Integer;

 var X,Y,Xk,Yk,R : integer;

 f, b : real;

 begin

 clrscr;

 grDriver := Detect;

 InitGraph(grDriver, grMode,'bgi');

 setcolor(green);

 OuttextXY(250,1,'DHMIOYRGIA KYKLOY ');

 

{ORISMOS KENTROY KAI AKTINAS}

 Xk:= 180;

 Yk:= 200;

 PutPixel(Xk,Yk,red);

 setcolor(lightred);

 OuttextXY(Xk+4, Yk-8, 'Xk,Yk');

 R:=100;

 

{DHMIOYRGIA KYKLOY}

 f:=0;

 b:=0.001;

 repeat

 x:=Round(R*Sin(f*pi/180))+Xk;

 y:=Round(R*Cos(f*pi/180))+Yk;

 PutPixel(x,y,yellow);

 f:=f+b;

 until f>=360;

{EXODOS}

 setcolor(YELLOW);

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

 writeln ( 'ENTER GIA EXODO');

 Readln;

 end.

 

 

Κατεβάστε το πρόγραμμα εδώ.

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

 

 

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

 

1.   Πειραματιστείτε δίνοντας διάφορες τιμές στο βήμα b (π.χ. b=1, b=3, b=20, b=0,0001) και παρατηρήστε την πορεία της κατασκευής. Σχολιάστε τα αποτελέσματα που προκύπτουν.

 

2.   Πειραματιστείτε δίνοντας διάφορες τιμές στο κέντρο του κύκλου. Ποιες πρέπει να είναι οι τιμές των συντεταγμένων του κέντρου του κύκλου, ώστε να κατασκευαστεί ο κύκλος στο μέσο περίπου της οθόνης;

 

3.   Ποιες προσθήκες πρέπει να κάνετε στο πρόγραμμα my6_4a, ώστε να δίνονται από το πληκτρολόγιο οι συντεταγμένες του κέντρου, η ακτίνα του κύκλου και το βήμα κατασκευής; Αποθηκεύστε ως my6_4b το πρόγραμμα στο φάκελό σας.

 

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

 

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

 

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

 

Κατεβάστε το πρόγραμμα εδώ.

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

 

 

 

Μετασχηματισμός κύκλου

Για να κατασκευαστεί ο κύκλος απαιτούνται μόνο οι συντεταγμένες του κέντρου του και η ακτίνα του. Όσο αφορά την εμφάνισή του, μπορεί να γίνει σε πρακτικά απεριόριστη ανάλυση (ανάλογα με το βήμα δημιουργίας pixel που δίνετε). Mε αυτό τον τρόπο δημιουργείτε ένα σχήμα που είναι διανυσματική εικόνα, ή ένα τμήμα αυτής, σύμφωνα με όσα ορίζονται στη θεωρία σας.

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

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

 

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

 

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

 

2.   Ποιες μετατροπές χρειάζεται να κάνετε στις εξισώσεις, προκειμένου ο κύκλος να μπορεί να μεγεθύνεται ή να σμικρύνεται; Αφού κάνετε τις κατάλληλες αλλαγές, αποθηκεύστε ως my6_4d το πρόγραμμα στο φάκελό σας.

        Κατεβάστε το πρόγραμμα εδώ.

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

 

3.   Ποιες μετατροπές χρειάζεται να κάνετε στις εξισώσεις, προκειμένου ο κύκλος να μπορεί να παραμορφώνεται σε έλλειψη; Αφού κάνετε τις κατάλληλες αλλαγές, αποθηκεύστε ως my6_4e το πρόγραμμα στο φάκελό σας.

        Κατεβάστε το πρόγραμμα εδώ.

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

 

4.   Συνθέστε ένα ολοκληρωμένο πρόγραμμα, βασιζόμενοι στα προγράμματα της ενότητας 6.4, το οποίο θα επιτρέπει στο χρήστη να κατασκευάζει κύκλους, ορίζοντας το κέντρο και την ακτίνα τους, και στη συνέχεια να τους μεταβάλλει ως προς το μέγεθος (μεγέθυνση, σμίκρυνση) ή να τους μετατρέπει σε έλλειψη (παραμόρφωση). Αποθηκεύστε ως my6_4f το πρόγραμμα στο φάκελό σας.