Γραφικά
στην Qbasic
– μέρος ΙΙα
Στο προηγούμενο άρθρο περιγράψαμε τους τρόπους με τους οποίους μπορούμε να ελέγχουμε τα εικονοστοιχεία (pixels) της οθόνης μας . Ο κυριότερος είναι η εντολή PSET , με την οποία ενεργοποιούμε ένα εικονοστοιχείο στο χρώμα που επιθυμούμε . Όλες οι άλλες εντολές , μπορούν να προκύψουν από την PSET με κατάλληλους χειρισμούς . Παρόλα αυτά θα χρησιμοποιήσουμε την εντολή αυτή σε συνδυασμό με την εντολή LINE , για την κατασκευή πολύπλοκων σχημάτων .
Μια τεθλασμένη γραμμή δεν είναι άλλο από ένα σύνολο από ευθείες (ή πιο σωστά ευθύγραμμα τμήματα) τοποθετημένες η μία μετά την άλλη . Έτσι στην Qbasic για να κατασκευάσουμε τεθλασμένες γραμμές μπορούμε να δίνουμε κάθε φορά μια νέα εντολή LINE . Ωστόσο η Qbasic έχει έναν απλούστερο τρόπο που θα μας γλυτώσει τη μισή πληκτρολόγηση συντεταγμένων . Η εντολή LINE , όταν δοθεί με τις μισές συντεταγμένες , δηλαδή :
LINE –(100,100)
Τότε σχεδιάζει μια ευθεία γραμμή με αρχικό σημείο το τελευταίο εικονοστοιχείο που ενεργοποιήθηκε και τελικο σημείο αυτό που δίνουμε εμείς .
Για να καταλάβετε πώς ακριβώς λειτουργεί , ρίξτε μια ματιά
στα αρχεία κώδικα BROKEN1.BAS και BROKEN2.BAS.
Οι τεθλασμένες γραμμές θα μας φανούν χρήσιμες στη δημιουργία πολύπλοκων σχημάτων , όπως είναι οι καμπύλες .
Και πριν ξεκινήσουμε την κατασκευή γραγικών παραστάσεων , χρειαζόμαστε ένα σύστημα συντεταγμένων . Αυτό που μας παρέχει απευθείας η Qbasic δεν αρκεί , αφού η αρχή του είναι πάνω αριστερά , και για διάφορους λόγους θα δυσκόλευε πολύ τα πράγματα (αρνητικές τιμες συναρτήσεων , κατεύθυνση κλπ) . Ευτυχώς , μπορούμε να ορίσουμε ένα νέο σύστημα συντεταγμένων με την εντολή WINDOW . Η εντολή WINDOW έχει παρόμοια σύνταξη με τη LINE . Στα ορίσματα δίνουμε τις αρχικές και τελικές συντεταγμένες της οθόνης μας . Έτσι πχ. Με την εντολή :
WINDOW (-100,-100)-(100,100)
Χωρίζουμε την οθόνη σε 200 τμήματα οριζόντια και 200 τμήματα κάθετα (από –100 ως +100) . Αν τώρα δώσουμε την εντολή PSET (0,0) θα δούμε ένα pixel στο κέντρο της οθόνης (και όχι στην πάνω αριστερή γωνία) . Έχουμε λοιπόν ορίσει ένα σύστημα συντεταγμένων . Τώρα πρέπει να ζωγραφίσουμε και τους άξονες χ και ψ . Αυτό θα γίνει με 2 εντολές LINE :
LINE
(-100,0)-(100,0)
LINE
(0,-100)-(0,100)
Η γραφική παράσταση
Αφού ορίσουμε ένα σύστημα συντεταγμένων και σχεδιάσουμε τους άξονες , μπορούμε να σχεδιάσουμε και τη γραφική παράσταση . Η πρώτη καμπύλη που θα σχεδιάσουμε θα είναι η γνωστή f(x)=a*sin(x) (ημιτονοειδής) .
Καταρχήν πρέπει να σκεφτούμε ότι δεν μπορούμε να ζωγραφίσουμε ολόκληρη τη γραφική παράσταση , αφού αυτή είναι άπειρη (έχει πεδίο ορισμού το R) . Αποφασίζουμε λοιπόν ότι αυτό που θα απεικονίσουμε είναι στην ουσία ένα τμήμα της ημιτονοειδούς καμπύλης . Όσο δηλαδή χωράει μέσα στο σύστημα συντεταγμένων που επιλέξαμε .
Θα απεικονίσουμε την ημιτονοειδή καμπύλη από –2π ως 2π . Έτσι ορίζουμε ανάλογα το σύστημα συντεταγμένων μας με τις εντολές :
p=3.14159
start=-2*p
finish= 2*p
WINDOW (start,-100)-(finish,100)
Αν θέλουμε να αλλάξουμε την περιοχή σχεδίασης (ή και το εύρος της) απλώς αλλάζουμε τα start και finish στις κατάλληλες τιμές
Η απεικόνιση της γραφικής παράστασης θα γίνει με τη χρήση μιας τεθλασμένης γραμμής .Όσο πιο πολλά ευθύγραμμα τμήματα την αποτελούν , τόσο πιο καλά η καμπύλη μας θα προσεγγίζει την πραγματική ημιτονοειδή καμπύλη . Βέβαια όσο πιο πολλά σημεία επιλέξουμε τόσο πιο δύσκολη και αργή θα είναι η επεξεργασία και η απεικόνιση της καμπύλης . Επιπλέον , δεν μπορούμε να έχουμε περισσότερη λεπτομέρεια από μια μέγιστη τιμή , η οποία καθορίζεται από την ανάλυση της οθόνης στην κατάσταση γραφικών που βρισκόμαστε .
Καθορίζουμε τον αριθμό των σημείων με μια μεταβλητή που ονομάζουμε
points
points=1000
Με 8 σημεία | Με 30 σημεία | Με 1000 σημεία |
Παίξτε λίγο με τη μεταβλητή για να δείτε τι επίδραση έχει στην ταχύτητα και στη λεπτομέρεια της απεικόνισης . Δοκιμάστε τιμές όπως 8 (πολλές γωνίες) και 500000 (η καμπύλη ζωγραφίζεται μποστά στα μάτια μας) .
Έχοντας καθορίσει την αρχή και το τέλος της γραφικής παράστασης , καθώς και τον αριθμό των σημείων που θα χρησιμοποιήσουμε , μπορούμε εύκολα να υπολογίσουμε κάθε πότε θα εμφανίζεται ένα νέο σημείο . Η συνολική απόσταση που θα καλύψει η γραφική παράσταση είναι (finish-start) . Αν την διαιρέσουμε με τον ατιθμό των σημείων παίρνουμε το βήμα , δηλαδή κάθε πότε απεικονίζεται ένα νέο σημείο πάνω στη γραφική παράσταση .
stp = (finish
- start) / points
Τέλος καθορίζουμε το πλάτος του «κύματος» , που είναι η παράμετρος
a στην
παραπάνω συνάρτηση .
Έχοντας καθορίσει όλες τις απιτούμενες παραμέτρους , μπορούμε να σχεδιάσουμε επιτέλους τη γραφική παράσταση .
Αυτό όπως είπαμε γίνεται με μια τεθλασμένη γραμμή . Αυτή σχεδιάζεται από ένα βρόχο for…next , ο οποίος αναλαμβάνει να δώσει στη μεταβλητή x όλες τις τιμές από start ως finish , ακολουθώντας το βήμα stp που υπολογίσαμε παραπάνω .
Το ολοκληρωμένο πρόγραμμα βρίσκεται στο αρχείο κώδικα sin.bas , με αρκετά σχόλια για να καταλάβετε τα πάντα .