Chương 4 CÁC GIẢI THUẬT TÔ MÀU

Một phần của tài liệu Cơ sở toán học trong đồ hoạ máy tính (Trang 41 - 50)

Như chúng ta đã biết, trong hầu hết tất cả các hệ đồ họa hiện nay thì bên cạnh việc vẽ ra được các đối tượng hình học thì việc tô màu chúng cũng đóng một vai trò quan trọng không kém. Trong số các đối tượng cần tô màu thì có những nhóm đối tượng là có thể tiến hành tô màu được và cũng có những đối tượng không thể tô màu do hình dạng phức tạp của nó, và trong tất cả các đối tượng nói trên thì việc tô màu một đa giác có lẽ là đơn giản hơn cả do các đường bao của đa giác là tuyến tính.

Trong hệ thống rời rạc, có hai phương thức được dùng để tô màu đối tượng. Phương pháp tô màu thứ nhất là xác định phần trùng nhau giữa diện tích cần tô và đường thẳng quét qua phần diện tích này. Một phương pháp tô màu khác là bắt đầu từ một vị trí bên trong cho trước, chúng ta sẽ tô màu từ điểm này về phiá ngoài cho đến khi đụng phải phần đường bao của đối tượng đang tô.. Phương pháp tô màu dùng đương thẳng quét thường được đi kèm với hầu hết tất cả các gói phần mềm đồ họa thông thường và nó được áp dụng để tô màu cho hầu hết các đối tượng hình học thông dụng như đa giác, hình tròn, ellipse và những đường cong đơn giản. Còn phương pháp tô màu bằng việc bắt đầu từ một điểm bên trong vật thể cần tô tiến hành tô cho đến khi gặp phải đường bao của vật thể thì thường được sử dụng để tô màu cho các đối tượng hình học phức tạp hay được dùng trong các hệ thống hội họa.

Giải Thuật Tô Màu Một Đa Giác Bằng Đường Thẳng Quét

Hình vẽ 3-35 minh họa cho cách thức tô màu bằng đường thẳng quét.

Ứng với mỗi đường thẳng quét qua đa giác, giải thuật tô màu sẽ xác định giao điểm giữa đường thẳng và đường bao của đa giác. Những giao điểm này sau đó sẽ được sắp xếp theo thứ tự từ trái sang phải, và một vị trí tương ứng trong vùng đệm nằm giữa mỗi cặp giao điểm sẽ được cài đặt giá trị màu sẽ được tô. Trong ví dụ củ hình vẽ 3-35, vị trí của bốn giao điểm với đa giác định nghĩa nên hai khoảng chứa các điểm nằm bên trong từ x = 10 đến x = 14 và từ x = 18 đến x = 24.

Trong một vài trường hợp, tung độ của các giao điểm giữa đường thẳng và đa giác cũng

10 14 18 24 x

cần phải được lưu lại một cách đặc biệt. Ví dụ như trong trường hợp

Hình 3-35 đường thẳng cắt ngang đa giác tại đỉnh của đa

giác

Các điểm bên trong khi thì vị trí này sẽ phải được lưu lại trong danh

sách các

đưởng thẳng quét qua phần điểm giao nhau đến hai lần. Hình vẽ 3-

36 chỉ ra hai

diện tích của đa giác đường thẳng tại hai vị trí y va y' cắt đa

giác tại các

đỉnh của đa giác. Đường thằng y đi qua 5 cạnh của đa giác. Tuy nhiên, đường thẳng y' lại có số giao điểm với đa giác là số chẵn mặc dầu nó cũng đi qua một đỉnh của đa giác. Các giao điểm dọc theo đường thẳng y' có thể nhận biết được dễ dàng những điểm thuộc bên trong đa giác nhưng với đường thẳng y, chúng ta cần phải làm thêm một số công việc mới có thể xác định các điểm nằm bên trong đa giác.

