Γραφικά στην 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 στην παραπάνω συνάρτηση .

 

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

 

Αυτό όπως είπαμε γίνεται με μια τεθλασμένη γραμμή . Αυτή σχεδιάζεται από ένα βρόχο fornext , ο οποίος αναλαμβάνει να δώσει στη μεταβλητή x όλες τις τιμές από start ως finish , ακολουθώντας το βήμα stp που υπολογίσαμε παραπάνω .

 

Το ολοκληρωμένο πρόγραμμα βρίσκεται στο αρχείο κώδικα sin.bas , με αρκετά σχόλια για να καταλάβετε τα πάντα .