ΓΡΑΦΙΚΑ Γέμισμα
ΑΛΓΟΡΙΘΜΟΙ ΓΕΜΙΣΜΑΤΟΣ Για τις πλεγματικές οθόνες υπάρχουν: Αλγόριθμοι γεμίσματος:, που στηρίζονται στη συνάφεια των pixels του εσωτερικού ενός πολυγώνου Αλγόριθμοι σάρωσης: που στηρίζονται στη γεωμετρική περιγραφή της περιμέτρου ενός πολυγώνου
Τύποι πολυγώνων Κυρτά πολύγωνα: Αν μια ευθεία τέμνει δύο μόνον πλευρές της περιμέτρου
Τύποι πολυγώνων Αμφίκυρτα πολύγωνα: Αν μια ευθεία τέμνει περισσότερες από δύο πλευρές της περιμέτρου
Τύποι πολυγώνων Σύνθετα πολύγωνα: Αμφίκυρτα που δύο πλευρές του τέμνονται μεταξύ τους
Αλγόριθμοι γέμισματος Έστω ότι έχουμε ένα pixel (x, y), το οποίο βρίσκεται μέσα στην περιοχή που θέλουμε να γεμίσουμε με χρώμα. Με βάση τη συνάφεια εξετάζονται τα γειτονικά pixels και γεμίζουν με το ζητούμενο χρώμα.
Αλγόριθμοι γέμισματος Η διαδικασία επαναλαμβάνεται τροφοδοτώντας τον αλγόριθμο με τα γειτονικά pixel σαν αρχικά, οπότε ο αλγόριθμος εξετάζει τους γείτονες των γειτόνων του πρώτου και τα γεμίζει με χρώμα ή όχι κ.ο.κ. X, Y
Αλγόριθμοι γέμισματος Συνάφεια των pixels: Η περιοχή με τα πλησιέστερα γειτονικά pixels, ενός συγκεκριμένου pixel (x,y), τέσσερα pixels (x+1, y), (x-1, y), (x, y+1) & (x, y-1) X, Y+1 X, Y X, Y-1
Αλγόριθμοι γέμισματος οκτώ pixels (x+1, y), (x-1, y), (x, y+1), (x, y-1), (x-1, y-1), (x+1, y+1), (x+1, y-1) & (x-1, y+1). X, Y+1 X, Y X, Y-1
Αλγόριθμοι γέμισματος Με βάση την περίμετρο απότοαρχικόσημείο(x, y) χρωματίζουμε τα εσωτερικά σημεία του πολυγώνου εκμεταλλευόμενοι τη συνάφεια των γειτονικών σημείων. η αναδρομή διακόπτεται όταν φτάσουμε σε ένα pixel που έχει το χρώμα της περιμέτρου.
Αλγόριθμοι γέμισματος Με βάση το υπάρχον χρώμα απότοαρχικόσημείο(x, y) χρωματίζουμε τα εσωτερικά σημεία του πολυγώνου εκμεταλλευόμενοι τη συνάφεια των 4 ή 8 πλησιέστερων γειτονικών σημείων. η αναδρομή διακόπτεται όταν φτάσουμε σε ένα pixel που δεν έχει το υπάρχον εσωτερικό χρώμα
Γέμισμα με βάση την περίμετρο (boundary fill) Στον αλγόριθμο αυτόν δίδονται: ένα εσωτερικό σημείο εκκίνησης (x, y) του πολυγώνου, το χρώμα της περιμέτρου το χρώμα με το οποίο θέλουμε να χρωματίσουμε το πολύγωνο.
Γέμισμα με βάση το υπάρχον χρώμα (interior fill) Στον αλγόριθμο αυτόν δίδονται: ένα εσωτερικό σημείο εκκίνησης (x, y) του πολυγώνου, το υπάρχον εσωτερικό χρώμα του πολυγώνου το χρώμα με το οποίο θέλουμε να χρωματίσουμε το πολύγωνο.
Παρατηρήσεις Οι παραπάνω αλγόριθμοι γεμίσματος (με βάση την περίμετρο & το υπάρχον χρώμα) έχουν το μειονέκτημα ότι για κάθε pixel που χρωματίζεται γίνονται 4 ή 8 αναδρομικές κλήσεις με συνέπεια να έχουν χαμηλή ταχύτητα να εξαντλείται γρήγορα ο χώρος της στοίβας
Αλγόριθμοι σάρωσης (scan line) Οι αλγόριθμοι σάρωσης στηρίζονται στην εύρεση των σημείων τομής της περιμέτρου του πολυγώνου με τις οριζόντιες γραμμές σάρωσης της οθόνης.
Αλγόριθμοι σάρωσης Λαμβάνονται υπόψη: Ηκλίσηm των πλευρών, για τον υπολογισμό των σημείων τομής τους με τις γραμμές σάρωσης. Η συνάφεια των pixels του πολυγώνου. Οι τομές που βρίσκονται μεταξύ της ελάχιστης και της μέγιστης y-συντεταγμένης του πολυγώνου.
Παράδειγμα Ι Εστω ΑΒΓ ΕΖ ένα αμφίκυρτο πολύγωνο με κορυφές Α(0, 1), Β(2, 8), Γ(4, 6), (7, 8), Ε(9, 4), Ζ(6, 1) και πλευρές e1, e2, e3, e4, e5, e6
Παράδειγμα Ι (συνέχεια) Υποθέτουμε ότι σαρώνουμε με μια γραμμή (σάρωσης) y βρίσκουμε τις τομές της y με τις πλευρές του πολυγώνου & ενεργοποιούμε διαδοχικά τα ενδιάμεσα pixels από αριστερά προς τα δεξιά της γραμμής σάρωσης
Παράδειγμα Ι (συνέχεια) Σαρώνουμε την ευθεία y = 5 Αυτή τέμνει την e1 στο x = 1.14 & την e4 στο x = 8.5 Τα pixels 1-7 στην ευθεία σάρωσης y = 5 ενεργοποιούνται
Παράδειγμα Ι (συνέχεια) Οι κορυφές Γ και Ε βρίσκονται πάνω στις γραμμές σάρωσης y=6 & y=4, αντίστοιχα, ενώ η e6 ταυτίζεται με την y = 1 Το ερώτημα εδώ είναι: Πόσα σημεία τομής θα θεωρούμε για κάθε τέτοια κορυφή του πολυγώνου;
Παράδειγμα Ι (συνέχεια)
Παράδειγμα Ι (συνέχεια) υποθέσεις: Αν οι δύο μη οριζόντιες πλευρές βρίσκονται πάνω ή κάτω από τη γραμμή σάρωσης τότε φυλάσσονται καιοιδύοτομές Αν οι δύο μη οριζόντιες πλευρές βρίσκονται εκατέρωθεν τότε φυλάσσεται η τομή της γραμμής σάρωσης με το κάτω άκρο της τρέχουσας πλευράς, ενώ η τομή της με το άνω άκρο της επόμενης δεν φυλάσσεται (διατρέχοντας την περίμετρο κατά την φορά των δεικτών του ρολογιού). Οι οριζόντιες πλευρές αγνοούνται
Παράδειγμα Ι (συνέχεια) Ευθεία σάρωσης y = 6 στην κορυφή Γ, οι πλευρές e2 και e3 βρίσκονται πάνω από την ευθεία σάρωσης: φυλάσσονται δύο τομές Ευθεία σάρωσης y = 4 στην κορυφή Ε, οι πλευρές e4 και e5 βρίσκονται εκατέρωθεν της ευθείας σάρωσης: φυλάσσεται μια τομή Η e6 πρέπει να αγνοηθεί
Παράδειγμα Ι (συνέχεια) Για να προσδιορίσουμε τα υπόλοιπα σημεία τομής πρέπει: να γνωρίζουμε πού βρίσκονται οι πλευρές e1, e2, (μεταξύ ποιων γραμμών σάρωσης) και τις συντεταγμένες των σημείων τομής
Παράδειγμα Ι (συνέχεια) Οσον αφορά τις πλευρές, η ευθεία e1 αρχίζει από την ευθεία σάρωσης 1 και φτάνει ως την ευθεία σάρωσης 8, η πλευρά e2 αρχίζει από την ευθεία σάρωσης 8 και φτάνει ως την ευθεία σάρωσης 6 κτλ.
Υπολογισμός συντεταγμένων x Όσον αφορά τις συντεταγμένες αυτές δίνονται από τις σχέσεις X k+1 = X k + 1/m Y k+1 = Y k + 1 όπου m = (Y k+1 Y k ) / (X k+1 X k ). Αν η τομή της e1 με την ευθεία σάρωσης y=1 είναι γνωστή, τότε ητομήτηςμετηνευθεία σάρωσης y=2 είναι (αναδρομικά): x k+1 = x k + 1/m (m: ηκλίσητηςευθείας) Π.χ.: x 2 = 0 + 2/7 = 2/7 & y 2 = 2
Υπολογισμός συντεταγμένων x Γενικά: αν x ο είναι η τιμή της συντεταγμένης x στην τομή της άκρης (αρχής) της πλευράς (με κλίση m) με μια γραμμή σάρωσης, τότε μπορούμε να υπολογίσουμε την x κ στην τομή με την γραμμή σάρωσης y κ ως εξής : x κ = x ο +κ/m
Υπολογισμός συντεταγμένων x Oι ενδιάμεσες στρογγυλοποιήσεις είναι πιθανόν να προκαλέσουν μια σωρευτική απόκλιση. Προκειμένου η αύξηση των τιμών του x κατά 1/m x k+1 = x k + 1/m = x k + x/ y όπου τα x και y είναι οι διαφορές των τιμών των συντεταγμένων x και y αντίστοιχα μεταξύ των άκρων να μπορεί να γίνει με πράξεις άθροισης αντί διαίρεσης και στρογγυλοποίησης
Υπολογισμός συντεταγμένων x Eκτίμηση για την ακέραιη τιμή της συντεταγμένης x: εισάγουμε στη θέση του x/ y μια ακέραιη μεταβλητή δ, x κ+1 = x κ + δ όπου ανάλογα με το προοδευτικό άθροισμα π, έχουμε δ = 0 ή δ 1 αρχικά δ = 0 & π = 0 αυξάνουμε το π κατά x κάθε φορά που αλλάζουμε γραμμή σάρωσης, οπότε: αν η νέα τιμή του π γίνει ίση ή μεγαλύτερη του y τότε, αυξάνουμε/μειώνουμε το δ κατά 1 και μειώνουμε αντίστοιχα το π κατά y, τόσες φορές μέχρι το π να γίνει μικρότερο του y, οπότε προσθέτουμε το δ στην τρέχουσα τιμή του x και θέτουμε δ = 0 μπορεί να γίνει κι αλλιώς;
Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα Πλευρών 1.Αποτύπωση συνόρου πολυγώνου σύμφωνα με τις ελάχιστες y-τιμές των τομών των πλευρών Πίνακας Πλευρών (ΠΠ) περιέχει όλες τις πληροφορίες που είναι απαραίτητες για την μετέπειτα επεξεργασία των τομών τους με τις γραμμές σάρωσης. «κόψιμο» ορισμένων πλευρών: για κάθε τέτοια πλευρά μειώνουμε κατά μια μονάδα την τιμή της συντεταγμένης y του άνω άκρου της. Κάθε στοιχείο του πίνακα περιέχει: την μέγιστη τιμή του y για την πλευρά αυτή (y max ), την τιμή της συντεταγμένης x της τομής της κατώτερης κορυφής της πλευράς με μια γραμμή σάρωσης (x min ), την αντίστροφη κλίση της πλευράς (1/m) Πλευρά Xmin Ymax Dx Dy 1/m 1 0 8 2 7 2/7 2 4 8-2 2-1 3 4 8 3 2 3/2 4 9 8-2 4-1/2 5 6 3 2 2 1
Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα ΠΛευρών 1.Αποτύπωση συνόρου πολυγώνου Πίνακας Πλευρών (ΠΠ) Πλευρά Xmin Ymax Dx Dy 1/m 1 0 8 2 7 2/7 2 4 8-2 2-1 3 4 8 3 2 3/2 4 9 8-2 4-1/2 5 6 3 2 2 1
Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα ΠΛευρών 2.Ταξινόμηση πλευρών πολυγώνου ως προς ελάχιστες y-τιμές τομών των πλευρών Ταξινομημένη Λίστα Πλευρών (ΤΛΠ) για κάθε γραμμή σάρωσης, αποθηκεύονται οι πλευρές που τέμνονται, διατεταγμένες από αριστερά προς τα δεξιά (φορά των δεικτών του ρολογιού) Υλοποίηση της ΤΛΠ: δομή πίνακα (στατική δομή δεδομένων): άσκοπη κατανάλωση χώρου μνήμης, λόγω ποικίλλου αριθμού τομών δυναμική δομή διασυνδεδεμένων λιστών (linked lists): για κάθε ελάχιστη τιμή της συντεταγμένης y μιας πλευράς δημιουργείται ένα μπλοκ (bucket) πληροφορίας, όπου αποθηκεύονται οι τιμές των x min, y max, 1/m. y i x min y max 1/m x min y max 1/m x min y max 1/m x min y max 1/m
Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα ΠΛευρών 2.Ταξινόμηση πλευρών πολυγώνου 9 Ταξινομημένη Λίστα Πλευρών (ΤΛΠ) 8 7 6 4 8-1 4 8 3/2 5 4 9 8-1/2 3 2 1 0 8 2/7 6 3 1 0
Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα ΠΛευρών 3. Υπολογισμός pixels προς ενεργοποίηση με βάση την ΤΛΠ και για κάθε γραμμή σάρωσης y i : ενημερώνουμε τη Λίστα Ενεργών Πλευρών (ΛΕΠ), όπου τοποθετούμε τα αντίστοιχα buckets ταξινομημένα κατά αύξουσα σειρά των συντεταγμένων x των σημείων τομών. για κάθε ζεύγος τιμών του x στις τομές, ενεργοποιούμε τα pixels ξεκινώντας από την αριστερότερη τιμή του x και σταματώντας μια θέση πριν από την δεξιότερη τιμή του x. υπολογίζουμε την τιμή του συντεταγμένων x των στοιχείων της ΛΕΠ για την επόμενη γραμμή σάρωσης (αρχική τιμή τιμή x 0 = x min ) αφαιρούμε από τη ΛΕΠ τα buckets των οποίων y max = y i
Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα ΠΛευρών 3. Υπολογισμός pixels προς ενεργοποίηση Λίστα Ενεργών Πλευρών (ΛΕΠ) για τη γραμμή σάρωσης 1 1 0 8 2/7 6 3 1 Οπότε, ενεργοποιούνται τα pixels (0,1), (1,1), (2,1), (3,1), (4,1), (5,1)
Παράδειγμα Ι (συνέχεια) Για την επόμενη γραμμή σάρωσης, y=2 2 0 8 2/7 7 3 1 ενεργοποιούνται τα pixels (0,2), (1,2), (2,2), (3,2), (4,2), (5,2), (6,2)
Τα βασικά βήματα του αλγορίθμου Βήμα 1: Καταστρώνεται ο Πίνακας Πλευρών (ΠΠ), με πιθανό κόψιμο ορισμένων πλευρών. Βήμα 2: ημιουργείται η Ταξινομημένη Λίστα Πλευρών (ΤΛΠ) του πολυγώνου.
Τα βασικά βήματα του αλγορίθμου Βήμα 3: Για κάθε γραμμή σάρωσης y (ξεκινώντας από y = 0) επαναλαμβάνεται η ακόλουθη διαδικασία: Βήμα 3.1 Ενημερώνεται η Λίστα Ενεργών Πλευρών (ΛΕΠ) με βάση τη ΤΛΠ και τις τιμές των συντεταγμένων x γιατασημείατομής(x 0 = x min ). Βήμα 3.2 Ταξινομoύνται κατά αύξουσα σειρά οι τιμές των συντεταγμένων x των σημείων τομής Βήμα 3.3 Για κάθε ζεύγος τιμών x στις τομές ενεργοποιούνται τα ενδιάμεσα pixels ξεκινώντας από την αριστερότερη τιμή του x και σταματώντας μια θέση πριν από την δεξιότερη τιμή του x. Βήμα 3.4 Υπολογίζεται η τιμή x της τομής κάθε πλευράς με την επόμενη γραμμή σάρωσης. Βήμα 3.5 Αφαιρούνται από τη ΛΕΠ οι πλευρές των οποίων η τιμή y max είναι ίση με τη γραμμή σάρωσης.
Παρατηρήσεις Πλεονέκτημα: περιορίζει τις αναδρομικές κλίσεις Μειονεκτήματα: «κόψιμο» πλευρών επιλογή κατεύθυνσης της σάρωσης χρήση του y max για τον έλεγχο της διαδικασίας δεν γεμίζει σωστά σύνθετα πολύγωνα
Βελτιωμένος Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα Πλευρών 1.Αποτύπωση συνόρου πολυγώνου Πίνακας Πλευρών (ΠΠ) χωρίς «κόψιμο» οι οριζόντιες γραμμές αγνοούνται Πλευρά Xmin x y 1/m 1 0 2 7 2/7 2 4-2 2-1 3 4 3 2 3/2 4 9-2 4-1/2 5 6 3 3 1
Βελτιωμένος Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα ΠΛευρών 2.Ταξινόμηση πλευρών πολυγώνου ως προς ελάχιστες y-τιμές τομών των πλευρών Ταξινομημένη Λίστα Πλευρών (ΤΛΠ) για κάθε γραμμή σάρωσης, αποθηκεύονται οι πλευρές που τέμνονται, διατεταγμένες από αριστερά προς τα δεξιά (φορά των δεικτών του ρολογιού) Υλοποίηση της ΤΛΠ: διασυνδεδεμένες λίστες (linked lists): για κάθε τιμή του x της τομής της γραμμής σάρωσης με μια πλευρά δημιουργείται ένα μπλοκ (bucket) πληροφορίας, όπου αποθηκεύονται οι τιμές των x min (τιμή συντεταγμένης x του σημείου τομής με τη γραμμή σάρωσης) y (για το υπόλοιπο της πλευράς μετά το y της γραμμής σάρωσης και μέχρι το y max ) 1/m ( x/ y) y i x min Δy 1/m x min Δy 1/m x min Δy 1/m x min Δy 1/m
Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα ΠΛευρών 3. Υπολογισμός pixels προς ενεργοποίηση με βάση την ΤΛΠ και για κάθε γραμμή σάρωσης y i : ενημερώνουμε τη Λίστα Ενεργών Πλευρών (ΛΕΠ), όπου τοποθετούμε τα αντίστοιχα buckets ταξινομημένα κατά τις τιμές των συντεταγμένων x των σημείων τομών κατά αύξουσα σειρά. για κάθε ζεύγος τιμών του x στις τομές, ενεργοποιούμε τα pixels από την αριστερότερη τιμή του x και σταματώντας μια θέση πριν την δεξιότερη τιμή υπολογίζουμε την τιμή των x και y των στοιχείων της ΛΕΠ για την επόμενη γραμμή σάρωσης: y k+1 = y k 1, μεαρχικήτιμήτο y της πλευράς μειωμένο κατά 1 αφαιρούμε από τη ΛΕΠ τα buckets των οποίων η τιμή y είναι αρνητική
Αλγόριθμος Σάρωσης με Ταξινομημένη Λίστα ΠΛευρών 3. Υπολογισμός pixels προς ενεργοποίηση Λίστα Ενεργών Πλευρών (ΛΕΠ) 8 7 6 2-1 2/7 7-1 -1/2 2-1 -1 7-1 3/2 1 0 2/7 7 0-1/2 3 0-1 5 0 3/2 1 1 2/7 8 1-1/2 4 1-1 4 1 3/2 5 4 3 2 1 1 2 2/7 8 2-1/2 0 3 2/7 9 3-1/2 0 4 2/7 8 0 1 0 5 2/7 7 1 1 0 6 2/7 6 2 1 0
Τα βασικά βήματα του βελτιωμένου αλγορίθμου Βήμα 1: Καταστρώνεται ο Πίνακας Πλευρών (ΠΠ) Βήμα 2: ημιουργείται η Ταξινομημένη Λίστα Πλευρών (ΤΛΠ) του πολυγώνου
Τα βασικά βήματα του βελτιωμένου αλγορίθμου Βήμα 3: Για κάθε γραμμή σάρωσης y (ξεκινώντας από y = 0) επαναλαμβάνεται η ακόλουθη διαδικασία: Βήμα 3.1 Ενημερώνεται η Λίστα Ενεργών Πλευρών (ΛΕΠ) με βάση τη ΤΛΠ και τις τιμές των συντεταγμένων x γιατασημείατομής(x 0 = x min ) και των y των υπολοίπων των πλευρών ( y 0 = y - 1) Βήμα 3.2 Ταξινομoύνται κατά αύξουσα σειρά οι τιμές των συντεταγμένων x των σημείων τομής Βήμα 3.3 Για κάθε ζεύγος τιμών x ενεργοποιούνται τα ενδιάμεσα pixels ξεκινώντας από την αριστερότερη τιμή του x και σταματώντας μια θέση πριν τη δεξιότερη τιμή του x Βήμα 3.4 Για την επόμενη γραμμή σάρωσης υπολογίζονται οι τιμές των x και y για τα σημεία τομής, όπου y κ+1 = y κ 1 Βήμα 3.5 Αφαιρούνται από τη ΛΕΠ οι πλευρές των οποίων η τιμή y είναι αρνητική
Άσκηση Έστω κατά τον υπολογισμό ακέραιων τιμών x τομής των πλευρών: αυξάνεται σε κάθε βήμα το π κατά 2 x και συγκρίνεται με το y, ως εξής: όταν π γίνει μεγαλύτερο από ή ίσο με y, αυξάνουμε το δ κατά 1 και μειώνουμε αντίστοιχα το π κατά 2 y, τόσες φορές μέχρι το π να γίνει μικρότερο του y, οπότε προσθέτουμε το δ στην τρέχουσα τιμή του x και θέτουμε δ = 0. Εφαρμόστε τον παραπάνω τρόπο υπολογισμού στον βελτιωμένο αλγόριθμο σάρωσης. Ποιές διαφοροποιήσεις παρατηρείτε στο τελικό γέμισμα του πολυγώνου;