Sự khác biệt về mặt hình học giữa đường thẳng y và y' trong hình 3-36 sẽ được nhận biết bằng cách chú ý đến các vị trí giao nhau giữa các cạnh và các đường thẳng. Đối với đường y, hai cạnh giao với đường thẳng có chung một đỉnh nằm về hai phiá so với đường thẳng đó, nhưng với đường thẳng y', hai cạnh giao nhau với đường thẳng có chung một đỉnh lại nằm cùng về một phiá so với đườngthẳng đó. Như thế, các đỉnh đòi hỏi sự xử lý thêm là các đỉnh có cạnh nối đến nó giao với đường thẳng nằm về hai phiá của đường thẳng đó. Chúng ta có thể phát hiện ra những đỉnh này bằng cách duyệt hết toàn bộ đa giác hoặc theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ và quan sát sự thay đổi tương ứng theo tọa độ y của các đỉnh khi chúng ta di chuyển từ cạnh này sang cạnh kế tiếp. Nếu giá trị y của đỉnh chung cho hai cạnh liên tục là tăng dần hay giảm dần đều thì chúng ta chỉ cần xem như đỉnh này chỉ là một giao điểm giữa đưởng thẳng và đa giác. Ngược lại, nếu đỉnh chung là cực điểm (cực đại hay cực tiểu) trong vùng lân cận của đường bao đa giác thì giao điểm giữa hai cạnh với đường thẳng thông qua điểm này sẽ được thêm vào danh sách giao điểm hai lần.

Đường thẳng quét y' Đường thẳng quét y 1 1 2 1 2 1 1

Hình 3-36

Các giao điểm dọc theo đường thẳng quét giao với đa giác tại các đỉnh của đa giác. Đuờng thẳng y có số giao điểm là số chẵn nhưng đường thẳng y’ có số giao điểm là lẽ nhưng vẫn được đánh dấu là một cặp để xác định đúng khoảng tập các điểm nằm bên trong đa giác

Một cách để có thể trả lời chính xác câu hỏi là khi nào thì chúng ta đếm một đỉnh là một giao điểm và khi nào ta đếm đỉnh là hai giao điểm là tiến hành thu ngắn các cạnh của đa giác để tách những đỉnh này thành các đỉnh sẽ được đếm chỉ một lần. Chúng ta tiến hành xử lý các cạnh không nằm theo phương ngang dọc theo đường bao đa giác theo một thứ tự nào đó, hoặc là theo chiều kim đồng hồ hoặc là ngược chiều kim đồng hồ. Và với mỗi cạnh, chúng ta sẽ tiến hành kiểm tra xem cạnh đang xử lý và cạnh không nằm theo phương ngang kế tiếp có giá trị tọa độ của điểm chung theo trục y là tăng hay giảm đều hay không. Nếu có thì cạnh thấp hơn sẽ được thu ngắn để đảm bảo là chỉ có một giao điểm được phát sinh cho đường thẳng quét khi đi qua đỉnh chung của hai cạnh.

Quá trình tính toán được trình bày trong giải thuật đường quét cũng như các giải thuật khác có một đặc điểm nổi bật là tính chặt chẽ của các lớp được hiển thị. Chúng ta nói tính chặt chẽ là như thế nào? Đơn giản là đặc điểm của một phần thuộc lớp này sẽ có mối quan hệ mật thiết với phần kế tiếp, do đó sẽ giảm được khối lượng xử lý công việc. Các phương pháp có tính chất chặt chẽ thường được sử dụng để áp dụng cho đường thẳng quét đơn hay cho các đường thẳng quét kế tiếp. Trong việc xác định giao điểm với các cạnh, chúng ta có thể tính toán các toạ độ gia tăng dọc bất kỳ cạnh nào bằng cách lợi dụng tính chất là hệ số góc của các cạnh là không đổi ứng với bất kỳ đường thẳng quét nào.

Hình 3-38

Hai đường thẳng kế nhau cắt đường bao của đa giác

Đường thẳng quét yk

Đường thẳng quét yk+1 (xk+1, yk+1)

Hình 3-38 minh họa hai đường thẳng kế nhau cắt một cạnh bên trái của đa giác. Hệ số góc của cạnh đường bao này sẽ được biễu diễn thông qua tọa độ của các điểm cắt như sau:

yk+1 - yk

m = --- (58)

xk+1 - xk (adsbygoogle = window.adsbygoogle || []).push({});

Vì sự thay đổi giá trị của y giữa hai đường thẳng đơn giản là

yk+1 - yk = 1 (59)

Như thế, giá trị x của giao điểm xk+1 thuộc đường thẳng phiá trên sẽ được tính thông qua giá trị x tại giao điểm xk thuộc đường thẳng bên dưới như sau:

xk+1 = xk + 1/m (60)

Các giá trị tiếp theo của x có thể được tính bằng cách cộng dồn giá trị giá trị nghịch đảo của hệ số góc và làm tròn đến giá trị nguyên gần nhất.

Trong hệ thống xử lý song song, việc thực thi giải thuật tô màu có thể được tiến hành một cách song song bằng cánh ứng với mỗi đường thẳng quét cắt ngang đa giác, ta sẽ chuyển chúng đến cho những quá trình xử lý độc lập nhau. Quá trình tính toán các giao điểm cạnh sau đó sẽ được tính toán một cách độc lập. Với một cạnh có hệ số góc là m, giá trị tọa độ theo trục x là xk ứng với đường k nằm trên đường thẳng ban đầu có thể tính như sau:

