Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Χειμερινό εξάμηνο Γραφικά με υπολογιστές Διδάσκων: Φοίβος Μυλωνάς fmylonas@ionio.gr Διάλεξη #08 Αποκοπή (εισαγωγή) Σημειακή Αποκοπή Αποκοπή Ευθύγραμμων Τμημάτων (line clipping) Αλγόριθμος Μέσου Αλγόριθμος Cohen-Sutherland (2D) Φοίβος Μυλωνάς Γραφικά με υπολογιστές 1
Άδεια χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς. 2
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα Ιονίου Πανεπιστημίου» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 3
Εισαγωγή Το οπτικό μας πεδίο είναι περιορισμένο ενώ παράλληλα υπάρχει παρεμπόδιση μεταξύ αντικειμένων βλέπουμε ένα πολύ μικρό κομμάτι των αντικειμένων που αποτελούν τον κόσμο! Οι αλγόριθμοι αποκοπής αφαιρούν αντικείμενα που δεν σχετίζονται με τη δημιουργία της εικόνας συγκεκριμένου καρέ, επειδή: Βρίσκονται εκτός του οπτικού πεδίου (αποκοπή στο οπτικό πεδίο) Παρεμποδίζονται από άλλα αντικείμενα (αποκοπή παρεμποδιζομένων) Παρεμποδίζονται από έμπροσθεν όψεις του ίδιου αντικειμένου (περικοπή πίσω όψεων) 4
Graphics Output Pipeline 2D εικόνα 5
Εισαγωγή H 3D αποκοπή γίνεται για 2 βασικούς λόγους: αποφυγή της λανθασμένης εμφάνισης αντικειμένων που βρίσκονται πίσω από τον παρατηρητή μείωση του όγκου των δεδομένων προς το στάδιο της απεικόνισης Αποκοπή: Ενός αντικειμένου (ευθύγραμμου τμήματος, πολύγωνου) ως προς συγκεκριμένο αντικείμενο αποκοπής (ορθογώνιο, πυραμίδα, κύβο). Το αντικείμενο αποκοπής ορίζει το τμήμα του χώρου που ενδιαφέρει τον παρατηρητή αναφορικά με τις επιφάνειες που μπορεί αυτός να δει. Αποκοπή στο οπτικό πεδίο: Αφαιρεί τα στοιχειώδη αντικείμενα εκτός του πεδίου παρατήρησης Υλοποιείται με 3D αλγόριθμους αποκοπής 6
Εισαγωγή Αποκοπή πίσω όψεων: Αφαιρεί τα στοιχειώδη σχήματα που αποκρύπτονται από μπροστινά στοιχειώδη σχήματα του ίδιου αντικειμένου Χρησιμοποιεί γι αυτό τα κανονικά διανύσματα Αποκοπή παρεμποδιζομένων: Καθορισμός των ορατών αντικειμένων σε κάθε τμήμα της εικόνας Επιλύεται με τον υπολογισμό του πρώτου αντικειμένου που τέμνεται από κάθε ακτίνα προερχόμενη από το σημείο παρατήρησης Για σωστή δημιουργία εικόνας πρέπει να λυθεί το πρόβλημα της παρεμπόδισης 7
Εισαγωγή 1 ο βήμα: εφαρμογή σε 2 διαστάσεις αργότερα γενίκευση των αλγορίθμων σε 3D χρήση σε 2D πακέτα, αντιτάυτιση, παράλληλη επεξεργασία, κ.α. αντικείμενο αποκοπής: ορθογώνιο παραλληλόγραμμο «παράθυρο αποκοπής» «περιοχή σχεδίασης»... 8
Εισαγωγή before clipping after clipping 9
Σημειακή Αποκοπή Εξετάζουμε αν το σημείο P(x,y) βρίσκεται εντός ή εκτός του παραθύρου. Ορισμός παραθύρου: Α(x min,y min ) C(x max,y max ) Σε κάθε άλλη περίπτωση, το P(x,y) είναι εκτός και αποκόπτεται! Εντός, αν: x min x x max και y min y y max. 10
Σημειακή Αποκοπή Τετριμμένη: Έλεγχος αν το σημείο (x,y) είναι εντός του αντικειμένου αποκοπής. Αν το αντικείμενο αποκοπής είναι ορθογώνιο παραλληλόγραμμο: εκμετάλλευση των διαγώνιων κορυφών: (x min,y min ), (x max,y max ) 11
Αποκοπή Ευθ. Τμημάτων - Line clipping Ευθύγραμμο τμήμα που ορίζεται από 2 σημεία: P 1 (x 1,y 1 ) και P 2 (x 2,y 2 ). Σημείο P(x,y) του επιπέδου. P(x,y) P 2 (x 2,y 2 ) Περιοχή σχεδίασης P 1 (x 1,y 1 ) 12
Line Clipping Τι συμβαίνει όταν το ένα ή και τα δύο άκρα ενός γραμμικού τμήματος δεν είναι εντός της καθορισμένης περιοχής σχεδίασης? Περιοχή σχεδίασης 13
Line Clipping Στρατηγικές αποκοπής (clipping): a) Έλεγξε (επαναληπτικά) αν κάθε σημείο του ευθύγραμμου τμήματος είναι εντός Δουλεύει, αλλά...αργά! if (x x min and x x max and y y min and y y max ) drawpoint(x,y,c); b) Βρες τομή της γραμμής με το όριο/σύνορο Πιο αποδοτικό. Clip line to intersection 14
Line Clipping Θεωρούμε την αναπαράσταση: x = x1 + u (x 2 x 1 ) y = y 1 + u ( y 2 y1), 0 u 1 Αν η τιμή του u για μια τομή με κάποιο όριο (ακμή) του ορθογωνίου είναι εκτός του [0,1], τότε το ευθύγραμμο τμήμα δεν τέμνει το όριο. Αν η τιμή του u είναι εντός του [0,1], τότε το ευθύγραμμο τμήμα τέμνει το όριο αυτό. 15
Line Clipping - Παράδειγμα Βρίσκουμε το u αντικαθιστώντας: x = x max στο x = x 1 + u (x 2 x 1 ) 5 = 4 + u (7 4) u = 1/3 Η τιμή του u είναι εντός του [0,1], οπότε το ευθύγραμμο τμήμα τέμνει το όριο x = x max. Βρίσκουμε το y αντικαθιστώντας το u στην: y=y 1 +u(y 2 y 1 ) y = 2 + 1/3 (3 2) = 2.33 Άρα το σημείο τομής στο x max είναι το: (5, 2.33) 16
Line Clipping: Πιθανές περιπτώσεις 1. Και τα δύο τελικά σημεία βρίσκονται εντός της περιοχής (γραμμή AB) Δεν χρειάζεται clipping 2. 1 τελικό σημείο εντός, 1 εκτός (γραμμή CD) Αποκοπή στο σημείο τομής 3. Και τα δύο σημεία εκτός περιοχής: a. Καμία τομή (γραμμές EF, GH) b. Γραμμή τέμνει την περιοχή (γραμμή IJ) Αποκοπή γραμμής και στα δύο σημεία τομής F J I A C B E G H D 17
Αλγόριθμος Μέσου 18
Line Clipping: Αλγόριθμος Μέσου Χαρακτηριστικά: Διαδοχική διάσπαση ευθυγράμμου τμήματος στη μέση (ολίσθηση) Χρήση «φθηνών» ελέγχων εντός / εκτός Κωδικοποίηση 9 περιοχών του επιπέδου Τέλος, αν P 1 P 2 < pixel! 19
Αλγόριθμος Μέσου (midpoint subdivision) Σε κάθε σημείο P(x,y) του επιπέδου αντιστοιχούμε 2 παραμέτρους ΙΧ και ΙΥ με πιθανές τιμές: ΙΧ = -1, 0, +1 ΙΥ = -1, 0, +1 P 1 :ΙΧ1, ΙΥ1 P 2 :ΙΧ2, ΙΥ2 20
Αλγόριθμος Μέσου (midpoint subdivision) /* Θεωρώντας ότι έχουμε ορίσει τη δομή: */ typedef struct {float x, y} point; midpoint (P1, P2, xmin, xmax, ymin, ymax) point P1, P2; float xmin, xmax, ymin, ymax; { point M; /* Υπολογισμός ΙΧ1, ΙΥ1, ΙΧ2, ΙΥ2 */ if ((IX1==0)&&(IY1==0)&&(IX2==0)&&(IY2==0)) /* τότε το P1P2 είναι εντός του παραθύρου */ else if ((IX1==IX2)&&(IX1!=0)) ((IY1==IY2)&&(IY1!=0)) /* τότε τo P1P2 είναι εκτός του παραθύρου */ else { M.x = ( P1.x + P2.x) / 2; M.y = ( P1.y + P2.y) / 2; midpoint(p1, M, xmin, xmax, ymin, ymax); midpoint(m, P2, xmin, xmax, ymin, ymax); } } 21
Αλγόριθμος Cohen-Sutherland 22
Line Clipping: Αλγόριθμος Cohen-Sutherland Χαρακτηριστικά: «Φθηνός» έλεγχος για να αποφανθεί αν το τμήμα είναι εξ ολοκλήρου εντός ή εκτός του παραθύρου. αποφυγή δαπανηρού υπολογισμού τομής! Σύγκριση συντεταγμένων ευθύγραμμου τμήματος με x min, x max, y min, y max παραθύρου Κωδικοποίηση 9 περιοχών του επιπέδου 23
Line Clipping: Αλγόριθμος Cohen-Sutherland Αντιστοίχηση κωδικών σε 9 περιοχές του επιπέδου. Αρχικά «φθηνός» έλεγχος για τις απλές περιπτώσεις. π.χ. EF έξω, ΑΒ μέσα. Για τα υπόλοιπα ευθύγραμμα τμήματα, κόψιμο με όριο παραθύρου και αναδρομή. F I E A C G B J H D 24
Line Clipping: Αλγόριθμος Cohen-Sutherland Βασικός αλγόριθμος: Αποδοχή γραμμών που έχουν και τα δύο τελικά σημεία εντός της περιοχής. Απόρριψη γραμμών που έχουν και τα δύο τελικά σημεία μικρότερα από x min ή y min ή μεγαλύτερα από x max ή y max Αποκοπή των υπόλοιπων γραμμών σε ένα όριο της περιοχής και επανάληψη των προηγούμενων βημάτων στα 2 νέα (αποκομμένα) τμήματα. F I E A Trivially reject C Trivially accept G B J H D Clip and retest 25
Cohen-Sutherland: Accept/Reject Tests Θέτουμε έναν 4-bit κωδικό σε κάθε τελικό σημείο σύμφωνα με τη θέση του: 1001 1000 1010 4 th bit (1000): αν y > y max 3 rd bit (0100): αν y < y min 2 nd bit (0010): αν x > x max 1 st bit (0001): αν x < x min 0001 0000 0010 Bit 4 Bit 3 Bit 2 Bit 1 πάνω κάτω δεξιά αριστερά 0101 0100 0110 Ο κώδικας κάθε περιοχής καθορίζεται από τη θέση της σχετικά με τα ημιεπίπεδα των ακμών του παραθύρου. bit = 1, αν η περιοχή βρίσκεται στο ημιεπίπεδο της ακμής που δεν περιέχει το παράθυρο. 26
Cohen-Sutherland: Accept/Reject Tests Για κάθε άκρο ενός ευθύγρ. τμήματος, βρίσκουμε τον κώδικα της περιοχής που βρίσκεται: 4 ο bit: πρόσημο y max - y 3 ο bit: πρόσημο y - y min 2 ο bit: πρόσημο x max - x 1 ο bit: πρόσημο x - x min (Αν το πρόσημο είναι αρνητικό το bit τίθεται 1, αλλιώς 0) 1001 1000 1010 0001 0000 0010 0101 0100 0110 c 1 : κώδικας (outcode) 1 ου άκρου c 2 : κώδικας 2 ου άκρου Bit 4 Bit 3 Bit 2 Bit 1 πάνω κάτω δεξιά αριστερά 27
Cohen-Sutherland: Accept/Reject Tests 1 ο βήμα αποκοπής: if (c 1 c 2 ) = 0000 inside window accept (draw) else if (c 1 && c 2 ) 0000 outside window reject (don t draw) else clip and retest 1001 1000 1010 0001 0000 0010 0101 0100 0110 Λογικό OR (bitwise operations): 0 or 0 = 0 0 or 1 = 1 1 or 0 = 1 1 or 1 = 1 Π.χ.: 1010 or 1100 = 1110 Λογικό AND (bitwise operations): 0 AND 0 = 0 0 AND 1 = 0 1 AND 0 = 0 1 AND 1 = 1 Π.χ.: 1010 or 1100 = 1000 28
Cohen-Sutherland Accept/Reject Accept/reject/redo βασίζονται σε bit-wise boolean ops. 1001 1000 1010 0001 0000 0010 0101 0100 0110 29
Αλγόριθμος Cohen-Sutherland Παράδειγμα: κώδικες c 1,c 2 για τα κάτωθι P 1 P 2 : A: 0001 B: 0101 C: 0000 D: 0000 E: 0100 F: 0010 G: 0001 H: 1010 Άρα: ΑΒ εκτός, αφού: 0001 && 0101 0000 CD εντός, αφού: 0000 0000 = 0000 EF και GH??? 30
Αλγόριθμος Cohen-Sutherland Προσδιορισμός σημείου τομής: Συγκρίνουμε τους κώδικες των άκρων του ευθύγραμμου τμήματος Επιλέγουμε την ευθεία μιας ακμής του παραθύρου που αντιστοιχεί σε ένα bit για το οποίο οι 2 κώδικες έχουν διαφορετικές τιμές Bit 4 Bit 3 Bit 2 Bit 1 πάνω κάτω δεξιά αριστερά Υπολογίζουμε το σημείο τομής του P 1 P 2 με την επιλεγμένη ευθεία Καλούμε τον αλγόριθμο αναδρομικά για το ευθύγραμμο τμήμα του οποίου το ένα άκρο είναι το σημείο τομής και το άλλο άκρο είναι το άκρο του αρχικού P 1 P 2 του οποίου ο κώδικας έχει 0 στο bit που αντιστοιχεί η επιλεχθείσα ευθεία αποκοπής. 31
Αλγόριθμος Cohen-Sutherland Παράδειγμα: EF κώδικες: E: 0100, F: 0010 ευθεία y = y min Υπολογίζουμε το σημείο τομής I με την επιλεγμένη ευθεία Καλούμε τον αλγόριθμο αναδρομικά για το ευθύγραμμο τμήμα FI. (γιατί το bit3 του κωδικού του F έχει τιμή 0) Bit 4 Bit 3 Bit 2 Bit 1 πάνω κάτω δεξιά αριστερά 32
Αλγόριθμος Cohen-Sutherland Παράδειγμα: GH κώδικες: G: 0001, H: 1010 ευθεία y = y max Υπολογίζουμε το σημείο τομής K με την επιλεγμένη ευθεία Καλούμε τον αλγόριθμο αναδρομικά για το ευθύγραμμο τμήμα GK. (γιατί το bit4 του κωδικού του G έχει τιμή 0) Υπολογίζουμε το σημείο τομής J Bit 4 Bit 3 Bit 2 Bit 1 πάνω κάτω δεξιά αριστερά 33
Παράδειγμα Cohen-Sutherland Γραμμή AD A: 0000 outcode D: 1001 outcode Λογικό AND των outcodes:0 => η γραμμή δεν μπορεί να απορριφθεί απευθείας Λογικό OR των outcodes: NOT 0 => η γραμμή δεν μπορεί να παραμείνει απευθείας. 1 διαφορετικό bit: 4 ο => y=y max και χρήση Β ως σημείου αναδρομικού υπολογισμού. Επιλογή του A ως αρχικού σημείου (το outcode του περιέχει 0 στο bit 4) Υπολογισμός outcode Β: 0000. Στην επόμενη επανάληψη: το AB παραμένει απευθείας (0000 0000) και απεικονίζεται. Bit 4 Bit 3 Bit 2 Bit 1 πάνω κάτω δεξιά αριστερά 34
Αλγόριθμος Cohen-Sutherland void CS(P1, P2, xmin, xmax, ymin, ymax) point P1, P2; float xmin, xmax, ymin, ymax; { int c1, c2; point I; C1 = code(p1); /* Εύρεση κώδικα P1*/ C2 = code(p2); /* Εύρεση κώδικα P2*/ if ((c1 c2)==0) /* Το P1P2 είναι εντός παραθύρου */ else if ((c1&&c2)!=0) // Το P1P2 είναι εκτός παραθύρου else { intersect (P1,P2,I,xmin,xmax,ymin,ymax); if exoteriko(p1) CS(I, P2, xmin, xmax, ymin, ymax); else CS(P1, I, xmin, xmax, ymin, ymax); } } 35
Αλγόριθμος Cohen-Sutherland Προσδιορισμός σημείου τομής: Έστω ευθύγραμμο τμήμα: (x 1,y 1 ),(x 2,y 2 ) με m = (y 2 y 1 )/(x 2 -x 1 ) Η τομή με κάθετο όριο x=x min ή x=x max υπολογίζεται ως: y = y 1 + m(x-x 1 ) Η τομή με οριζόντιο όριο y=y min ή y=y max υπολογίζεται ως: x = x 1 + (y-y 1 )/m 36
Ερωτήσεις - Απορίες 37