Χρησιμοποιώντας Τύπους Δεδομένων Ι-1
Θεμελιώδη για Προγραμματισμό Οποιοδήποτε πρόγραμμα το οποίο θα θέλεις να γράψεις αντικείμενα Για δημιουργία των δικών σας τύπων δεδομένων Συναρτήσεις και ενότητες γραφικά, ήχος, και εικόνα Ε/Ε πίνακες Συνθήκες and επαναλήψεις Μαθηματικά Κείμενο Ε/E Αρχέγονοι τύποι δεδομένων Προτάσεις ανάθεσης Ενότητα ΙΙΙ 2
Τύποι Δεδομένων Τύπος Δεδομένων. Ένα σύνολο από τιμές και λειτουργίες σε αυτές τις τιμές. Βασικοί τύποι. Λειτουργίες που μεταφράζονται άμεσα σε εντολές μηχανής Τύπος Δεδομένων boolean Σύνολο τιμών true, false Λειτουργίες not, and, or, xor int double -2 31 to 2 31-1 any of 2 64 possible reals add, subtract, multiply add, subtract, multiply Εμείς θέλουμε να γράψουμε προγράμματα τα οποία επεξεργάζονται άλλους τύπους δεδομένων. Χρώματα, εικόνες, συμβολοσειρές, ροές εισόδου, Πολύπλοκους αριθμούς, διανύσματα, πίνακες, πολυώνυμα, Σημεία, πολύγωνα, φορτισμένα σωματίδια, ουράνια σώματα, 3
Αντικείμενα Αντικείμενο. Κρατά μία τιμή τύπου δεδομένων. Το όνομα της μεταβλητής αναφέρεται στο αντικείμενο. Επιρροή. Δίνει τη δυνατότητα σε εμάς να δημιουργούμε τους δικούς μας τύπους δεδομένων, να ορίζουμε λειτουργίες σε αυτούς, και να τους ενσωματώσουμε στα προγράμματά μας. Τύπος Δεδομένων Color Σύνολο Τιμών 24 bits Λειτουργίες get red component, brighten Picture 2D πίνακας χρωμάτων get/set color of pixel (i, j) String Ακολουθία χαρακτήρων length, substring, compare ΑΝΑΠΑΡΙΣΤΟΥΝ ΤΟΝ ΠΡΑΓΜΑΤΙΚΟ ΚΟΣΜΟ 4
Κατασκευαστές και Μέθοδοι Για να κατασκευάσετε ένα νέο αντικείμενο: Χρησιμοποιήστε τη λέξη κλειδί new και το όνομα του τύπου δεδομένων. Για να εφαρμόσετε μία λειτουργία: Χρησιμοποιήστε το όνομα του αντικειμένου, τον «dot» τελεστή, και το όνομα της μεθόδου. 5
Βασικοί τύποι vs. Αναφορές Βασικοί τύποι. Λειτουργίες που μεταφράζονται άμεσα σε εντολές μηχανής int, long, double, boolean, char, short, byte, float Οι πραγματικές τιμές αποθηκεύονται στη μεταβλητή Αναφορές. Οι τύποι των αναφορών είναι πίνακες και αντικείμενα String, int[], 6
7 Πως η java αποθηκεύει τους βασικούς τύπους Οι μεταβλητές μπορούν να παρομοιαστούν με σταθερού μεγέθους φλιτζάνια. Οι βασικοί τύποι είναι αρκετά μικροί και χωρούν στο φλιτζάνι.
Πως η java αποθηκεύει τα αντικείμενα Τα αντικείμενα είναι πολύ μεγάλα για να ταιριάξουν σε μία μεταβλητή. Αποθηκεύονται κάπου αλλού. Η μεταβλητή αποθηκεύει έναν αριθμό που εντοπίζει το αντικείμενο. 8
Πως η java αποθηκεύει τα αντικείμενα Τα αντικείμενα είναι πολύ μεγάλα για να ταιριάξουν σε μία μεταβλητή. Αποθηκεύονται κάπου αλλού. Η μεταβλητή αποθηκεύει έναν αριθμό που εντοπίζει το αντικείμενο. 9
Αναφορές Η θέση του αντικειμένου ονομάζεται αναφορά Ο τελεστής == συγκρίνει τις αναφορές Ισχύει ότι shiloh1 == shiloh2 ; OXI 10
Αναφορές 11
Αναφορές 12
Αναφορές 13
Αναφορές Χρησιμοποιώντας τον τελεστή = ενημερώνονται οι αναφορές 14
Αναφορές Χρησιμοποιώντας τον τελεστή = ενημερώνονται οι αναφορές 15
Αναφορές Ακολουθώντας τις κατευθύνσεις για να οδηγηθείς στο σπίτι Μετακινώντας ένα έπιπλο Οι παραπάνω ενέργειες είναι ανάλογες με: Ακολουθώντας την αναφορά σε ένα αντικείμενο Αλλάζοντας τα πεδία σε ένα αντικείμενο 16
Διάκριση ανάμεσα σε βασικούς τύπους και αντικείμενα Οι τιμές των βασικών τύπων δεδομένων είναι αδιάσπαστες και έχουμε απευθείας πρόσβαση στις τιμές μεταβλητών τέτοιων τύπων Στις κλήσεις συναρτήσεων, οι τιμές μεταβλητών βασικών τύπων δεδομένων αντιγράφονται τοπικά, χωρίς να επηρεάζονται οι ίδιες οι μεταβλητές Πέρασμα δια τιμής (call by value) Το ίδιο συμβαίνει και σε εντολές ανάθεσης, όπου οι τιμές αντιγράφονται Μεταβλητές βασικών τύπων δεδομένων, δημιουργούνται και καταργούνται αυτόματα Στατική διαχείριση μνήμης κανόνες εμβέλειας ονομασιών 17
Διάκριση ανάμεσα σε βασικούς τύπους και αντικείμενα Τα αντικείμενα αποτελούν νέους τύπους δεδομένων, και μπορούν να έχουν σύνθετη εσωτερική δομή, η οποία αναπαριστά τα διάφορα χαρακτηριστικά/ιδιότητες τους, κτλ. Υπάρχουν σημαντικοί λόγοι γιατί δεν πρέπει να γνωρίζουμε, δηλαδή να έχουμε απευθείας πρόσβαση στην εσωτερική δομή των αντικειμένων Ενδεικνυόμενη απόκρυψη πληροφοριών (information hiding) Συνεπώς τα αντικείμενα συνιστούν Αφηρημένους Τύπους Δεδομένων (ΑΤΔ) Abstract Data Types (ADT) Στιγμιότυπα (τύπων) αντικειμένων, δηλαδή συγκεκριμένες περιπτώσεις δεδομένου τύπου αντικειμένου, κατασκευάζονται με δυναμικό τρόπο ύστερα από συγκεκριμένο αίτημα μέσω του τελεστή new. Δυναμική διαχείριση μνήμης Παρασκηνιακά, ο σκουπιδιάρης (garbage collector) ανακτά τη μνήμη όταν συγκεκριμένο αντικείμενο πάψει να χρησιμοποιείται, δηλαδή κανένα μέρος του προγράμματος δεν αναφέρεται στο εν λόγω αντικείμενο 18
Διάκριση ανάμεσα σε βασικούς τύπους και αντικείμενα Τα αντικείμενα ονομάζονται τύποι αναφοράς (reference types) διότι το τι παρέχεται είναι η διεύθυνση του χώρου της μνήμης που κατανέμεται για την κατασκευή τους δεν αντιγράφονται οι (σύνθετες) τιμές τους σε κλήσεις συναρτήσεων, εντολές ανάθεσης, κτλ. το τι αντιγράφεται/ανατίθεται είναι οι διευθύνσεις τους, οι οποίες συνιστούν τις αναφορές προς τα αντικείμενα Πέρασμα διά διευθύνσεως (call by reference) Οι πίνακες αποτελούν ενσωματωμένα αντικείμενα και χειρίζονται με τον ίδιο τρόπο call by reference Εάν πολλαπλά σημεία του προγράμματος αναφέρονται στο ίδιο συγκεκριμένο αντικείμενο (αποτελούν δείκτες προς το αντικείμενο multiple aliases) τυχόν τροποποιήσεις στο εν λόγω αντικείμενο, επηρεάζουν όλα τα σημεία αναφοράς. 19
Παράδειγμα: Συνάρτηση για την εναλλαγή των περιεχομένων δύο μεταβλητών τύπου double. public static void swap (double x, double y) {double temp = x; x = y; y = temp; } double num1 = 1.5, num2 = 3.8; swap(num1, num2); Ποιές είναι οι τιμές των μεταβλητών num1 και num2 μετά την εκτέλεση της πιο πάνω κλήσης της συνάρτησης swap; 20
num1 num2 1.5 3.8 swap x y temp 21
num1 num2 1.5 3.8 swap x y 1.5 3.8 temp 22
num1 num2 1.5 3.8 swap x 1.5 y 3.8 temp 1.5 23
num1 num2 1.5 3.8 swap x 3.8 y 3.8 temp 1.5 24
num1 num2 1.5 3.8 swap x 3.8 y 1.5 temp 1.5 25
num1 num2 1.5 3.8 Παρατηρήσεις 1. Οι τιμές των μεταβλητών num1 και num2 δεν έχουν εναλλαγεί 2. Η εναλλαγή έγινε στις τιμές των τοπικών μεταβλητών, x και y, της swap με τη χρήση της τοπικής βοηθητικής μεταβλητής temp 3. Οι τοπικές μεταβλητές παύουν να υφίστανται με την ολοκλήρωση της εκτέλεσης της κλήσης της swap 26
Αναδιατύπωση της swap Ποια είναι η λειτουργία της; public static void swap (double[] x) {for (int i = 0; i < x.length-1; i=i+2){ double temp = x[i]; x[i] = x[i+1]; x[i+1] = temp; } double[] table = {1.5, 3.8}; swap(table); Ποιές είναι οι τιμές των εισόδων της table μετά την εκτέλεση της πιο πάνω κλήσης της συνάρτησης swap; 27
table 1.5 3.8 swap x temp i 0 28
table 1.5 3.8 swap x temp 1.5 i 0 29
table 3.8 3.8 swap x temp 1.5 i 0 30
table 3.8 1.5 swap x temp 1.5 i 0 31
table 3.8 1.5 swap x temp 1.5 i 2 32
table 3.8 1.5 Παρατηρήσεις 1. Η εναλλαγή στις τιμές των table[0] και table[1] έχει επιτευχθεί, διότι η swap είχε πρόσβαση στην μεταβλητή table 2. Όταν εμπλέκονται τύποι αναφοράς, π.χ. η table, αφού όλοι οι πίνακες είναι τύποι αναφοράς, το όρισμα (table) ταυτίζεται με την παράμετρο (x). Αυτή είναι η σημασιολογία του περάσματος διά διευθύνσεως/αναφοράς. 33
table 3.8 1.5 y 0.5 pair double y = 0.5; double[] pair = table; pair[0] = y; double[] tab = new double[2]; tab[0] = table[0]; tab[1] = table[1]; 34
table 0.5 1.5 y 0.5 pair tab double y = 0.5; double[] pair = table; pair[0] = y; double[] tab = new double[2]; tab[0] = table[0]; tab[1] = table[1]; 35
table 0.5 1.5 y 0.5 pair table == pair? NAI tab tab == table? OXI 0.5 1.5 y == tab[0]? NAI double y = 0.5; double[] pair = table; pair[0] = y; double[] tab = new double[2]; tab[0] = table[0]; tab[1] = table[1]; 36
Μέθοδοι Αναφοράς Δύο Κατασκευαστές (Reference Methods) save width Picture height Η εσωτερική αναπαράσταση των pictures και colors δεν μας αφορά!! show getred get Ένας Κατασκευαστής set brighter getgreen Color getblue darker tostring equals 37
Έστω ότι η εσωτερική δομή των pictures είναι 2D πίνακες με στοιχεία colors, δηλαδή αναφορές σε colors 38
Downscaling: 4 pixels στο source αντιστοιχούν σε 1 στο target Στο κάτω παράδειγμα τα 4 εμπλεκόμενα κοινά colors ανάμεσα στο source και το target αναφέρονται και από τα δύο pictures, και τυχόν τροποποίησή των αντικειμένων αυτών μέσω του ενός picture επηρεάζει και το άλλο picture source target 39
Up scaling: 1 pixel στο source αντιστοιχεί σε 4 στο target Στο κάτω παράδειγμα τα 4 colors του source καταλήγουν να έχουν 5 αναφορές το καθένα, μια από το source και τέσσερις από το target - και πάλι τυχόν τροποποίηση των αντικειμένων αυτών μέσω του ενός picture επηρεάζει και το άλλο picture target source 40
Επεξεργασία Εικόνας
Color Τύπος Δεδομένων Χρώμα. Η αίσθηση του ματιού από την ηλεκτρομαγνητική ακτινοβολία. Σύνολο τιμών. [RGB αναπαράσταση] 256 3 δυνατές τιμές, οι οποίες ποσοτικοποιούν το μέγεθος του κόκκινου, πράσινου και μπλε, το καθένα σε κλίμακα από το 0 στο 255. R G B Χρώμα 255 0 0 0 255 0 0 0 255 255 255 255 0 0 0 255 0 255 105 105 105 42
Τύπος Δεδομένων Color Χρώμα. Η αίσθηση του ματιού από την ηλεκτρομαγνητική ακτινοβολία. Σύνολο τιμών. [RGB αναπαράσταση] 256 3 δυνατές τιμές, οι οποίες ποσοτικοποιούν το μέγεθος του κόκκινου, πράσινου και μπλε, το καθένα σε κλίμακα από το 0 στο 255. API. Application Programming Interface. http://java.sun.com/j2se/1.5.0/docs/api/java/awt/color.html 43
Τα τετράγωνα του Albers Josef Albers. Επαναστάτησε τον τρόπο με τον οποίο οι άνθρωποι σκέπτονται για τα χρώματα. Φόρος τιμής στα τετράγωνα του Josef Albers (1949-1975) 44
Τα τετράγωνα του Albers Josef Albers. Επαναστάτησε τον τρόπο με τον οποίο οι άνθρωποι σκέπτονται για τα χρώματα. blue gray % java AlbersSquares 9 90 166 100 100 100 45
Χρησιμοποιώντας χρώματα στη Java import java.awt.color; Για να έχουμε πρόσβαση στη βιβλιοθήκη Color public class AlbersSquares { public static void main(string[] args) { int r1 = Integer.parseInt(args[0]); int g1 = Integer.parseInt(args[1]); int b1 = Integer.parseInt(args[2]); Color c1 = new Color(r1, g1, b1); int r2 = Integer.parseInt(args[3]); int g2 = Integer.parseInt(args[4]); int b2 = Integer.parseInt(args[5]); Color c2 = new Color(r2, g2, b2); StdDraw.setPenColor(c1); StdDraw.filledSquare(.25,.5,.2); StdDraw.setPenColor(c2); StdDraw.filledSquare(.25,.5,.1); Πρώτο χρώμα Δεύτερο χρώμα Πρώτο τετράγωνο } } StdDraw.setPenColor(c2); StdDraw.filledSquare(.75,.5,.2); StdDraw.setPenColor(c1); StdDraw.filledSquare(.75,.5,.1); Δεύτερο τετράγωνο 46
Μονόχρωμη Φωτεινότητα Μονόχρωμη φωτεινότητα. Αποτελεσματική φωτεινότητα του χρώματος. NTSC φόρμουλα: Y = 0.299r + 0.587g + 0.114b. import java.awt.color; public class Luminance { } public static double lum(color c) { int r = c.getred(); int g = c.getgreen(); int b = c.getblue(); return.299*r +.587*g +.114*b; } 47
Συμβατότητα χρώματος Ερώτηση: Ποια χρώματα γραμματοσειράς θα είναι πιο ευανάγνωστα με ποια χρώματα φόντου σε οθόνες ηλεκτρονικών υπολογιστών και οθόνες κινητών τηλεφώνων; Απάντηση: Βασικός κανόνας: η διαφορά στη φωτεινότητα θα πρέπει να είναι 128. 256 208 105 47 28 14 public static boolean compatible(color a, Color b) { return Math.abs(lum(a) - lum(b)) >= 128.0; } 48
Αποχρώσεις του Γκρι Απόχρωση του γκρι. Όταν και οι τρεις τιμές, R, G, και B, είναι οι ίδιες, το αποτέλεσμα του χρώματος είναι στην απόχρωση του γκρι από 0 (μαύρο) σε 255 (άσπρο). Μετατροπή σε απόχρωση του γκρι. Χρησιμοποιήστε φωτεινότητα για τον προσδιορισμό της τιμής. public static Color togray(color c) { int y = (int) Math.round(lum(c)); Color gray = new Color(y, y, y); return gray; } round double to nearest int Μέθοδοι στην ίδια Βιβλιοθήκη - Luminance Τελικό συμπέρασμα: Γράφουμε προγράμματα τα οποία χειραγωγούν το χρώμα. 49
OOP Πλαίσιο για Χρώμα Δυνατή αναπαράσταση της μνήμης. D0 D1 D2 D3 D4 D5 D6 D7 D8 255 0 255 0 0 0 105 105 105 magenta A0 D0 B0 D6 gray Διεύθυνση μνήμης («δείκτης") Η αναφορά αντικειμένου είναι ανάλογη με το όνομα μεταβλητής. Μπορούμε να χειραγωγήσουμε την τιμή που έχει. Μπορούμε να την περάσουμε σε (ή να την επιστρέψουμε από) μία μέθοδο. 50
Τύπος Δεδομένων Picture Raster γραφικά. Η βάση για την επεξεργασία εικόνας. (0, 0) j Σύνολο τιμών. 2D πίνακας από Color αντικείμενα (εικονοστοιχεία - pixels). i API. 51
Επεξεργασία Εικόνας: Grayscale Φίλτρο Στόχος. Να μετατραπεί το χρώμα της εικόνας σε απόχρωση του γκρι σύμφωνα με τον τύπο φωτεινότητας. import java.awt.color; public class Grayscale { public static void main(string[] args) { Picture pic = new Picture(args[0]); for (int i = 0; i < pic.width(); i++) { for (int j = 0; j < pic.height(); j++) { Color color = pic.get(i, j); Color gray = Luminance.toGray(color); pic.set(i, j, gray); } } pic.show(); } } 52
Επεξεργασία Εικόνας: Grayscale Φίλτρο Στόχος. Να μετατραπεί το χρώμα της εικόνας σε απόχρωση του γκρι σύμφωνα με τον φόρμουλα φωτεινότητας. mandrill.jpg % java Grayscale mandrill.jpg 53
Επεξεργασία Εικόνας: Φίλτρο κλιμάκωσης Στόχος: Συρρίκνωση ή μεγέθυνση μίας εικόνας στο επιθυμητό μέγεθος. Κλιμάκωση προς τα κάτω (downscaling): Να συρρικνώσετε, διαγράφοντας τις μισές γραμμές και στήλες. Κλιμάκωση προς τα πάνω (upscaling): Να μεγαλώσετε, αντικαθιστώντας κάθε εικονοστοιχείο με 4 αντίγραφα. 54
Επεξεργασία Εικόνας: Φίλτρο κλιμάκωσης Στόχος. Συρρίκνωση ή μεγέθυνση μίας εικόνας στο επιθυμητό μέγεθος. Ομοιόμορφη στρατηγική. Να μετατρέψετε από w s -επί-h s σε w t -επί- h t : Κλιμάκωση του δείκτη γραμμής σε w s / w t. Κλιμάκωση του δείκτη στήλης σε h s / h t. Θέστε το χρώμα του εικονοστοιχείου (i, j) στην εικόνα στόχο στο χρώμα του εικονοστοιχείου (i w s / w t, j h s / h t ) στην πηγαία εικόνα. j h s / h t j i w s / w t? i πηγαία εικόνα (w s χh s ) εικόνα στόχος (w t χh t ) 55
Επεξεργασία Εικόνας: Φίλτρο κλιμάκωσης import java.awt.color; public class Scale { public static void main(string args[]) { String filename = args[0]; int w = Integer.parseInt(args[1]); int h = Integer.parseInt(args[2]); Picture source = new Picture(filename); Picture target = new Picture(w, h); for (int ti = 0; ti < w; ti++) { for (int tj = 0; tj < h; tj++) { int si = ti * source.width() / w; int sj = tj * source.height() / h; Color color = source.get(si, sj); target.set(ti, tj, color); } } source.show(); target.show(); } } 56
Επεξεργασία Εικόνας: Φίλτρο κλιμάκωσης Φίλτρο κλιμάκωσης. Δημιουργεί δύο Picture αντικείμενα και δύο παράθυρα. mandrill.jpg % java Scale 400 200 mandrill.jpg 57
Περισσότερες επιπτώσεις στην επεξεργασία εικόνας RGB διαχωρισμός χρώματος swirl φίλτρο wave φίλτρο glass φίλτρο Sobel εντοπισμός ακμής 58
Επεξεργασία κειμένου
Τύπος δεδομένων String (συμβολοσειρές) Τύπος δεδομένων String: Αποτελεί τη βάση για επεξεργασία κειμένου. Σύνολο τιμών: Ακολουθία από Unicode χαρακτήρες. API. http://java.sun.com/j2se/1.5.0/docs/api/java/lang/string.html
Τυπικός κώδικας για επεξεργασία συμβολοσειρών 61
Εύρεση Γονιδίου Προ-γονιδιακή περίοδος. Ακολουθία ενός ανθρώπινου γονιδιώματος. Μετά-γονιδιακή περίοδος. Ανάλυση των δεδομένων και κατανόηση της δομής. Γονιδιωματική. Τα γονιδιώματα αντιπροσωπεύονται ως συμβολοσειρές σε σχέση με το αλφάβητο {A, C, T, G} Γονίδιο. Μία υποσυμβολοσειρά του γονιδιώματος το οποίο αντιπροσωπεύει μία λειτουργική μονάδα. Προηγείται από ATG. [κωδικόνιο έναρξης] Πολλαπλάσια των 3 νουκλεοτίδια. [κωδικόνιο εκτός έναρξης και τερματισμού] Ακολουθείται από TAG, TAA, ή TGA. [κωδικόνιο τερματισμού] Στόχος: Να βρούμε όλα τα γονίδια 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 A T A G A T G C A T A G C G C A T A G C T A G A T G T G C T A G C έναρξη γονίδιο λήξη γονίδιο
Εύρεση γονιδίου: Αλγόριθμος Αλγόριθμος: Σαρώστε από αριστερά προς τα δεξιά εντός του γονιδιώματος. Εάν εντοπισθεί το κωδικόνιο έναρξης, τότε θέστε beg στο δείκτη i. Εάν εντοπισθεί το κωδικόνιο τερματισμού και η υποσυμβολοσειρά είναι πολλαπλάσια του 3 Γονίδιο εξόδου Επαναφορά του beg στο -1 start multiple of 3 stop
Εύρεση γονιδίου: Υλοποίηση public class GeneFind { public static void main(string[] args) { String start = args[0]; String stop = args[1]; String genome = StdIn.readAll(); } } int beg = -1; for (int i = 0; i < genome.length() - 2; i++) { String codon = genome.substring(i, i+3); if (codon.equals(start)) beg = i; if (codon.equals(stop) && beg!= -1) { String gene = genome.substring(beg+3, i); if (gene.length() % 3 == 0) { StdOut.println(gene); beg = -1; } } % more genometiny.txt } ATAGATGCATAGCGCATAGCTAGATGTGCTAGC % java GeneFind ATG TAG < genometiny.txt CATAGCGCA TGC 64
OOP Πλαίσιο για συμβολοσειρές Δυνατή αναπαράσταση της μνήμης για μία συμβολοσειρά. genome = "aacaagtttacaagc"; genome D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE A0 A1 a a c a a g t t t a c a a g c D0 15 Διεύθυνση μνήμης μήκος 65
OOP Πλαίσιο για συμβολοσειρές Πιθανή αναπαράσταση της μνήμης για μία συμβολοσειρά. genome = "aacaagtttacaagc"; genome D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE A0 A1 a a c a a g t t t a c a a g c D0 15 s t Διεύθυνση μνήμης μήκος s = genome.substring(1, 5); B0 B1 B2 B3 t = genome.substring(9, 13); D1 4 D9 4 s και t είναι διαφορετικές συμβολοσειρές οι οποίες διαμοιράζονται την ίδια τιμή "acaa" (s == t) is false, but (s.equals(t)) is true. Συγκρίνει δείκτες Συγκρίνει ακολουθίες χαρακτήρων 66
OOP Σύνοψη Αντικείμενο. Κρατά μία τιμή τύπου δεδομένων. Το όνομα της μεταβλητής αναφέρεται στο αντικείμενο. Στη Java, τα προγράμματα χειρίζονται τις αναφορές στα αντικείμενα. Εξαίρεση: αρχέγονοι τύποι, π.χ., boolean, int, double. Τύποι αναφορών: String, Picture, Color, πίνακες, οτιδήποτε άλλο. Καθαρός OOP : η γλώσσα δεν θα πρέπει να έχει ξεχωριστούς αρχέγονους τύπους. Γενικό συμπέρασμα: Γράψαμε προγράμματα τα οποία επεξεργάζονται χρώματα, εικόνες και συμβολοσειρές. Την επόμενη φορά. Θα γράψουμε προγράμματα τα οποία θα επεξεργάζονται τα δικά μας abstractions. 67
Επιπλέον Διαφάνειες
Color Separation import java.awt.color; public class ColorSeparation { public static void main(string args[]) { Picture pic = new Picture(args[0]); int width = pic.width(); int height = pic.height(); Picture R = new Picture(width, height); Picture G = new Picture(width, height); Picture B = new Picture(width, height); } } for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { Color c = pic.get(i, j); int r = c.getred(); int g = c.getgreen(); int b = c.getblue(); R.set(i, j, new Color(r, 0, 0)); G.set(i, j, new Color(0, g, 0)); B.set(i, j, new Color(0, 0, b)); } } R.show(); G.show(); B.show(); 69
Color Separation ColorSeparation.java. Δημιουργεί 3 Picture αντικείμενα και παράθυρα. 70
Επεξεργασία εικόνας: Swirl Filter Swirl.java. Δημιουργεί 2 Picture αντικείμενα και παράθυρα. 71
Επεξεργασία εικόνας : Swirl Filter Στόχος. Να δημιουργηθεί ένα στρόβιλος ειδικό εφέ θέτοντας το χρώμα του εικονοστοιχείου εξόδου (i, j) σε χρώμα κάποιου άλλου εικονοστοιχείου εισόδου (ii, jj). double i0 = 0.5 * width; double j0 = 0.5 * height; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { double di = i - i0; double dj = j - j0; double r = Math.sqrt(di*di +dj*dj); double a = Math.PI / 256 * r; int ii = (int)(-di*math.cos(a) + dj*math.sin(a) + i0); int jj = (int)( di*math.sin(a) + dj*math.cos(a) + j0); if (ii >= 0 && ii < width && jj >= 0 && jj < height) pic2.set(i, j, pic1.get(ii, jj)); } } 72