xk = x0 + k/m (61)

Trong giải thuật tô màu liên tiếp, gia số của giá trị x là 1/m dọc theo các cạnh cho đến khi kết thúc chiều dài cạnh với các phép toán trên số nguyên và cũng nên chú ý rằng, hệ số góc m là tỉ số giữa hai số nguyên

m = ∆x/∆y

trong đó ∆x, ∆y sai phân của tọa độ giao điểm theo trục x và trục y. Và như vậy, giá trị x kế tiếp dọc theo cạnh là:

xk+1 = xk + ∆x/∆y (62)

Sử dụng phương trình này, chúng ta có thể tính được giá trị nguyên của x bằng cách khởi tạo lại biến đếm về giá trị 0 và sau đó tăng dần biến đếm một giá trị là ∆x ứng với mỗi lần di chuyển đến đường thẳng quét kế tiếp. Bất cứ khi nào giá trị biến đếm bằng hoặc

lớn hơn ∆y, chúng ta sẽ tăng giá trị của x lên 1 và giảm giá trị biến đếm ∆y. Một thủ tục tương đương như thế này cũng sẽ được sử dụng để duy trì phần nguyên và phần thập phân của giá trị x và tăng phần thập phân cho đến khi chúng ta đạt được giá trị nguyên kế tiếp.

Chúng ta có thể làm tròn đến giá trị x của điểm gần nhất thay vì cắt bỏ để đạt đến giá trị nguyên gần nhất bằng cách điều chỉnh lại giái thuật, và so sánh với ∆y/2. Điều này có thể thực hiện với các số nguyên bằng cách gia tăng biến đếm một giá trị là 2∆x ứng với mỗi bước tính và so sánh với ∆y. Khi sự gia tăng là lớn hơn hay bằng ∆y, chúng ta tăng giá trị x lên 1 và giảm biến đếm một giá trị là 2∆y.

Để làm tăng tính hiệu quả của giải thuật tô màu, trước tiên chúng ta cần lưu trữ đường bao của đa giác vào bảng lưu trữ các cạnh là nơi lưu trữ các giá trị cần thiết phục vụ cho giải thuật tô màu một cách hiệu quả. Việc lưu trữ có thể thực hiện theo chiều kim đồng hồ hay ngược chiều kim đồng hồ, chúng ta có thể sử dụng stack để lưu trữ các cạnh đồng thời cũng cần lưu trữ giá trị nhỏ nhất của y cho mỗi cạnh tương ứng với vị trí chính xác của đường thẳng quét. Chỉ có các cạnh không nằm theo phương ngang mới được lưu trữ vào bảng lưu trữ các cạnh. Với các cạnh được xử lý, chúng ta có thể thu ngắn các cạnh chính xác để giải quyết bài toán giao điểm là các đỉnh của đa giác. Mổi lần thêm vào bảng lưu trữ cạnh tướng ứng với một đường thẳng cụ thể nào đó, chúng ta cũng cần lưu lại giá trị lớn nhất của y cho cạnh đó, lưu trữ giá trị x của đỉnh thấp hơn và nghịch đảo hệ số góc. Ứng với mỗi đường thẳng quét, các cạnh sẽ được sắp xếp theo thứ tự từ trái sang phải.

Tiếp theo, chúng ta sẽ tiến hành xử lý các cạnh theo thứ tự từ dưới lên trên, ta cần tạo ra một danh sách các cạnh kích hoạt cho mỗi đường thẳng quét qua đa giác. Mỗi danh sách tương ứng cho một đường kích hoạt sẽ chứa tất cả các cạnh mà đường thẳng đi qua và các phép toán liên quan để có thể tính được cạnh giao.

Việc thực hiện các phép tính các cạnh giao cũng có thể thuận tiện hơn nếu chúng ta lưu các giá trị ∆x và ∆y vào bảng lưu. Và cũng vậy, để bảo đảm rằng chúng ta chỉ tô màu các điểm nằm bên trong đa giác thì ứng với mỗi đường thẳng quét, chúng ta chỉ tiến hành tô các điểm nằm trong khoảng các cặp giao điểm x bắt đầu từ điểm bên trái nhất và kết thúc ở điểm bên phải nhất.

Giải Thuật Kiểm Tra Bên Trong Và Bên Ngoài

