1 ΤΕΙ Θεσσαλονίκης Τμήμα Πληροφορικής Γραφικά Υπολογιστών: Σχεδίαση γραμμών (Bresenham), Σχεδίασης Κύκλων, Γέμισμα Πολυγώνων Πασχάλης Ράπτης http://aetos.it.teithe.gr/~praptis praptis@it.teithe.gr
2 Περιγραφή Σήμερα θα δούμε: Αλγόριθμος σχεδίασης γραμμών του Bresenham Σύγκριση αλγορίθμων σχεδίασης γραμμών Αλγόριθμοι σχεδίασης κύκλων Μια απλή τεχνική Μέσου σημείου κύκλου (mid-point circle) Αλγόριθμοι γεμίσματος (χρωματισμού) Πολυγώνων (Polygon fill) Σύνοψη των raster αλγορίθμων σχεδίασης
3 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Ο αλγόριθμος Bresenham είναι ένας ακόμη αυξητικός (incremental scan conversion) αλγόριθμος Το κύριο πλεονέκτημα του αλγόριθμου είναι ότι χρησιμοποιεί μόνο υπολογισμούς ακεραίων Ο Jack Bresenham εργάστηκε στην IBM για 27 worked και μετά μπήκε στην εκπαίδευση. Ανέπτυξε τοναλγοριθμο στις αρχές της δεκαετίας τ ο υ 1 9 6 0.
4 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Κινούμενοι στον άξονα x κατά μια μονάδα σε κάθε βήμα επιλέγουμε μεταξύ δυο διαφορετικών y τιμών συντεταγμένων Παράδειγμα, από την 5 θέση (2, 3) πρέπει να (x k +1, y k +1) επιλέξουμε μεταξύ των 4 σημείων (3, 3) και (3, 4) (x k, y k ) 3 2 (x k +1, y k ) 2 3 4 5 Θα διαλέγαμε το σημείο που είναι πιο κοντά στην αρχική γραμμή
5 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Στη (sample) θεση x k +1 οι κάθετες αποκλίσεις από την μαθηματική γραμμή σημειώνονται ως y k+1 y y k d upper d lower d upper και d lower x k +1 Η τιμή της y συντεταγμένης στην μαθηματική γραμμή στο σημείο x k +1 ειναι: y = m( x + 1) + k b
6 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Τα σημεία d upper and d lower υπολογίζονται από: και d d upper = y = m( x + 1) + lower y k = ( y + 1) k k k y k Χρησιμοποιούμε αυτά τα σημεία για να αποφασίσουμε ποιο pixel είναι πιο κοντά στην μαθηματική γραμμή y k b = y + 1 m( x + 1) b
7 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Η απόφαση βασίζεται στην διαφορά μεταξύ των θέσεων των δυο pixel: d lower d upper = 2m( x + 1) 2y + 2b 1 Αντικαθιστούμε το m με y/ x οπού x και y είναι οι διαφορές μεταξύ των δυο άκρων: k y x( dlower dupper ) = x(2 ( xk + 1) 2yk + 2b 1) x = 2 y x 2 x y + 2 y + x(2b 1) k k k = 2 y xk 2 x yk + c
8 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Η παράμετρος απόφασης p k για το kth βήμα σε μια γραμμή δίδεται από: p = x( d d ) k lower = 2 y x k upper 2 x Το πρόσημο της παραμέτρου απόφασης p k είναι το ίδιο με αυτό της d lower d upper Εάν p k είναι αρνητικό, τότε επιλέγουμε το χαμηλότερο pixel, άλλως επιλέγουμε το υψηλότερο pixel y k + c
9 Αλγόριθμος Σχεδίασης Γραμμών του Οι αλλαγές στις συντεταγμένες συμβαίνουν κατά τον άξονα των x με βήματα (ανα pixel) για να γίνονται οι πράξεις με ακεραίους Στο βήμα k+1 η παράμετρος απόφασης δίδεται από: p 2 y x x y c k + 1 = k + 1 2 k + 1 + Αφαιρώντας το p k από το p k+1 έχουμε: p k + 1 pk = 2 y( xk + 1 xk ) 2 x( yk + 1 yk Bresenham )
10 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Αλλά το x k+1 είναι το ίδιο με το x k +1 οπότε: p k + 1 = pk + 2 y 2 x( yk + 1 yk όπου y k+1 - y k είναι 0 ή 1 ανάλογα με το πρόσημο του p k Η πρώτη παράμετρος απόφασης p 0 υπολογίζεται στο σημείο (x 0, y 0 ) δίδεται από: p 0 = 2 y x )
11 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham ΑΛΓΟΡΙΘΜΟΣ (για m < 1.0) 1. Εισάγετε τα σημεία των δυο άκρων, αποθηκεύοντας το αριστερό άκρο στο σημείο (x 0, y 0 ) 2. Σχεδιάσετε το σημείο (x 0, y 0 ) 3. Υπολογίσετε τις σταθερές Δx, Δy, 2Δy, και (2Δy - 2Δx) και την πρώτη τιμή της παραμέτρου απόφασης: p 0 = 2 y x 4. Για κάθε x k στην γραμμή, ξεκινώντας με k = 0, εκτελέστε το παρακάτω τέστ. Εάν p k < 0, το επόμενο σημείο που θα σχεδιασθεί είναι το (x k +1, y k ) και: p = p + k + 1 k 2 y
12 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Διαφορετικά το επόμενο σημείο που θα σχεδιασθεί είναι το σημείο (x k +1, y k +1) and: p 5. Επανελαβε το βημα 4 (Δx 1) φορές = p + 2 y k + 1 k 2 x Προσοχή! Ο παραπάνω αλγόριθμος προϋποθέτει ότι η κλήση των γραμμών είναι μικρότερη του 1 για άλλες κλίσεις χρειάζεται μικρή διόρθωση (ρύθμιση).
13 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham ΑΛΓΟΡΙΘΜΟΣ (για m >= 1.0) 1. Εισάγετε τα σημεία των δυο άκρων, αποθηκεύοντας το αριστερό άκρο στο σημείο (x 0, y 0 ) 2. Σχεδιάσετε το σημείο (x 0, y 0 ) 3. Υπολογίσετε τις σταθερές Δx, Δy, 2Δx, και (2Δx - 2Δy) και την πρώτη τιμή της παραμέτρου απόφασης: p 0 = 2 y x 4. Για κάθε x k στην γραμμή, ξεκινώντας με k = 0, εκτελέστε το παρακάτω τέστ. Εάν p k < 0, το επόμενο σημείο που θα σχεδιασθεί είναι το (x k +1, y k ) και: p = p + k + 1 k 2 y
14 Αλγόριθμος Σχεδίασης Γραμμών του Bresenham Διαφορετικά το επόμενο σημείο που θα σχεδιασθεί είναι το σημείο (x k +1, y k +1) and: p 5. Επανέλαβε το βήμα 4 (Δy 1) φορές = p + 2 y k + 1 k 2 x --
15 Αλγόριθμος Bresenham - Παράδειγμα Να σχεδιάσουμε την γραμμή από το σημείο (20, 10) έως το (30, 18) Υπολογίζουμε όλες τις σταθερές: Δx: 10 Δy: 8 2Δy: 16 2Δy - 2Δx: -4 Υπολογίζουμε την αρχική παράμετρο p 0 (initial decision parameter): p0 = 2Δy Δx = 6
16 Αλγόριθμος Bresenham Παράδειγμα (2) 18 17 16 k p k (x k+1,y k+1 ) 0 1 15 14 13 12 11 10 20 21 22 23 24 25 26 27 28 29 30 2 3 4 5 6 7 8 9
17 Αλγόριθμος Bresenham Παράδειγμα Ακολουθούμε τα βήματα του αλγόριθμου Bresenham για την σχεδίαση γραμμών για μια γραμμή από το σημείο (21,12) ως το σημείο (29,16)
18 Αλγόριθμος Bresenham Παράδειγμα (2) 18 17 16 k p k (x k+1,y k+1 ) 0 1 15 14 13 12 11 10 20 21 22 23 24 25 26 27 28 29 30 2 3 4 5 6 7 8
19 Αλγόριθμος Bresenham - Σύνοψη Πλεονεκτήματα του αλγόριθμου σχεδίασης γραμμών του Bresenham: Γρήγορος αυξητικός αλγόριθμος Χρήση μόνο ακεραίων υπολογισμών
20 Εξίσωση κύκλου: Αλγόριθμος Σχεδίασης Κύκλου (Circle Drawing) 2 2 x + y = r 2 όπου r είναι η ακτίνα του κύκλου. Ένας απλός αλγόριθμος σχεδίασης κύκλου λύνοντας την εξίσωση ως προς y (για κάθε τιμή του x υπολογίζεται η αντίστοιχη τιμή του y) y = ± r 2 x 2
21 Αλγόριθμος Σχεδίασης Κύκλου(2) Για ακτίνα κύκλου r=20 έχουμε: y 20 0 2 2 0 = 2 2 y1 = 20 1 y 20 2 2 2 2 = 20 20 20 2 2 y19 = 20 19 2 2 y20 = 20 20 6 0
22 Αλγόριθμος Σχεδίασης Κύκλου (3) Δεν είναι έξυπνη λύση. Πρώτον, ο κύκλος που προκύπτει έχει μεγάλα κενά όπου η κλήση προσεγγίζει την κάθετο. Δεύτερον, οι υπολογισμοί δεν είναι πολύ αποτελεσματικοί Η πράξη πολ/σμού (τετράγωνο) Η πράξη τετραγωνικής ρίζας αποφύγετε αυτή την πράξη. Χρειαζόμαστε μια πιο αποτελεσματική και ακριβέστερη λύση.
23 Συμμετρία Οκτώ Σημείων (Eight-Way Symetry) Παρατηρούμε ότι οι κύκλοι με τo κέντρο στο σημείο (0, 0) έχει οκτώ μέρη που είναι συμμετρικά, έτσι ο αλγόριθμος σχεδίασης είναι πιο αποτελεσματικός (-x, y) (x, y) (-y, x) (y, x) (-y, -x) R 2 (y, -x) (-x, -y) (x, -y)
24 Αλγόριθμος Κύκλου Μέσου Σημείου (Mid-Point Circle) Υπάρχει ένας αυξητικός αλγόριθμος για την σχεδίαση κύκλων ο αλγόριθμος κύκλου μέσου σημείου του Bresenham (όμοιος με αυτόν για την σχεδίαση γραμμών) Στον αλγόριθμο κύκλου μέσου σημείου χρησιμοποιούμε την συμμετρία οκτώ σημείων. Έτσι υπολογίζουμε μόνο τα σημεία για το 1/8 (top right eighth) του κύκλου, και στην συνέχεια χρησιμοποιούμε την συμμετρία να λάβουμε τα υπόλοιπα σημεία.
25 Αλγόριθμος Κύκλου Μέσου Σημείου (2) Υποθέτουμε ότι έχουμε ήδη σχεδιάσει το σημείο (x k, y k ) (x k, y k ) Το επόμενο σημείο είναι μια επιλογή μεταξύ του σημείου (x k +1, y k ) και (x k +1, y k -1) Θα θέλαμε να διαλέξουμε το σημείο που είναι πιο κοντά στον πραγματικό κύκλο. Πως κάνουμε αυτή την επιλογή; (x k +1, y k ) (x k +1, y k -1)
26 Αλγόριθμος Κύκλου Μέσου Σημείου (3) Ξαναγράφουμε την εξίσωση του κύκλου ως: 2 2 2 f circ ( x, y) x y r Η εξίσωση εκτιμάται ως εξής: f circ < 0, if ( x, y) = 0, if > 0, if = Διαλέγουμε ένα από τα υποψήφια pixels υπολογίζοντας το μέσο σημείο με την συνάρτηση + ( x, y) is inside the circle boundary αν (x,y) είναι μέσα στα όρια του κύκλου ( x, y) is on the circle boundary αν (x,y) είναι στα όρια του κύκλου ( x, y) is outside the circle boundary αν (x,y) είναι έξω από τα όρια του κύκλου
27 Αλγόριθμος Κύκλου Μέσου Σημείου (4) Υποθέτουμε ότι μόλις έχουμε σχεδιάσει το pixel στο (x k,y k ) έτσι πρέπει να διαλέξουμε ανάμεσα στα σημεία (x k +1,y k ) και (x k +1,y k -1) Η μεταβλητή απόφασης p k ορίζεται ως p 1 k = fcirc ( xk + 1, yk ) 2 2 1 2 = ( xk + 1) + ( yk ) r 2 Εάν p k < 0 το μέσο-σημείο είναι μέσα στον κύκλο και το pixel στο y k είναι πιο κοντά στο κύκλο Διαφορετικά το μέσο-σημείο είναι έξω από τον κύκλο και το pixel y k -1 είναι πιο κοντά 2
28 Αλγόριθμος Κύκλου Μέσου Σημείου (5) Για να διασφαλίσουμε ότι ο αλγόριθμος είναι αποτελεσματικός μπορούμε να κάνουμε τους υπολογισμούς μας αυξητικά. Έχουμε: ή: p p k + 1 = f circ = [( x k ( 1 ) x + 1, y k + 1 + 1) + 1] ( ) 2 1 2 y r k + 1 όπου y k+1 είναι είτε y k είτε y k -1 ανάλογα με το πρόσημο p k 2 k + 1 + 2 2 1 = pk + 2( xk + 1) + ( yk + 1 yk ) ( yk + 1 y ) + 1 k + k 2 2
29 Αλγόριθμος Κύκλου Μέσου Σημείου (6) Η πρώτη μεταβλητή απόφασης δίδεται ως: p 0 = = f Εάν p k < 0 τότε η επόμενη μεταβλητή απόφασης δίδεται από: p circ (1, r = 1+ ( r 5 4 p r 1 ) 2 Εάν p k > 0 τότε η μεταβλητή απόφασης είναι: p x 1 ) 2 2 k + 1 = k + 2 k + 1 + 1 = pk + 2xk + 1 + 1 2y + 1 r 1 k + k 2
30 Αλγόριθμος Κύκλου Μέσου Σημείου ΑΛΓΟΡΙΘΜΟΣ Δώσε την ακτίνα r και το κέντρο του κύκλου (x c, y c ) και θέσε τις συντεταγμένες για το πρώτο σημείο στην περιφέρεια ενός κύκλου με κέντρο την αρχή ως: ( x 0, y0) = (0, r Υπολόγισε την αρχική τιμή της παραμέτρου απόφασης ως: p = 5 0 r 4 Ξεκινώντας με k = 0 σε κάθε θέση x k, εκτέλεση το παρακάτω έλεγχο. Εάν p k < 0, το επόμενο σημείο για τον κύκλο με κέντρο στο (0, 0) είναι (x k +1, y k ) και: p k + 1 = pk + 2xk + 1 + ) 1
31 The Mid-Point Circle Algorithm (cont ) αλλιώς το επόμενο σημείο κατά μήκος του κύκλου είναι (x k +1, y k -1) και: p k + 1 = pk + 2 xk + 1 + 1 2yk + 1 4. Καθόρισε τα συμμετρικά σημεία στις άλλες επτά περιοχές 5. Μετακίνησε κάθε υπολογισμένη θέση του pixel (x, y) στο κύκλο με κέντρο (x c, y c ) να σχεδιασθούν οι συντεταγμένες τιμές: x + = x x c y = y + yc 6. Επανέλαβε τα βήματα 3 ως 5 μέχρι x >= y
32 Αλγόριθμος Κύκλου Μέσου Σημείου Παράδειγμα Θα σχεδιάσουμε έναν κύκλο με κέντρο στο (0,0) και ακτίνα 10 χρησιμοποιώντας τον αλγόριθμο του μέσου-σημείου.
33 Αλγόριθμος Κύκλου Μέσου Σημείου Παράδειγμα (2) 10 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 10 k p k (x k+1,y k+1 ) 2x k+1 2y k+1 0 1 2 3 4 5 6
34 Αλγόριθμος Κύκλου Μέσου Σημείου Παράδειγμα Χρησιμοποιώντας τον αλγόριθμο του μέσουσημείου θα σχεδιάσουμε έναν κύκλο με κέντρο στο (0,0) και ακτίνα 16.
35 Αλγόριθμος Κύκλου Μέσου Σημείου Παράδειγμα (2) 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 10 11 12 1314 1516 k p k (x k+1,y k+1 ) 2x k+1 2y k+1 0 1 2 3 4 5 6 7 8 9 10 11 12
36 Αλγόριθμος Κύκλου Μέσου Σημείου Τα κύρια χαρακτηριστικά του αλγόριθμου μέσου σημείου σχεδίασης κύκλου είναι: Η συμμετρία των οκτώ σημείων ελαττώνει πολύ τον χρόνο σχεδίασης ενός κύκλου Κινούμενοι σε μονάδες (unit steps) κατά μήκος του άξονα x σε κάθε σημείο κατά μήκος της γραμμής του κύκλου χρειάζεται να διαλέξουμε μεταξύ δυο πιθανών y συντεταγμένων
37 Το ουσιαστικό που πρέπει να θυμόμαστε είναι ότι ένας αλγόριθμος σχεδίασης πρέπει να είναι αποτελεσματικός (γρήγορος) Για τις γραμμές έχουμε τον αλγόριθμο DDA και τον αλγόριθμο του Bresenham Για τους κύκλους έχουμε τον αλγόριθμο του μέσου σημείου.
38 Πολύγραμμα (Polyline) Πολύγραμμο είναι επίπεδο σχήμα που ορίζεται από συνεχόμενες ευθείες γραμμές. Το διπλανό πολύγραμμο σχηματίζεται από έξι σημεία Α 1 -Α 6 που σχηματίζουν πέντε ευθείες Ε 1 -Ε 5 E1 E2 E3 E4 E5
Πολύγωνα (Polygons) Πολύγωνο είναι ένα επίπεδο σχήμα που ορίζεται από ένα σύνολο τριών ή περισσότερων θέσεων συντεταγμένων που ονομάζονται κορυφές (vertex) και συνδέονται στην σειρά από ευθύγραμμα τμήματα που ονομάζονται ακμές (edges) ή πλευρές του πολυγώνου. Ένα πολύγωνο ορίζει μια κλειστή περιοχή στο επίπεδο
40 Λίστα Κορυφών Πολύγωνα (2) (Polygons) Λίστα Πλευρών γραμμή κορυφή Λίστα Επιφανειών πλευρές
41 Πολύγωνα (2) (Polygons) Πως όμως σχεδιάζουμε πολύγωνα; -- Τα πολύγωνα σχηματίζονται από γραμμές. -- Οι γραμμές σχεδιάζονται με έναν αλγόριθμο (DDA ή Bresenham)
42 Κατηγοριοποίηση Πολυγώνων Εσωτερική γωνία (interior angle) είναι μια γωνία εντός του συνόρου του πολυγώνου που σχηματίζεται από δύο προσκείμενες πλευρές. -- Εάν όλες οι εσωτερικές γωνίες ενός πολυγώνου μικρότερες από 180 ο, τότε το πολύγωνο είναι κυρτό (convex). -- Ένα πολύγωνο που δεν είναι κυρτό είναι κοίλο (concave) Οι αλγόριθμοι γραφικών είναι πιο περίπλοκοι για κοίλα πολύγωνα για αυτό είναι αποδοτικότερο να χωρίζουμε πριν την επεξεργασία ένα κοίλο πολύγωνο σε ένα σύνολο από κυρτά πολύγωνα.
43 Κοίλα Πολύγωνα Αναγνώριση κοίλων πολυγώνων: -- Μια εσωτερική γωνία πολυγώνου μεγαλύτερη από 180 ο -- Προέκταση κάποιων πλευρών τέμνει τις άλλες πλευρές -- Κάποιο ζεύγος εσωτερικών σημείων παράγει ευθύγραμμο τμήμα που τέμνει το σύνορο του πολυγώνου.
44 Διαίρεση Κοίλων Πολυγώνων Διαίρεση κοίλων πολυγώνων: -- Διανυσματική μέθοδο -- Περιστροφική μέθοδο -- Σε σύνολο τριγώνων Σχηματίζουμε τα διανύσματα των πλευρών (vector edges). Υπολογίζουμε το εξωτερικό γινόμενο διαδοχικών (ανά δυο) διανυσμάτων, αν στα αποτέλεσματα υπάρχει > 0 και < 0 τότε το πολύγωνο είναι κοίλο
45 Διαίρεση Κοίλων Πολυγώνων Διανυσματική μέθοδος - Παράδειγμα Πολύγωνο με έξι πλευρές στο επίπεδο xy και z=0 και διανύσματα πλευρών [ Ε 3 =(3,0,0) (2,1,0)=(3-2, 0-1,0) = (1,-1,0) ] Το εξωτερικό γινόμενο (cross product) E j x E k είναι ένα διάνυσμα κάθετο στο επίπεδο xy με τιμή E jx E ky - E kx E jy E 1 x E 2 =E 1x E 2y E 2x E 1y = (1*1 1*0)= 1 E 2 x E 3 =E 2x E 3y E 3x E 2y = (1*(-1) 1*1)= -2
46 Διαίρεση Κοίλων Πολυγώνων Διανυσματική μέθοδος - Παράδειγμα Καθώς μόνο το εξωτερικό γινόμενο E 2 x E 3 έχει z αρνητική τιμή, χωρίζουμε το πολύγωνο κατά μήκος της γραμμής του διανύσματος E 2. Η εξίσωση γραμμής για αυτήν την πλευρά έχει κλίση (slop) m=1 και y-τομή (y-intercept ή b) -1. Στη συνέχεια καθορίζουμε την τομή της γραμμής αυτής με τις άλλες άκρες του πολυγώνου για να το χωρίσουμε σε δύο κομμάτια. Δεν υπάρχει άλλο εξωτερικό γινόμενο με αρνητική τιμή, έτσι τα δυο νέα πολύγωνα είναι και τα δύο κυρτά.
47 Κανόνας μονό-ζυγό (even-odd rule algorithm) Πως μπορούμε να γνωρίζουμε αν ένα συγκεκριμένο σημείο σε ένα επίπεδο βρίσκεται στο εσωτερικό ή στο εξωτερικό μέρος ενός πολυγώνου ή είναι στο όριο ενός πολυγώνου; Ελέγχουμε πόσες φορές μια ακτίνα (ευθεία γραμμή) τέμνει τις ακμές του πολυγώνου, αρχίζοντας από ένα σημείο και προχωρώντας σε οποιαδήποτε σταθερή-ευθεία κατεύθυνση: -- Εάν ο αριθμός των διασταυρώσεων της ακτίνας (ευθείας) με τις ακμές του πολυγώνου είναι περιττός αριθμός τότε το συγκεκριμένο σημείο βρίσκεται μέσα στα όρια του πολυγώνου, εάν είναι ζυγός τότε είναι εκτός. [ΟΚ, όσο το σημείο δεν είναι πάνω στα όρια του πολυγώνου]
48 Πολύγωνα Τύποι πολυγώνων: -- Κυρτά -- Κοίλα -- Αυτοτέμνοντα (self-intercecting) -- Με τρύπες
49 Περιοχή Γεμίσματος (με χρώμα) (Fill area) Μια χρήσιμη δομή (εκτός από τα σημεία, τις γραμμές, και τις καμπύλες) για την περιγραφή μιας εικόνας, είναι μια περιοχή που είναι γεμισμένη (filled area) με κάποιο συμπαγές χρώμα. Χρησιμοποιούνται για περιγράψουν επιφάνειες στερεών αντικειμένων. Οι περιοχές γεμίσματος είναι συνήθως επίπεδες, κυρίως πολύγωνα. Οι βιβλιοθήκες γραφικών απαιτούν μια περιοχή γεμίσματος να ορίζεται ως ένα πολύγωνο.
50 Αλγόριθμος με γραμμές σάρωσης (Scan-Line Polygon Fill Algorithm) Η απλούστερη περιοχή για να γεμίσει (χρωματισθεί) είναι ένα πολύγωνο, επειδή κάθε σημείο τομής της γραμμή σάρωσης με τα όρια ενός πολύγωνου βρίσκεται-υπολογίζεται με την επίλυση δύο γραμμικών εξισώσεων, όπου η εξίσωση για την γραμμή σάρωσης είναι απλά y = σταθερά. Εσωτερικά pixels κατά μήκος της γραμμής σάρωσης που περνά μέσα από μια περιοχή γεμίσματος.
51 Αλγόριθμος με γραμμές σάρωσης (Scan-Line Polygon Fill Algorithm) Ο βασικός αλγόριθμος σάρωσης γραμμών είναι: -- Βρές τις τομές της γραμμής σάρωσης με όλες τις πλευρές του πολυγώνου -- Ταξινόμησε τις τομές αυξάνοντας την x συντεταγμένη -- Γέμισε όλα τα pixels μεταξύ δύο (ένα ζευγάρι) τομών που βρίσκονται μέσα στο πολύγωνο, κάνοντας χρήση του κανόνα μονού-ζυγού για να καθορίσεις εάν ένα σημείο είναι μέσα στην περιοχή. Το pixel μονό πλήθος τομών χρωματίζεται. -- Αν το σημείο τομής είναι κορυφή αλλάζει ο κανόνας μονό-ζυγό αλλάζει. περιττός περιττός ζυγός ζυγός
52 Αλγόριθμος με γραμμές σάρωσης Παράδειγμα Το γέμισμα εφαρμόζεται στα 5 pixels από x=2 έως x=6 και ζυγός ζυγός στα 4 pixels από x=12 έως x=15 περιττός περιττός ζυγός
53 Αλγόριθμος με γραμμές σάρωσης (Scan-Line Polygon Fill Algorithm) Ειδικές περιπτώσεις στο γέμισμα πολυγώνου με τον αλγόριθμο σάρωσης γραμμής : -- Όταν μια πλευρά του πολυγώνου είναι παράλληλη με την γραμμή σάρωσης. -- Όταν μια γραμμή σάρωσης περνά μέσα από μια κορυφή, κόβει δύο πλευρές του πολυγώνου σε εκείνο το σημείο
54 Scan-Line Polygon Fill Algorithm Παράδειγμα
55 Αλγόριθμος γεμίσματος συνόρων (Boundary-Fill Algorithm) Μια εναλλακτική προσέγγιση για την γέμισμα μιας περιοχής είναι η εξής: Να γίνει η αρχή από ένα σημείο μέσα στην περιοχή και να «χρωματισθεί» το εσωτερικό, προχωρώντας σημείο προς σημείο και φθάνοντας μέχρι τα όρια του πολυγώνου.
56 Αλγόριθμος γεμίσματος συνόρων (Boundary-Fill Algorithm) Υπάρχουν δύο μέθοδοι για την επεξεργασία γειτονικών pixels ενός σημείου: 1. Τέσσερα γειτονικά σημεία - Αυτές οι θέσεις των pixels είναι αριστερά, δεξιά, πάνω και κάτω από το τρέχον σημείο. - Οι περιοχές που γεμίζουν με αυτήν την μέθοδο ονομάζονται συνδεδεμένες κατά 4. Τρέχον σημείο (x,y) (x,y+1) (x-1,y) (x+1,y) (x,y-1)
57 Αλγόριθμος γεμίσματος συνόρων (Boundary-Fill Algorithm) void Four_Fill (int x, int y, int fill_col, int bound_col) { int curr_color; curr_color = get_color(x, y); if (curr_color!= bound_color && (curr_color!= fill_col) { set_pixel(x, y, fill_col); Four_Fill (x+1, y, fill_col, bound_col); Four_Fill (x-1, y, fill_col, bound_col); Four_Fill (x, y+1, fill_col, bound_col); Four_Fill (x, y-1, fill_col, bound_col); } }
58 Αλγόριθμος γεμίσματος συνόρων (Boundary-Fill Algorithm) 2. Οκτώ γειτονικά σημεία - Χρησιμοποιείται για πιο περίπλοκα σχήματα - Προσθέτονται επί πλέον 4 διαγώνια σημεία - Οι περιοχές που γεμίζουν με αυτήν την μέθοδο ονομάζονται συνδεδεμένες κατά 8. Τρέχον σημείο (x,y) (x-1,y+1) (x-1,y) (x-1,y-1) (x,y+1) (x,y-1) (x+1,y+1) (x+1,y) (x+1,y-1)
59 Αλγόριθμος γεμίσματος πλημμυρίδας (Flood-Fill Algorithm) Μερικές φορές θέλουμε να γεμίσουμε (ή να αλλάξουμε) χρώμα σε μια περιοχή που τα όρια της δεν καθορίζονται με μόνο ένα χρώμα. Μπορούμε να χρωματίσουμε περιοχές αντικαθιστώντας ένα καθορισμένο εσωτερικό χρώμα αντί να αναζητούμε ένα συγκεκριμένο χρώμα στα ορια (boundary color) του πολυγώνου.
60 Αλγόριθμος γεμίσματος πλημμυρίδας (Flood-Fill Algorithm) void FloodFill(int x,int y,int OldColor,int NewColor) { int Intensity=get_pixel(x,y); if(intensity==oldcolor) { set_pixel(x, y, NewColor); FloodFill(x+1, y, OldColor, NewColor); FloodFill(x-1, y, OldColor, NewColor); FloodFill(x, y+1, OldColor, NewColor); FloodFill(x, y-1, OldColor, NewColor); } }
61 Αλγόριθμος γεμίσματος πλημμυρίδας μ Αναδρομικός αλγόριθμος flood-fill με 4 κατευθύνσεις με 8 κατευθύνσεις
62 Τέλος