Trong giải thuật tô màu vùng đối tượng và trong những quá trình xử lý đồ họa khác, chúng ta thường xuyên cần phải xác định vùng nằm bên trong đối tượng. Cho đến hiện tại thì chúng ta cũng chỉ bàn đến việc tô màu cho các đa giác có hình dạng chuẩn. Tuy nhiên trong hình học cơ bản, đa giác thường được định nghĩa theo dạng không có sự tự giao nhau giữa các cạnh. Ví dụ như đa giác chỉ đơn giản là các tam giác, tứ giác, lục giác hay bát giác. Các cạnh thành phần của các đối tương này chỉ giao nhau tại các đỉnh của đa giác và không có điểm chung nào nữa. Sự nhận biết các vùng nằm bên trong các đa giác chuẩn là một quá trình không mấy khó khăn. Nhưng trong phần lớn các ứng dụng đồ họa, chúng ta có thể chỉ ra dãy liên tục các đỉnh của vùng tô màu kể cả các đỉnh là giao điểm của các cạnh và như thế rất khó xác định đâu là các điểm nằm bên trong và đâu là các điểm nằm

bên ngoài đối tượng. Các phần mềm đồ họa thường dùng nguyên tắc chẵn lẻ hay nguyên tắc hệ số xoắn khác không để nhận biết các vùng bên trong này.

Chúng ta sẽ sử dụng nguyên tắc tính chẳn lẽ bằng nguyên lý vẽ một đường thẳng từ một điểm bất kỳ P đến một điểm cách xa nằm bên ngoài tọa độ đối tượng bằng cách đếm số cạnh cắt ngang đường quét. Nếu số cạnh cắt ngang đường quét là số lẻ thì P là điểm nằm bên trong, ngược lại thì P là điểm nằm bên ngoài. Để có thể đếm số cạnh chính xác, chúng ta phải đảm bảo rằng đường thẳng mà chúng ta chọn không được đi qua bất kỳ đỉnh nào của đa giác. Giải thuật tô màu theo phương pháp đường thẳng quét nói trên là một ví dụ của giải thuật tô màu theo phương pháp chẵn lẻ.

Một phương pháp khác có thể xác định một điểm nằm bên trong hay bên ngoài đối tượng là phương pháp dùng nguyên tắc đếm số điểm xoắn khác không là nguyên tắc đếm số lần các cạnh của đa giác uốn quanh một điểm theo chiều ngược chiều kim đồng hồ. Số đếm này được gọi là hệ số xoắn và một điểm nằm bên trong đối tượng hai chiều được định nghĩa là những điểm có hệ số xoắn khác không. Chúng ta áp dụng nguyên tắc hệ số xoắn khác không này vào một đa giác bằng cách khởi tạo hệ số xoắn bằng không và một lần nữa hình dung là đường thẳng đi qua điểm P bất kỳ nối với một điểm cách xa bên ngoài tọa độ của đối tượng. Và đường thẳng chúng ta chọn không đi qua bất kỳ một đỉnh nào của đa giác. Như vậy chúng ta sẽ đi dọc theo đường thẳng bắt đầu từ điểm P đến điểm cách xa đối tượng và đếm số cạnh cắt đường thẳng ứng với mỗi chiều. Chúng ta sẽ cộng thêm một vào hệ số xoắn nếu cạnh đa giác cắt đường thẳng từ phải sang trái và trừ một ra khỏi hệ số xoắn nếu cạnh đa giác cắt đường thẳng từ trái sang phải. Giá trị cuối cùng của hệ số xoắn sau khi các cạnh cắt ngang đường thẳng đã được đếm hết sẽ quyết định vị trí tương ứng của P. Nếu hệ số xoắn là khác không thì P là một điểm nằm bên trong đối tượng. Ngược lại thì P là một điểm thuộc bên ngoài đối tượng. Đối với các đa giác và các đối tượng có dạng hình học chuẩn thì cả hai phương pháp chẵn lẻ và hệ số xoắn khác không đều cho ra cùng một kết quả. Nhưng đối với các đối tượng có dạng hình học phức tạp thì hai phương pháp trên có thể xác định ra được các vùng nằm bên trong và bên ngoài một đối tượng là khác nhau.

Một cách để có thể xác định chiều của các cạnh là xác định một vector tổng của hai vector - một dọc theo chiều đường thẳng đi qua P ra điểm xa vô cùng và một vector cạnh E tương ứng với mỗi cạnh bị cắt. Nếu thành phần z của vector chéo u x E cho một cạnh cụ thể nào đó là dương thì chiều của cạnh cắt ngang đường thẳng được xem là từ phải qua

Một phần của tài liệu Cơ sở toán học trong đồ hoạ máy tính (Trang 41 - 50)