Tìm hiểu Đồ họa máy tính

Tài liệu Tìm hiểu Đồ họa máy tính: 3 LỜI NÓI ĐẦU Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất của tin học. Ngay từ khi xuất hiện, đồ họa máy tính đã có sức lôi cuốn mãnh liệt, cuốn hút rất nhiều người và được sử dụng ở nhiều lĩnh vực khác nhau như : khoa học, nghệ thuật, kinh doanh, thương mại, công nghiệp, quản lí, giáo dục, giải trí, Số lượng các chương trình đồ họa ứng dụng thật khổng lồ và phát triển liên tục. Cuốn sách này được biên soạn dựa trên đề cương môn Đồ họa máy tính thuộc chương trình đào tạo tin học bậc cử nhân và cao đẳng của Bộ Giáo dục và Đào tạo, tập trung vào các vấn đề của đồ họa hai chiều và ba chiều nhằm cung cấp một nền tảng kiến thức đầy đủ và chọn lọc bao gồm các khái niệm cơ bản nhất, các thuật toán cơ sở của đồ họa máy tính, giúp người đọc có thể tự tìm hiểu và xây dựng các chương trình ứng dụng đồ họa. Cuốn sách được chia làm 10 chương, gồm hai phần chính : đồ họa hai chiều và đồ họa ba chiều. Cuối mỗi chương đều có phần tóm tắt và hệ thố...

pdf98 trang | Chia sẻ: Khủng Long | Lượt xem: 1012 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Tìm hiểu Đồ họa máy tính, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
3 LỜI NĨI ĐẦU Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất của tin học. Ngay từ khi xuất hiện, đồ họa máy tính đã cĩ sức lơi cuốn mãnh liệt, cuốn hút rất nhiều người và được sử dụng ở nhiều lĩnh vực khác nhau như : khoa học, nghệ thuật, kinh doanh, thương mại, cơng nghiệp, quản lí, giáo dục, giải trí, Số lượng các chương trình đồ họa ứng dụng thật khổng lồ và phát triển liên tục. Cuốn sách này được biên soạn dựa trên đề cương mơn Đồ họa máy tính thuộc chương trình đào tạo tin học bậc cử nhân và cao đẳng của Bộ Giáo dục và Đào tạo, tập trung vào các vấn đề của đồ họa hai chiều và ba chiều nhằm cung cấp một nền tảng kiến thức đầy đủ và chọn lọc bao gồm các khái niệm cơ bản nhất, các thuật tốn cơ sở của đồ họa máy tính, giúp người đọc cĩ thể tự tìm hiểu và xây dựng các chương trình ứng dụng đồ họa. Cuốn sách được chia làm 10 chương, gồm hai phần chính : đồ họa hai chiều và đồ họa ba chiều. Cuối mỗi chương đều cĩ phần tĩm tắt và hệ thống bài tập để người đọc tự kiểm tra. Các thuật tốn trình bày đều cĩ lưu đồ và chương trình minh họa dưới dạng ngơn ngữ C. Để các vấn đề trình bày được phong phú, đa dạng và cập nhật, chúng tơi đã rất nỗ lực trong việc tham khảo các tài liệu kinh điển, đặc biệt là các bài giảng về đồ họa của các trường đại học nổi tiếng trên thế giới ở Âu, Mỹ như Brown, Stanford, MIT, Waterloo, Tuy nhiên trong quá trình biên soạn chắc chắn khơng thể khơng tránh khỏi sơ sĩt, chúng tơi xin trân trọng tiếp thu tất cả những ý kiến đĩng gĩp của bạn đọc cũng như các bạn đồng nghiệp để hồn thiện cuốn sách ngày một tốt hơn. Chúng tơi xin chân thành cám ơn Ban chủ nhiệm Khoa Cơng nghệ Thơng tin - Đại học Khoa học Tự nhiên, các anh chị trong Ban biên tập Nhà xuất bản Giáo dục đã hỗ trợ rất nhiệt tình để cuốn sách này sớm đến tay bạn đọc. CÁC TÁC GIẢ CHƢƠNG 1 GIỚI THIỆU VỀ ĐỒ HỌA MÁY TÍNH Sự phát triển của khoa học, kĩ thuật, nghệ thuật, kinh doanh, và cơng nghệ luơn luơn phụ thuộc vào khả năng truyền đạt thơng tin của chúng ta, hoặc thơng qua các bit dữ liệu lƣu trữ trong microchip hoặc thơng qua giao tiếp bằng tiếng nĩi. Câu châm ngơn từ xa xƣa “một hình ảnh cĩ giá trị hơn cả vạn lời” hay “trăm nghe khơng bằng một thấy” cho thấy ý nghĩa rất lớn của hình ảnh trong việc chuyển tải thơng tin. Hình ảnh bao giờ cũng đƣợc cảm nhận nhanh và dễ dàng hơn, đặc biệt là trong trƣờng hợp bất đồng về ngơn ngữ. Do đĩ khơng cĩ gì ngạc nhiên khi mà ngay từ khi xuất hiện máy tính, các nhà nghiên cứu đã cố gắng sử dụng nĩ để phát sinh các ảnh trên màn hình. Trong suốt gần 50 năm phát triển của máy tính, khả năng phát sinh hình ảnh bằng máy tính của chúng ta đã đạt tới mức mà bây giờ hầu nhƣ tất cả các máy tính đều cĩ khả năng đồ họa. Đồ họa máy tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất của tin học. Ngay từ khi xuất hiện, đồ họa máy tính đã cĩ sức lơi cuốn mãnh liệt, cuốn hút rất nhiều ngƣời ở nhiều lĩnh vực khác nhau nhƣ khoa học, nghệ thuật, kinh doanh, quản lí, ... Tính hấp dẫn và đa dạng của đồ họa máy tính cĩ thể đƣợc minh họa rất trực quan thơng qua việc khảo sát các ứng dụng của nĩ. 1. MỘT SỐ ỨNG DỤNG CỦA ĐỒ HỌA MÁY TÍNH Ngày nay, đồ họa máy tính đƣợc sử dụng trong rất nhiều lĩnh vực khác nhau nhƣ cơng nghiệp, thƣơng mại, quản lí, giáo dục, giải trí, Số lƣợng các chƣơng trình đồ họa ứng dụng thật khổng lồ và phát triển liên tục, sau đây là một số ứng dụng tiêu biểu : 1.1. Hỗ trợ thiết kế Một trong những ứng dụng lớn nhất của đồ họa máy tính là hỗ trợ thiết kế (CAD – computer-aided design). Ngày nay CAD đã đƣợc sử dụng hầu hết trong việc thiết kế các cao ốc, ơ tơ, máy bay, tàu thủy, tàu vũ trụ, máy tính, trang trí mẫu vải, và rất nhiều sản phẩm khác. Sử dụng các chƣơng trình này, đầu tiên các đối tƣợng đƣợc hiển thị dƣới dạng các phác thảo của phần khung (wireframe outline), mà từ đĩ cĩ thể thấy đƣợc tồn bộ hình dạng và các thành phần bên trong của các đối tƣợng. Sử dụng kĩ thuật này, ngƣời thiết kế sẽ dễ dàng nhận thấy ngay các thay đổi của đối tƣợng khi tiến hành hiệu chỉnh các chi tiết hay thay đổi gĩc nhìn, . Một khi đã thiết kế xong phần khung của đối tƣợng, các mơ hình chiếu sáng, tơ màu và tạo bĩng bề mặt sẽ đƣợc kết hợp để tạo ra kết quả cuối cùng rất gần với thế giới thực . 1.2. Biểu diễn thơng tin Đây là các ứng dụng sử dụng đồ họa máy tính để phát sinh các biểu đồ, đồ thị, dùng minh họa mối quan hệ giữa nhiều đối tƣợng với nhau. Các ứng dụng này thƣờng đƣợc dùng để tĩm lƣợc các dữ liệu về tài chính, thống kê, kinh tế, khoa học, tốn học, giúp cho việc nghiên cứu, quản lí, một cách cĩ hiệu quả. 4 Hình 1.1 - Phác thảo phần khung và kết quả của thiết kế xy lanh Hình 1.2 – Thơng tin tĩm lƣợc đƣợc biểu diễn qua các biểu đồ 1.3. Lĩnh vực giải trí, nghệ thuật Trong lĩnh vực nghệ thuật, các chƣơng trình máy tính nhƣ Paint Shop Pro, Adobe Photoshop, 3D Studio, hỗ trợ rất đắc lực cho các họa sĩ, các nhà tạo mẫu trong việc thiết kế các hình ảnh sống động, và rất thực. Với các chƣơng trình này, ngƣời họa sĩ đƣợc máy tính tạo cho cảm giác y nhƣ đang làm việc ngồi đời thực bằng cách cung cấp các cơng cụ nhƣ khung vẽ, giá vẽ, bảng pha màu, các hiệu ứng ba chiều, làm cho họ cảm thấy rất thoải mái và tiện lợi. Ngồi ra đồ họa máy tính cịn giúp tạo ra các chƣơng trình trị chơi, giải trí; hỗ trợ cho các kĩ xảo điện ảnh, cho các nhà làm phim. Cĩ nhiều bộ phim rất nổi tiếng nhờ vào kĩ xảo điện ảnh nhƣ : Cơng viên Khủng long kỉ Jura (Jurassic Park), Titanic, Thế giới nƣớc (Water World), Hình 1.3 – Hình ảnh đƣợc tạo ra từ chƣơng trình đồ họa 1.4. Giáo dục và đào tạo Hiện nay các chƣơng trình mơ phỏng cấu trúc của các vật thể, tiến trình của các phản ứng hĩa học, hoạt động của các gĩi tin trên mạng máy tính, đƣợc dùng rất nhiều trong việc hỗ trợ giảng dạy. Trong đào tạo, các ứng dụng mơ phỏng đƣợc dùng để kiểm tra trình độ ngƣời lái, huấn luyện phi cơng, điều khiển giao thơng, Hình 1.4 – Chƣơng trình học về máy tính 1.5. Giao tiếp giữa máy tính và ngƣời dùng Mọi ứng dụng đều phải cĩ giao diện giao tiếp với ngƣời dùng. Giao diện đồ họa thực sự là một cuộc cách mạng mang lại sự thuận tiện và thoải mái cho ngƣời dùng ứng dụng. Các ứng dụng dựa trên hệ điều hành MS Windows là một minh họa rất trực quan của giao diện đồ họa. Các chức năng của các ứng dụng này đƣợc thiết kế cho ngƣời dùng làm việc thơng qua các biểu tƣợng mơ tả chức năng đĩ. Ví dụ, chức năng lƣu tập tin đƣợc hiểu thơng qua biểu tƣợng đĩa mềm, chức năng in ấn đƣợc hiểu thơng qua biểu tƣợng máy in, Để chọn các chức năng, ngƣời dùng sử dụng chuột trỏ đến và nhấn vào các biểu tƣợng tƣơng ứng. Điểm thuận lợi chính khi dùng biểu tƣợng là kích thƣớc khơng gian mà nĩ chiếm ít hơn nhiều so với dùng văn bản để mơ tả cho cùng một chức năng, ngồi ra việc nắm bắt các chức năng qua các biểu tƣợng sẽ dễ dàng hơn rất nhiều khi ngƣời dùng gặp trở ngại về mặt ngơn ngữ. Các ứng dụng cĩ giao diện đồ họa cịn cho phép ngƣời dùng khả năng làm việc dễ dàng với nhiều cửa sổ với nhiều dạng tài liệu khác nhau cùng một lúc. Hình 1.5 – Giao diện của chƣơng trình MS Word 2. KHÁI NIỆM VỀ ĐỒ HỌA MÁY TÍNH Đồ họa máy tính là tất cả những gì liên quan đến việc sử dụng máy tính để phát sinh ra hình ảnh. Các vấn đề liên quan tới cơng việc này bao gồm : tạo, lƣu trữ, thao tác trên các mơ hình (các mơ tả hình học của đối tƣợng) và các ảnh. Theo định nghĩa này thì đồ họa máy tính bao gồm việc thiết kế phần cứng nhƣ thiết bị hiển thị, các thuật tốn cần thiết để phát sinh các đƣờng trên các thiết bị này, các phần mềm đƣợc sử dụng cho cả ngƣời lập trình hệ thống và ngƣời lập trình ứng dụng đồ họa, và các chƣơng trình ứng dụng tạo ảnh bằng máy tính. Đồ họa máy tính cung cấp một trong những phƣơng cách tự nhiên nhất cho việc truyền đạt thơng tin với máy tính. Ngày nay, trong nhiều quá trình 5 thiết kế, cài đặt và xây dựng, thơng tin mà hình ảnh mang lại là hầu nhƣ khơng thể thiếu đƣợc. Kĩ thuật trực quan (scientific visualization) đã trở nên là một lĩnh vực rất quan trọng từ năm 1980, khi các nhà nghiên cứu khoa học và các kĩ sƣ nhận ra rằng họ khơng thể xử lí một lƣợng dữ liệu khổng lồ phát sinh từ các siêu máy tính mà dữ liệu khơng đƣợc tĩm lƣợc và làm nổi bật các xu hƣớng và hiện tƣợng qua nhiều loại biểu diễn đồ họa khác nhau. Đồ họa máy tính tƣơng tác là một trong những phƣơng tiện mang lại thêm nhiều sự thuận lợi cho ngƣời dùng trong việc phát sinh hình ảnh kể từ khi cĩ phát minh của máy ảnh và truyền hình. Với máy tính, chúng ta cĩ thể tạo các hình ảnh khơng chỉ của các đối tƣợng cụ thể, thực tế, mà cịn của các đối tƣợng trừu tƣợng, nhân tạo; các biểu diễn của dữ liệu mà khơng cĩ tính kế thừa về mặt hình học, nhƣ là kết quả điều tra, khảo sát. Hơn nữa, với đồ họa máy tính chúng ta khơng bị giới hạn trong các ảnh tĩnh. Các ảnh động thơng thƣờng mang lại nhiều hiệu quả hơn so với ảnh tĩnh, đặc biệt là với các hiện tƣợng biến đổi theo thời gian, cả thực tế (nhƣ sự đổi hƣớng của cánh máy bay siêu âm, hay sự phát triển của khuơn mặt ngƣời từ lúc trẻ thơ tới lúc già) và trừu tƣợng (nhƣ là xu hƣớng phát triển của việc sử dụng năng lƣợng, gia tăng dân số, ). Cĩ nhiều cách tiếp cận trong việc học mơn đồ họa, trải rộng từ việc nghiên cứu phần cứng tới việc học để sử dụng đồ họa máy tính chỉ trong một lĩnh vực chuyên biệt nào đĩ nhƣ là thiết kế mạch tích hợp cao (VLSI – very large scale integrated circuit). Ở đây chúng ta tiếp cận từ gĩc độ của ngƣời lập trình ứng dụng, đĩ là ngƣời sử dụng tất cả các hỗ trợ của phần cứng , các cơng cụ phần mềm để xây dựng nên các ứng dụng. Tuy nhiên để cĩ thể thiết kế và cài đặt các chƣơng trình ứng dụng đồ họa đƣợc tốt, ngồi việc tìm hiểu các khả năng của cơng cụ lập trình, chúng ta cũng cần phải nắm vững các khái niệm về phần cứng; các vấn đề, các nguyên lí liên quan đến cài đặt phần mềm, các thuật tốn, các ứng dụng, 3. TỔNG QUAN VỀ MỘT HỆ ĐỒ HỌA Một hệ đồ họa bao giờ cũng cĩ hai thành phần chính đĩ là phần cứng và phần mềm. Phần cứng bao gồm các thiết bị hiển thị và nhập dữ liệu, Phần mềm bao gồm các cơng cụ lập trình và các trình ứng dụng đồ họa. Chúng ta sẽ lần lƣợt khảo sát các thành phần này. 3.1. Phần cứng 3.1.1. Thiết bị hiển thị Màn hình là thiết bị hiển thị thơng dụng nhất trong một hệ đồ họa. Các thao tác của hầu hết màn hình đều dựa trên thiết kế của ống tia âm cực (CRT – cathode ray tube). Cấu tạo của CRT Hình 1.6 minh họa thao tác cơ sở của một ống tia âm cực. Một chùm các tia điện tử (tia âm cực) phát ra từ một súng điện tử, vƣợt qua các hệ thống hội tụ (focusing) và dẫn hƣớng (deflection) sẽ hƣớng tới các vị trí xác định trên màn hình đƣợc phủ một lớp phosphor. Tại mỗi vị trí tƣơng tác với tia điện tử, hạt phosphor sẽ phát ra một chấm sáng nhỏ. Vì ánh sáng phát ra bởi các hạt phosphor mờ dần rất nhanh nên cần phải cĩ một cách nào đĩ để duy trì ảnh trên màn hình. Một trong các cách đĩ là lặp đi lặp lại nhiều lần việc vẽ lại ảnh thật nhanh bằng cách hƣớng các tia điện tử trở lại vị trí cũ. Kiểu hiển thị này gọi là refresh CRT. Hình 1.6 – Cấu tạo của CRT Cĩ nhiều loại phosphor đƣợc dùng trong một CRT. Ngồi màu sắc ra, điểm khác nhau chính giữa các loại phosphor là “độ bền” (persistent), đĩ là khoảng thời gian phát sáng sau khi tia CRT khơng cịn tác động. Lớp phosphor cĩ độ bền thấp cần tốc độ làm tƣơi cao hơn để giữ cho hình ảnh trên màn hình khỏi nhịe. Loại này thƣờng rất tốt cho hoạt hình, rất cần thay đổi hình ảnh liên tục. Lớp phosphor cĩ độ bền cao thƣờng đƣợc dùng cho việc hiển thị các ảnh tĩnh, độ phức tạp cao. Mặc dù một số loại phosphor cĩ độ bền lớn hơn 1 giây, tuy nhiên các màn hình đồ họa thƣờng đƣợc xây dựng với độ bền dao động từ 10 đến 60 micro giây. Số lƣợng tối đa các điểm cĩ thể hiển thị trên một CRT đƣợc gọi là độ phân giải (resolution). Một định nghĩa chính xác hơn của độ phân giải là số lƣợng các điểm trên một centimet mà cĩ thể đƣợc vẽ theo chiều ngang và chiều dọc, mặc dù nĩ thƣờng đƣợc xem nhƣ là tổng số điểm theo mỗi hƣớng. Kích thƣớc vật lí của màn hình đồ họa đƣợc tính từ độ dài của đƣờng chéo màn hình, thƣờng dao động từ 12 đến 27 inch hoặc lớn hơn. Một màn hình CRT cĩ thể đƣợc kết hợp với nhiều loại máy khác nhau, do đĩ số lƣợng các điểm trên màn hình cĩ thể đƣợc vẽ thật sự cịn tùy thuộc vào khả năng của hệ thống mà nĩ kết hợp vào. 6 Một thuộc tính khác của màn hình nữa là tỉ số phƣơng (aspect ratio). Tỉ số phƣơng là tỉ lệ của các điểm dọc và các điểm ngang cần để phát sinh các đoạn thẳng cĩ độ dài đơn vị theo cả hai hƣớng trên màn hình (trong một số trƣờng hợp ngƣời ta thƣờng dùng tỉ số phƣơng nhƣ là tỉ số của các điểm theo chiều ngang so với các điểm theo chiều dọc). Với các màn hình cĩ tỉ số phƣơng khác 1, dễ dàng nhận thấy là các hình vuơng hiển thị trên nĩ sẽ cĩ dạng hình chữ nhật, các hình trịn sẽ cĩ dạng hình ellipse. Thực ra khái niệm tỉ số phƣơng xuất phát từ bản chất khoảng cách (nếu tính cùng một đơn vị độ dài) giữa các điểm dọc khơng bằng khoảng cách giữa các điểm ngang. Một tỉ số phƣơng cĩ giá trị ¾ cĩ nghĩa là vẽ 3 điểm theo chiều dọc sẽ cĩ cùng độ dài với việc vẽ 4 điểm theo chiều ngang. Màn hình dạng điểm (raster - scan display): Màn hình dạng điểm là dạng thƣờng gặp nhất trong số các dạng màn hình sử dụng CRT dựa trên cơng nghệ truyền hình. Trong hệ thống này, chùm tia điện tử sẽ đƣợc quét ngang qua màn hình, mỗi lần một dịng và quét tuần tự từ trên xuống dƣới. Sự bật tắt của các điểm sáng trên màn hình phụ thuộc vào cƣờng độ của tia điện tử và đây chính là cơ sở của việc tạo ra hình ảnh trên màn hình. Mỗi điểm trên màn hình đƣợc gọi là một pixel hay là pel (viết tắt của picture element). Các thơng tin về hình ảnh hiển thị trên màn hình đƣợc lƣu trữ trong một vùng bộ nhớ gọi là vùng đệm làm tƣơi (refresh buffer) hay là vùng đệm khung (frame buffer). Vùng bộ nhớ này lƣu trữ tập các giá trị cƣờng độ sáng của tồn bộ các điểm trên màn hình và luơn luơn tồn tại một song ánh giữa mỗi điểm trên màn hình và mỗi phần tử trong vùng này. Hình 1.7 – Quá trình tạo hình ảnh của các tia quét Để thay đổi các hình ảnh cần hiển thị, các giá trị tƣơng ứng với vị trí và độ sáng phải đƣợc đặt vào vùng đệm khung. Hình 1.8 minh họa các giá trị tƣơng ứng trong vùng đệm khung để hiển thị hình ảnh của chữ A trên màn hình. Đối với màn hình đen trắng, vùng đệm khung cịn đƣợc gọi là bitmap, với các màn hình khác vùng đệm khung thƣờng đƣợc gọi là pixmap. Để tạo ra các ảnh đen trắng, đơn giản chỉ cần lƣu thơng tin của mỗi pixel bằng 1 bit (các giá trị 0, 1 sẽ tƣợng trƣng cho việc tắt (tối), bật (sáng) pixel trên màn hình). Trong trƣờng hợp ảnh nhiều màu, ngƣời ta cần nhiều bit hơn, nếu thơng tin của mỗi pixel đƣợc lƣu bằng b bit, thì ta cĩ thể cĩ 2b giá trị màu phân biệt cho pixel đĩ. Hình 1.8 – Song ánh giữa vùng đệm khung và màn hình Trong các màn hình màu, ngƣời ta định nghĩa tập các màu làm việc trong một bảng tra (LookUp Table - LUT). Mỗi phần tử của LUT định nghĩa một bộ ba giá trị R (Red), G (Green), B (Blue) mơ tả một màu nào đĩ. Khi cần sử dụng một màu, ta chỉ cần chỉ định số thứ tự (index) tƣơng ứng của màu đĩ trong LUT. Bảng LUT cĩ thể đƣợc thay đổi bởi các ứng dụng và ngƣời lập trình cĩ thể can thiệp điều khiển. Với cách làm này chúng ta cĩ thể tiết kiệm khơng gian lƣu trữ cho mỗi phần tử trong vùng đệm khung. Số phần tử của LUT đƣợc xác định từ số lƣợng các bits/pixel. Nếu mỗi phần tử của vùng đệm khung dùng b bits để lƣu thơng tin của một pixel, thì bảng LUT cĩ 2b phần tử. Nếu b=8, LUT sẽ cĩ 28=256 phần tử, đĩ chính là số màu cĩ thể đƣợc hiển thị cùng một lúc trên màn hình. Việc làm tƣơi trên màn hình dạng này đƣợc thực hiện ở tốc độ 60 đến 80 frame/giây. Đơi khi tốc độ làm tƣơi cịn đƣợc biểu diễn bằng đơn vị Hertz (Hz – số chu kì/ giây), trong đĩ một chu kì tƣơng ứng với một frame. Sử dụng đơn vị này, chúng ta cĩ thể mơ tả tốc độ làm tƣơi 60 frame/giây đơn giản là 60Hz. Khi đạt đến cuối mỗi dịng quét, tia điện tử quay trở lại bên trái của màn hình để bắt đầu dịng quét kế tiếp. Việc quay trở lại phía trái màn hình sau khi làm tƣơi mỗi dịng quét đƣợc gọi là tia hồi ngang (horizontal retrace). Và tới cuối mỗi frame, tia điện tử (tia hồi dọc – vertical retrace) quay trở lại gĩc trên bên trái của màn hình để chuẩn bị bắt đầu frame kế tiếp. Trong một số màn hình, mỗi frame đƣợc hiển thị thành hai giai đoạn sử dụng kĩ thuật làm tƣơi đan xen nhau (interlaced refesh). Ở giai đoạn đầu tiên, tia quét sẽ quét một số dịng từ trên xuống dƣới, sau tia hồi dọc, các dịng cịn lại sẽ đƣợc quét. Việc đan xen các dịng quét này cho phép chúng ta thấy đƣợc tồn màn hình hiển thị chỉ trong một nửa thời gian so với dùng để quét tất cả các dịng một lần từ trên xuống dƣới. Kĩ thuật này thƣờng đƣợc dùng cho loại màn hình cĩ tốc độ làm tƣơi thấp. Hình 1.9 – Hoạt động của màn hình interlaced 7 Các hệ màu Việc nghiên cứu màu sắc bao gồm nhiều lĩnh vực nhƣ : quang học, sinh lí học, tâm lí học và các nhân tố khác thuộc về con ngƣời. Vì thế, cĩ rất nhiều quan niệm cũng nhƣ các thành ngữ về khoa học các màu sắc. Đối với những ngƣời làm tin học, vấn đề mà họ quan tâm là mối tƣơng tác qua lại giữa sự cảm nhận màu sắc của con ngƣời với các bộ phận phần cứng hiển thị màu sắc của màn hình máy tính, và với các phần mềm thiết kế trên nĩ. Bảng dƣới đây sẽ trình bày mối quan hệ này : Sự cảm nhận của con ngƣời Đặc điểm phần cứng Đặc điểm phần mềm Màu sắc Các màu hiển thị gốc Thuật tốn trên khơng gian màu Sắc độ màu (Hue) Bƣớc sĩng (WaveLength) Độ bão hịa (Saturation) Sự thuần nhất của màu Độ sáng hay độ chĩi Cƣờng độ sáng Hiệu chỉnh gamma Sự “rung” của màn hình Tốc độ làm tƣơi (refresh) Khơng gian màu (color space) do đĩ đƣợc đƣa ra để định các màu hiển thị trên máy tính bởi vì chúng làm đơn giản hĩa các thao tác tính tốn cần thiết cho việc chuyển đổi màu sắc (color transformation). Khơng gian màu cĩ thể đƣợc thiết kế hoặc là dựa trên cơ sở của bộ phát sinh màu của phần cứng (hardware color generation) (ví dụ nhƣ khơng gian RGB) hoặc là dựa trên sự cảm nhận màu sắc của mắt (nhƣ khơng gian HSL). Với một ứng dụng, việc chọn khơng gian màu nào để sử dụng tùy thuộc vào một số nhân tố sau : độ chính xác mà các nhà thiết kế cần kiểm sốt màu sắc (color control); yêu cầu về sự tƣơng tác giữa các màu sắc và tốc độ các tính tốn cho ứng dụng đĩ. Khơng gian RGB (RGB space) Khơng gian RGB mơ tả màu sắc bằng ba thành phần Red, Green, Blue. Khơng gian này đƣợc minh họa bằng một khối lập phƣơng với các trục chính R, G, B. Mỗi màu trong khơng gian RGB đều đƣợc biểu diễn nhƣ là một vector thơng qua ba vector cơ sở là Red, Green, Blue. Do đĩ, ứng với các tổ hợp khác nhau của ba màu này sẽ cho ta một màu mới. Hình 1.10 - Mơ hình khơng gian RGB Trong hình lập phƣơng mỗi màu gốc (Red, Green, Blue) đƣợc đặt vào gĩc đối diện với các màu bù nĩ. (Hai màu bù nhau là hai màu mà khi kết hợp tạo thành màu trắng hay xám (grey)). Nhƣ vậy Red đối diện với Cyan, Green đối diện với Magenta, Blue đối diện với Yellow. Giá trị xám nằm trên đƣờng chéo nối các đỉnh    1,1,1,0,0,0 của hình lập phƣơng. Thƣờng thƣờng các trục R, G, B đƣợc chuẩn hĩa. Khi kết hợp hai màu lại với nhau thì màu sinh ra cĩ vector bằng tổng các vector thành phần. Một số thuận lợi khi dùng khơng gian RGB :  Khơng gian RGB là chuẩn cơng nghiệp cho các thao tác đồ họa máy tính. Các thao tác màu sắc cĩ thể đƣợc tính tốn trên các khơng gian màu khác nhƣng cuối cùng cần phải chuyển về khơng gian RGB để cĩ thể hiển thị trên màn hình (do thiết kế của phần cứng dựa trên mơ hình RGB).  Cĩ thể chuyển đổi qua lại giữa khơng gian RGB với các khơng gian màu khác nhƣ CIE, CMY, HSL, HSV, ...  Các thao tác tính tốn trên khơng gian RGB thƣờng đơn giản hơn. Một số bất lợi :  Các giá trị RGB của một màu là khác nhau đối với các màn hình khác nhau : Nghĩa là các giá trị RGB của màu tim trên màn hình màu này sẽ khơng sinh ra đúng màu đĩ trên một màn hình khác.  Sự mơ tả các màu trong thế giới thực đối với khơng gian RGB cịn nhiều hạn chế bởi vì khơng gian RGB khơng hồn tồn phù hợp với sự cảm nhận màu sắc của con ngƣời. Hai điểm phân biệt trong khơng gian RGB, với mắt ngƣời cĩ thể hoặc khơng thể là thể hiện của hai màu khác nhau. Chính vì điều này mà khơng gian RGB khơng thể ánh xạ trực tiếp đến bất cứ chiều cảm nhận nào khác (nhƣ hue, saturation, lightness) ngồi hue (sắc độ). Khơng gian HSL Khơng gian này cĩ chú trọng hơn khơng gian RGB đến các thành phần của sự cảm nhận màu sắc của mắt (Hue, Saturation, Lightness). Tuy nhiên, khơng gian HSL thực ra cũng chỉ là một phép biến đổi gần đúng của khơng gian RGB mà thơi. Khơng giống nhƣ các khơng gian màu khác xây dựng trên sự cảm nhận màu sắc của mắt, khơng gian HSL vẫn cịn bị lệ B R G Black (0,0,0) Green (0,1,0) Yellow (1,1,0) Red (1,0,0) Magenta (1,0,1) Blue (0,0,1) Cyan (0,1,1) White (1,1,1) 1 1 1Grayscale 8 thuộc vào phần cứng của CRT. Khơng gian HSL đƣợc biểu diễn trong hệ tọa độ trụ, hình minh họa là hai hình nĩn úp vào nhau. H (Hue) là toạ độ ứng với gĩc quay, S (Saturation) là tọa độ gốc, L là trục thẳng đứng. Hầu hết các màu đạt bão hịa khi S = 1 và L = 0.5. Hình 1.11 - Mơ hình khơng gian HSL Một số thuận lợi của khơng gian HSL :  Khơng gian HSL gần với sự cảm nhận các thuộc tính màu sắc của con ngƣời hơn khơng gian RGB (tuy cách tiếp cận đã đơn giản hĩa đi nhiều). Các màu đƣợc xác định dễ dàng hơn chẳng hạn do H quay quanh trục đứng nên các màu bù đƣợc xác định một cách dễ dàng, đối với các giá trị lightness cũng vậy.  Việc kiểm sốt các màu cơ sở HSL dễ hơn cho những ngƣời mới làm quen với các chƣơng trình đồ họa. Một số bất lợi :  Việc thêm vào một vector khơng thể thực hiện đơn giản nhƣ khơng gian RGB (chỉ thêm vào các thành phần màu). Các thao tác lƣợng giác khi biến đổi sẽ ảnh hƣởng đáng kể đến tốc độ của chƣơng trình.  Cần phải qua hiệu chỉnh gamma trƣớc khi hiển thị (giống nhƣ các khơng gian khác). Khơng gian HSV Khơng gian HSV thực chất cũng chỉ là một sự biến đổi khác của khơng gian RGB. Khơng gian HSV đƣợc mơ hình bằng hình lập phƣơng RGB quay trên đỉnh Black của nĩ. H (Hue) là gĩc quay quanh trục Values, S (Saturation) đi từ 0 đến 1, trục V (Values) do vậy tƣơng ứng với đƣờng chéo nối đỉnh White và Black. Hình 1.12 - Mơ hình khơng gian HSV Theo cách này, các màu đạt bão hịa khi S=1 và V=1. Trong khơng gian HSV các màu đƣợc chuẩn hĩa về số các gam (gamut) màu của thiết bị hiển thị. Một số thuận lợi của khơng gian HSV :  Khơng gian HSV dễ dàng đáp ứng các màu sắc của các chƣơng trình đồ họa do đƣợc xây dựng dựa trên sự bắt chƣớc luật trộn màu của ngƣời họa sĩ. Ví dụ : Khi cần thêm màu trắng vào, phải đặt V=S=1 sau đĩ giảm S từ từ cho tới khi đạt đƣợc màu vừa ý; hay khi cần thêm màu đen vào, điều đĩ cĩ nghĩa là giảm V (cƣờng độ sáng) và cố định S,...  Do khơng cần sử dụng các phép biến đổi lƣợng giác khi muốn chuyển sang khơng gian RGB nên khơng gian HSV cĩ nhiều thuận lợi về mặt tính tốn hơn so với khơng gian HSL. Một số bất lợi :  Cần cĩ các phép hiệu chỉnh gamma. Bảng so sánh giữa các khơng gian màu RGB HSL HSV Chuẩn cơng nghiệp cho các thao tác đồ họa máy tính Hình thức biến đổi khác của khơng gian RGB Hình thức biến đổi khác của khơng gian RGB Liên hệ trực tiếp với phần cứng Liên hệ gần hơn với sự cảm nhận màu sắc của con ngƣời Liên hệ gần hơn với sự cảm nhận màu sắc của con ngƣời Là chuyển đổi cuối cùng cho tất cả các nhu cầu hiển thị Địi hỏi các phép biến đổi phức tạp Đã đơn giản hĩa các thao tác tính tốn. Khơng thể chuyển sang màn hình khác (phụ thuộc thiết bị) Độc lập thiết bị Độc lập thiết bị Khơng cĩ sự tƣơng ứng 1-1 với cách cảm nhận màu của con ngƣời Cĩ Cĩ Mơ hình là hình lập phƣơng Mơ hình là hai hình nĩn úp vào nhau Mơ hình là hình nĩn đơn Đƣợc chuẩn hĩa về 1 Đƣợc chuẩn hĩa về 1 Đƣợc chuẩn hĩa về 1 Độ bão hịa đạt max khi S =1 Độ bão hịa đạt max khi S =1, L =0.5 Độ bão hịa đạt max khi S =1, V =1 Trộn màu khơng rõ ràng Rõ ràng Rõ ràng V(Value) Yellow Green (1200) Cyan Blue (2400) Magenta Red (00) V=1 (White) Grayscale V=0 (Black) S(Saturation) H(Hue angle) L(Lightness) L=1 (White) Yellow Blue Grayscale L=0 (Black) S(Saturation) H(Hue angle) L=0.5 Red Magenta CyanGreen 9 3.1.2. Các thiết bị nhập Bàn phím : Xuất hiện trong hầu hết các máy tính, nĩ là thiết bị để nhập dữ liệu dạng văn bản và số. Đây là loại thiết bị quen thuộc nhất với ngƣời sử dụng tuy cĩ hạn chế là tƣơng tác khơng cao. Chuột : Cùng với sự xuất hiện của các ứng dụng đồ họa tƣơng tác cao, chuột là thiết bị nhập ngày càng quen thuộc với ngƣời sử dụng. Ngƣời ta dùng chuột để trỏ và chọn (point-click) các chức năng phù hợp với yêu cầu của mình. Bằng cách này, giao tiếp giữa ngƣời dùng và máy tính càng ngày càng thân thiện và dễ dàng hơn. Ngồi ra chúng ta cũng cĩ một số thiết bị nhập khác cùng họ với chuột nhƣ track ball, 3.2. Phần mềm Phần mềm đồ họa cĩ thể phân thành 2 loại : các cơng cụ lập trình và các trình ứng dụng đồ họa phục vụ cho một mục đích nào đĩ. Các cơng cụ lập trình cung cấp một tập các hàm đồ họa cĩ thể đƣợc dùng trong các ngơn ngữ lập trình cấp cao nhƣ C, Pascal, .. Ví dụ nhƣ các thƣ viện đồ họa của các ngơn ngữ nhƣ C, Pascal hay GL (Graphics Library) của Silicon Graphics. Các hàm cơ sở của nĩ bao gồm việc tạo các đối tƣợng cơ sở của hình ảnh nhƣ đoạn thẳng, đa giác, đƣờng trịn, , thay đổi màu sắc, chọn khung nhìn, áp dụng các phép biến đổi, . Trong khi đĩ, các ứng dụng đồ họa đƣợc thiết kế cho những ngƣời dùng khơng phải là lập trình viên, cho phép ngƣời dùng tạo các đối tƣợng, hình ảnh, mà khơng cần quan tâm tới việc chúng đƣợc tạo ra nhƣ thế nào. Ví dụ nhƣ là Photoshop, AutoCAD, Biểu diễn tọa độ Thơng thƣờng các hệ đồ họa sử dụng hệ tọa độ Descartes để mơ tả đối tƣợng. Nếu các tọa độ của đối tƣợng đƣợc mơ tả trong các hệ tọa độ khác nhƣ tọa độ cầu, , chúng phải đƣợc chuyển về tọa độ Descartes trƣớc khi dùng. Quy trình hiển thị đối tƣợng Trƣớc tiên chúng ta mơ tả các đối tƣợng thành phần của một ảnh phức tạp trong các hệ tọa độ riêng để thuận tiện cho việc biểu diễn tọa độ của chúng. Các hệ tọa độ này đƣợc gọi là hệ tọa độ mơ hình (modeling coordinates) hay cịn gọi là hệ tọa độ cục bộ (local coordinates). Một khi các đối tƣợng thành phần đƣợc biểu diễn xong, chúng ta sẽ đặt chúng vào các vị trí tƣơng ứng trong ảnh sử dụng hệ tọa độ thế giới thực (world coordinates). Sau cùng, các mơ tả của ảnh trong hệ tọa độ thế giới thực sẽ đƣợc chuyển đến một hoặc nhiều hệ tọa độ khác nhau của thiết bị hiển thị, tùy vào chúng ta muốn hiển thị trên thiết bị nào. Các hệ tọa độ này cịn đƣợc gọi là hệ tọa độ thiết bị (device coordinates). Các mơ tả trong các hệ tọa độ cục bộ và hệ tọa độ thế giới thực cho phép chúng ta sử dụng thứ nguyên thích hợp cho các đơn vị đo mà khơng phải bị ràng buộc gì của từng thiết bị hiển thị cụ thể. Hình 1.13 – Quy trình hiển thị đối tƣợng Thơng thƣờng, các hệ đồ họa chuyển các mơ tả trong hệ tọa độ thế giới thực tới hệ tọa độ thiết bị chuẩn (normalized device coordinates) cĩ các chiều là đơn vị trƣớc khi chuyển tới hệ tọa độ thiết bị. Điều này làm cho hệ thống độc lập với nhiều loại thiết bị khác nhau. Các hàm đồ họa Các hàm đồ họa cung cấp khả năng tạo và thao tác hình ảnh. Các hàm này đƣợc phân loại nhƣ sau :  Tập các cơng cụ tạo ra các đối tƣợng đồ họa cơ sở nhƣ điểm, đoạn thẳng, đƣờng cong, vùng tơ, kí tự,  Tập các cơng cụ thay đổi thuộc tính dùng để thay đổi thuộc tính của các đối tƣợng đồ họa cơ sở nhƣ màu sắc, kiểu đƣờng, kiểu chữ, mẫu tơ,  Tập các cơng cụ thực hiện các phép biến đổi hình học dùng để thay đổi kích thƣớc vị trí, hƣớng của các đối tƣợng,  Tập các cơng cụ biến đổi hệ quan sát dùng để xác định vị trí quan sát đối tƣợng và vị trí trên thiết bị hiển thị đƣợc dùng để hiển thị đối tƣợng.  Tập các cơng cụ nhập liệu : Các ứng dụng đồ họa cĩ thể sử dụng nhiều loại thiết bị nhập khác nhau nhƣ bút vẽ, bảng, chuột, bàn phím, để điều khiển và xử lí dịng dữ liệu nhập.  Cuối cùng là tập các cơng cụ chứa các thao tác dùng cho việc quản lí và điều khiển ví dụ nhƣ xĩa tồn bộ màn hình, thiết lập chế độ đồ họa, Các chuẩn phần mềm Mục tiêu căn bản của các phần mềm đồ họa đƣợc chuẩn là tính tƣơng thích. Khi các cơng cụ đƣợc thiết kế với các hàm đồ họa chuẩn, phần mềm cĩ thể đƣợc di chuyển một cách dễ dàng từ hệ phần cứng này sang hệ phần cứng khác và đƣợc dùng trong nhiều cài đặt và ứng dụng khác nhau. 10 Sau những nỗ lực khơng nhỏ của các tổ chức chuẩn hĩa của các quốc gia và quốc tế, một chuẩn cho việc phát triển các phần mềm đồ họa đã ra đời đĩ là GKS (Graphics Kernel System – Hệ đồ họa cơ sở). Hệ thống này ban đầu đƣợc thiết kế cho tập các cơng cụ đồ họa hai chiều, sau đĩ đƣợc phát triển và mở rộng cho đồ họa ba chiều. Các hàm của GKS thực sự chỉ là các mơ tả trừu tƣợng, độc lập với bất kì ngơn ngữ lập trình nào. Để cài đặt một chuẩn đồ họa cho ngơn ngữ cụ thể nào, các cú pháp tƣơng ứng sẽ đƣợc xác định và cụ thể hĩa. Mặc dù GKS xác lập đƣợc các ý tƣởng ban đầu cho các hàm đồ họa cơ sở, tuy nhiên nĩ khơng cung cấp một cách thức chuẩn cho việc giao tiếp đồ họa với các thiết bị xuất. Nĩ cũng khơng xác định các cách thức cho các mơ hình thời gian thực cũng nhƣ các cách thức lƣu trữ và chuyển đổi hình ảnh. Các chuẩn cho các cách thức này đƣợc xây dựng riêng, cụ thể là : Các chuẩn cho các cách thức giao tiếp thiết bị đƣợc cho bởi hệ CGI (Computer Graphics Interface System), hệ CGM (Computer Graphics Metafile) xác định các chuẩn cho việc lƣu trữ và chuyển đổi hình ảnh, và hệ PHIGS (Programmer’s Hierarchical Interactive Graphics Standard) xác định các cách thức chuẩn cho các mơ hình thời gian thực và các khả năng lập trình ở mức độ cao hơn mà chƣa đƣợc quan tâm tới trong GKS. TĨM TẮT Sự ra đời của đồ họa máy tính thực sự là cuộc cách mạng trong giao tiếp giữa ngƣời dùng và máy tính. Với lƣợng thơng tin trực quan, đa dạng và phong phú đƣợc chuyển tải qua hình ảnh, các ứng dụng đồ họa máy tính đã lơi cuốn nhiều ngƣời nhờ tính thân thiện, dễ dùng, kích thích khả năng sáng tạo và tăng đáng kể hiệu suất làm việc. Đồ họa máy tính ngày nay đƣợc ứng dụng rất rộng rãi trong nhiều lĩnh vực khoa học, kĩ thuật, nghệ thuật, kinh doanh, quản lí, Các ứng dụng đồ họa rất đa dạng, phong phú và phát triển liên tục khơng ngừng. Ngày nay, hầu nhƣ khơng cĩ chƣơng trình ứng dụng nào mà khơng sử dụng kĩ thuật đồ họa để làm tăng tính hấp dẫn của mình. Một hệ đồ họa bao giờ cũng cĩ hai thành phần chính đĩ là phần cứng và phần mềm.. Thành phần phần cứng bao gồm các thiết bị hiển thị (hay là thiết bị xuất) và các thiết bị nhập. Tiêu biểu nhất trong các thiết bị hiển thị là màn hình mà cơ chế hoạt động dựa trên cấu tạo của ống tia âm cực CRT. Các thiết bị nhập dữ liệu thƣờng gặp bao gồm bàn phím, chuột. Phần mềm đồ họa cĩ thể chia làm hai loại đĩ là các cơng cụ lập trình nhƣ các hàm thƣ viện của C, Pascal, GL, và các ứng dụng phục vụ cho một mục đích nào đĩ nhƣ AutoCAD, Photoshop, Hƣớng tiếp cận của chúng ta trong tài liệu này ở mức độ của ngƣời lập trình, nghĩa là chúng ta sẽ tìm hiểu các thuật tốn, các nguyên lí để xây dựng nên các ứng dụng đồ họa chứ khơng phải là học cách sử dụng các phần mềm nhƣ AutoCAD, Photoshop, BÀI TẬP 1. Cấu tạo và nguyên lí hoạt động của màn hình dạng điểm. Các khái niệm nhƣ vùng đệm khung, độ phân giải, tỉ số phƣơng, của màn hình dạng này. 2. Ý nghĩa và hoạt động của bảng tra LUT. 3. Ba màn hình cĩ độ phân giải lần lƣợt là 640x480, 1024x768, 1280x1024. Hãy cho biết kích thƣớc của vùng đệm khung (tính bằng byte) nếu mỗi pixel đƣợc mơ tả bằng 8 bit, 12 bit, 24 bit. 4. Hai màn hình cĩ độ phân giải là 640x480 và 1024x768. Cho biết số pixel đƣợc truy cập trong một giây của mỗi màn hình nếu tốc độ làm tƣơi của CRT là 60Hz. 5. Một màn hình cĩ kích thƣớc theo chiều ngang là 12 inche, chiều dọc là 9.6 inch. Hãy cho biết đƣờng kính của mỗi điểm trên màn hình nếu độ phân giải là 1280x1024 và tỉ số phƣơng là 1. 6. Hãy cho biết thơng tin trong vùng đệm khung của các hình vẽ các kí tự B, G, H, 7. Các hệ màu. Mối liên hệ giữa chúng. 8. Quy trình hiển thị đối tƣợng. Ý nghĩa của các hệ tọa độ. 9. Tập các hàm đồ họa của một cơng cụ lập trình. Liên hệ tới các thƣ viện đồ họa của các ngơn ngữ đã học nhƣ C, Pascal, 10. Tại sao cần phải chuẩn hĩa các phần mềm ? Tìm hiểu các chuẩn GKS, PHIGS. 11 CHƢƠNG 2 CÁC ĐỐI TƢỢNG ĐỒ HỌA CƠ SỞ Bất kì một ảnh mơ tả thế giới thực nào bao giờ cũng đƣợc cấu trúc từ tập các đối tƣợng đơn giản hơn. Ví dụ một ảnh thể hiện bài trí của một căn phịng sẽ đƣợc cấu trúc từ các đối tƣợng nhƣ cây cảnh, tủ kính, bàn ghế, tƣờng, ánh sáng đèn, Với các ảnh đồ họa phát sinh bằng máy tính, hình dạng và màu sắc của mỗi đối tƣợng cĩ thể đƣợc mơ tả riêng biệt bằng hai cách : hoặc là bằng dãy các pixel tƣơng ứng hoặc là bằng tập các đối tƣợng hình học cơ sở nhƣ đoạn thẳng hay vùng tơ đa giác, Sau đĩ, các ảnh sẽ đƣợc hiển thị bằng cách nạp các pixel vào vùng đệm khung. Hình 2.1 – Ảnh cánh tay robot đƣợc cấu tạo từ các đối tƣợng đồ họa cơ sở Với các ảnh đƣợc mơ tả bằng các đối tƣợng hình học cơ sở, cần phải cĩ một quá trình chuyển các đối tƣợng này về dạng ma trận các pixel trƣớc. Quá trình này cịn đƣợc gọi là quá trình chuyển đổi bằng dịng quét (scan-converting). Bất kì cơng cụ lập trình đồ họa nào cũng phải cung cấp các hàm để mơ tả một ảnh dƣới dạng các đối tƣợng hình học cơ sở hay cịn gọi là các đối tƣợng đồ họa cơ sở (output primitives) và các hàm cho phép kết hợp tập các đối tƣợng cơ sở để tạo thành đối tƣợng cĩ cấu trúc phức tạp hơn. Mỗi đối tƣợng đồ họa cơ sở đƣợc mơ tả thơng qua dữ liệu về tọa độ và các thuộc tính của nĩ, đây chính là thơng tin cho biết kiểu cách mà đối tƣợng đƣợc hiển thị. Đối tƣợng đồ họa cơ sở đơn giản nhất là điểm và đoạn thẳng, ngồi ra cịn cĩ đƣờng trịn, và các đƣờng conics, mặt bậc hai, các mặt và đƣờng splines, các vùng tơ đa giác, chuỗi kí tự, cũng đƣợc xem là các đối tƣợng đồ họa cơ sở để giúp xây dựng các ảnh phức tạp. Chƣơng này sẽ khảo sát các thuật tốn hiển thị các đối tƣợng đồ họa cơ sở cho các thiết bị hiển thị dạng điểm. Xét về mặt bản chất, các thuật tốn này thực hiện quá trình chuyển đổi các đối tƣợng đồ họa cơ sở đƣợc mơ tả trong hệ tọa độ thực về dãy các pixel cĩ tọa độ nguyên của thiết bị hiển thị. Cĩ hai yêu cầu đặt ra cho các thuật tốn này đĩ là :  Đối tƣợng đƣợc mơ tả trong hệ tọa độ thực là đối tƣợng liên tục, cịn đối tƣợng trong hệ tọa độ thiết bị là đối tƣợng rời rạc, do đĩ bản chất của quá trình chuyển đổi này chính là sự rời rạc hĩa và nguyên hĩa các đối tƣợng sao cho cĩ thể xác định các điểm nguyên xấp xỉ đối tƣợng một cách tốt nhất, thực nhất. Nghĩa là đối tƣợng hiển thị bằng lƣới nguyên trên thiết bị hiển thị phải cĩ hình dạng tƣơng tự nhƣ đối tƣợng trong lƣới tọa độ thực và “cĩ vẻ” liên tục, liền nét. Sự liên tục trên lƣới nguyên của thiết bị hiển thị cĩ đƣợc do mắt ngƣời khơng thể phân biệt đƣợc hai điểm quá gần nhau.  Do các đối tƣợng đồ họa cơ sở là thành phần chính cấu trúc các đối tƣợng phức tạp nên các thuật tốn hiển thị chúng cần phải đƣợc tối ƣu hĩa về mặt tốc độ, đây chính là điểm mấu chốt cho việc ra đời các thuật tốn khác nhau. Hình 2.2 – Quá trình chuyển đổi một đoạn thẳng về dãy các pixel tƣơng ứng 4. CÁC ĐỐI TƢỢNG ĐỒ HỌA CƠ SỞ 4.1. Hệ tọa độ thế giới thực và hệ tọa độ thiết bị 4.1.1. Hệ tọa độ thế giới thực Hệ tọa độ thế giới thực (hay hệ tọa độ thực) là hệ tọa độ đƣợc dùng mơ tả các đối tƣợng thế giới thực. Một trong các hệ tọa độ thực thƣờng đƣợc dùng nhất đĩ là hệ tọa độ Descartes. Với hệ tọa độ này, bất kì một điểm nào trong mặt phẳng cũng đƣợc mơ tả bằng một cặp tọa độ (x, y) trong đĩ x, y  R. Gốc tọa độ là điểm O cĩ tọa độ (0, 0). Các trục tọa độ cĩ chiều dƣơng đƣợc quy ƣớc nhƣ hình 2.3; Ox, Oy lần lƣợt đƣợc gọi là trục hồnh, trục tung; x là khoảng cách từ điểm đến trục hồnh hay cịn đƣợc gọi là hồnh độ, y là khoảng cách từ điểm đến trục tung hay cịn đƣợc gọi là tung độ. Các tọa độ thế giới thực cho phép ngƣời dùng sử dụng bất kì một thứ nguyên (dimension) quy ƣớc nhƣ foot, cm, mm, km, inch, ... nào và cĩ thể lớn nhỏ tùy ý. 4.1.2. Hệ tọa độ thiết bị Hệ tọa độ thiết bị là hệ tọa độ đƣợc dùng bởi một thiết bị xuất cụ thể nào đĩ nhƣ máy in, màn hình, ... Đặc điểm chung của các hệ tọa độ thiết bị đĩ là :  Các điểm trong hệ tọa độ thiết bị cũng đƣợc mơ tả bởi một cặp tọa độ (x, y), tuy nhiên điểm khác với hệ tọa độ thực là x, y  N. Điều này cho thấy các điểm trong hệ tọa độ thực đƣợc định nghĩa liên tục, cịn các điểm trong các hệ tọa độ thiết bị là rời rạc do tính chất của tập các số tự nhiên. 12 O x y P WC (x,y) x y O x y y max x max P DC (x,y) (a) (b)  Các tọa độ x, y của hệ tọa độ thiết bị khơng thể lớn tùy ý mà đều bị giới hạn trong một khoảng nào đĩ. Một số thiết bị chỉ cho x chạy trong đoạn[0,639], y chạy trong đoạn [0,479]. Khoảng giới hạn các tọa độ x, y là khác nhau đối với từng loại thiết bị khác nhau. Hình 2.3 – Hệ tọa độ thực (a) và hệ tọa độ thiết bị (b) Hệ tọa độ với các hƣớng của các trục tọa độ nhƣ trên cịn đƣợc gọi là hệ tọa độ theo quy ƣớc bàn tay phải. Ngồi ra do cách tổ chức bộ nhớ nên thơng thƣờng các hệ tọa độ thiết bị thƣờng dựa trên hệ tọa độ theo quy ƣớc bàn tay trái. Hình 2.4 - Hệ tọa độ theo quy ƣớc bàn tay phải (a) và quy ƣớc bàn tay trái (b) 4.2. Điểm Điểm là thành phần cơ sở đƣợc định nghĩa trong một hệ tọa độ. Đối với hệ tọa độ hai chiều mỗi điểm đƣợc xác định bởi cặp tọa độ (x, y). Ngồi thơng tin về tọa độ, điểm cịn cĩ thuộc tính là màu sắc. 4.3. Đoạn thẳng, đƣờng gấp khúc Một đƣờng thẳng cĩ thể xác định nếu biết hai điểm thuộc nĩ. Phƣơng trình đƣờng thẳng đi qua hai điểm (x1, y1) và (x2, y2) cĩ dạng sau : 12 12 1 1 yy xx yy xx      hay ở dạng tƣơng đƣơng :       121121 xxyyyyxx  Khai triển ta cĩ dạng : bmxy  , trong đĩ : 11 1212 ,, mxyb xxDxyyDy Dx Dy m   Đây cịn đƣợc gọi là phƣơng trình đoạn chắn của đƣờng thẳng. Nếu khai triển dƣới dạng :     0 12211212  yxyxyxxxyy và đặt   21121212 ,, yxyxCxxByyA  thì phƣơng trình đƣờng thẳng sẽ cĩ dạng 0 CByAx , dạng này đƣợc gọi là phƣơng trình tổng quát của đƣờng thẳng. Phƣơng trình tham số của đƣờng thẳng cĩ dạng các tọa độ x, y đƣợc mơ tả qua một thành phần thứ ba là t. Dạng này rất thuận tiện khi khảo sát các đoạn thẳng.         21 21 1 1 tyyty txxtx Nếu  1,0t , ta cĩ các điểm (x,y) thuộc về đoạn thẳng giới hạn bởi hai điểm (x1, y1) và (x2, y2), nếu   ,t , ta sẽ cĩ tồn bộ đƣờng thẳng. Một đoạn thẳng là một đƣờng thẳng bị giới hạn bởi hai điểm đầu, cuối. Hình 2.5 – Dạng tham số của phƣơng trình đƣờng thẳng Đƣờng gấp khúc là tập các đoạn thẳng nối với nhau một cách tuần tự. Các đoạn thẳng này khơng nhất thiết phải tạo thành O x y x y O (a) (b) (x 1 , y 1 ) (x 2 , y 2 ) t=0 t=1 t<0 t>1 13 một hình khép kín và các đoạn cĩ thể cắt lẫn nhau. Điểm giao của hai đoạn thẳng đƣợc gọi là đỉnh. Các đƣờng gấp khúc đƣợc xác định qua danh sách các đỉnh, mỗi đỉnh đƣợc cho bởi các cặp tọa độ   ii yx , . Một đa giác là một đƣờng gấp khúc cĩ điểm đầu và điểm cuối trùng nhau. Hình 2.6 – Đƣờng gấp khúc (a) và đa giác (b) Các thuộc tính của đoạn thẳng bao gồm :  Màu sắc  Độ rộng của nét vẽ.  Kiểu nét vẽ của đoạn thẳng : cĩ thể là một trong các dạng nhƣ hình 2.7. Hầu hết các cơng cụ đồ họa đều định nghĩa tập các kiểu nét vẽ đoạn thẳng cĩ thể dùng và cho phép ngƣời dùng định nghĩa kiểu đoạn thẳng của mình thơng qua một mẫu (pattern) gồm các số 0, 1. Đối với đƣờng gấp khúc, các đoạn thẳng trong cùng một đƣờng gấp khúc thì cĩ cùng một thuộc tính. Hình 2.7 – Một số kiểu nét vẽ của đoạn thẳng 4.4. Vùng tơ Một vùng tơ bao gồm đƣờng biên và vùng bên trong. Đƣờng biên là một đƣờng khép kín ví dụ nhƣ đa giác. Các thuộc tính của vùng tơ bao gồm:  Thuộc tính của đƣờng biên : chính là các thuộc tính nhƣ thuộc tính của đoạn thẳng.  Thuộc tính của vùng bên trong : bao gồm màu tơ và mẫu tơ. Hình 2.8 – Vùng tơ với các dạng đƣờng biên và mẫu tơ khác nhau 4.5. Kí tự, chuỗi kí tự Các chuỗi kí tự giúp hiển thị nội dung các thơng điệp theo một ngơn ngữ nào đĩ. Các thuộc tính của kí tự bao gồm :  Màu sắc của các kí tự.  Font chữ : bộ kí tự dùng hiển thị; Nĩ định nghĩa kiểu, kích thƣớc của kí tự hiển thị. Hình dạng của mỗi kí tự cĩ thể đƣợc xác định bởi một tập các đƣờng gấp khúc (trƣờng hợp font vector) hay là mẫu các pixel (font bitmap). Cĩ nhiều loại font khác nhau nhƣ font bitmap, font truetype, font CHR, ...  Kích thƣớc : chiều cao và chiều rộng của kí tự. Các kí tự định nghĩa bằng đƣờng gấp khúc cĩ thể dễ dàng thay đổi kích thƣớc hơn là các kí tự định nghĩa bằng mẫu các pixel.  Khoảng cách giữa các kí tự.  Sự canh chỉnh (giĩng lề) : canh trái (left text), canh phải (right text), canh giữa (center text), canh đều nhau (justify text).  Cách hiển thị tuần tự của các kí tự : cĩ thể là phải sang trái, từ trên xuống dƣới, từ trái sang phải, từ dƣới lên trên.  Hƣớng của kí tự. Hình 2.9 – Dạng bitmap và vector của font kí tự B 5. CÁC THUẬT TỐN VẼ ĐƢỜNG Giả sử tọa độ các điểm nguyên sau khi xấp xỉ đối tƣợng thực lần lƣợt là   ,...0,, iyx ii . Đây là các điểm nguyên sẽ đƣợc hiển thị trên màn hình. Bài tốn đặt ra là nếu biết đƣợc   ii yx , là tọa độ nguyên xác định ở bƣớc thứ i, điểm nguyên tiếp theo   11 ,  ii yx sẽ (a) (b) 14 đƣợc xác định nhƣ thế nào. Nhận xét rằng để đối tƣợng hiển thị trên lƣới nguyên đƣợc liền nét, các điểm mà   11 ,  ii yx cĩ thể chọn chỉ là một trong tám điểm đƣợc đánh số từ 1 đến 8 trong hình 2.10 (điểm đen chính là   ii yx , ).Hay nĩi cách khác :    1,1, 11  iiii yxyx . Dáng điệu của đƣờng sẽ cho ta gợi ý khi chọn một trong tám điểm trên. Cách chọn các điểm nhƣ thế nào sẽ tùy thuộc vào từng thuật tốn trên cơ sở xem xét tới vấn đề tối ƣu tốc độ. Hình 2.10 – Các điểm   11 ,  ii yx cĩ thể chọn ở bƣớc (i+1) 5.1. Thuật tốn vẽ đoạn thẳng Xét đoạn thẳng cĩ hệ số gĩc 10  m và 0Dx . Với các đoạn thẳng dạng này, nếu   ii yx , là điểm đã xác định đƣợc ở bƣớc thứ i (điểm màu đen) thì điểm cần chọn   11 ,  ii yx ở bƣớc thứ (i+1) sẽ là một trong hai trƣờng hợp nhƣ hình vẽ sau : Hình 2.11 – Các điểm   11 ,  ii yx chọn ở bƣớc (i+1) cho trƣờng hợp đoạn thẳng cĩ hệ số gĩc 0<m<1 Nhƣ vậy :         1, 1 1 1 iii ii yyy xx Vấn đề cịn lại là cách chọn một trong hai điểm trên nhƣ thế nào để cĩ thể tối ƣu về mặt tốc độ. 5.1.1. Thuật tốn DDA (Digital Differential Analyzer) Với thuật tốn DDA, việc quyết định chọn 1iy là iy hay 1iy , dựa vào phƣơng trình của đoạn thẳng bmxy  . Nghĩa là, ta sẽ tính tọa độ của điểm  yx i ,1 thuộc về đoạn thẳng thực. Tiếp đĩ, 1iy sẽ là giá trị sau khi làm trịn giá trị tung độ y. Nhƣ vậy :    yRoundy bxmy i i   1 1 Hình 2.12 – Minh họa thuật tốn DDA Nếu tính trực tiếp giá trị thực y ở mỗi bƣớc từ phƣơng trình bmxy  thì phải cần một phép tốn nhân và một phép tốn cộng số thực. Để cải thiện tốc độ, ngƣời ta tính giá trị thực của y ở mỗi bƣớc theo cách sau để khử phép tính nhân trên số thực : Nhận xét rằng :   bxmbmxy iisau   11 bmxy itrước  myy trướcsau  Lƣu đồ thuật tốn DDA vẽ đoạn thẳng qua hai điểm (x1, y1) và (x2,y2) 1 23 876 5 4 (x i +1, y i +1) 1 2 (x i +1, y i ) x i y i (x i , y i ) (x i +1, y) (x i +1, Round(y)) Begin m=Dy/Dx; x=x1; y=y1; putpixel(x, Round(y), c); x<x2 Yes No x=x+1; y=y+m; putpixel(x, Round(y),c); End 15 Cài đặt minh họa thuật tốn DDA #define Round(a) int(a+0.5) int Color = GREEN; void LineDDA (int x1, int y1, int x2, int y2) { int x = x1; float y = y1; float m = float(y2-y1)/(x2-x1); putpixel(x, Round(y), Color); for(int i=x1; i<x2; i++) { x++; y +=m; putpixel(x, Round(y), Color); } } // LineDDA Nhận xét  Việc sử dụng cơng thức myy trướcsau  để tính giá trị y tại mỗi bƣớc đã giúp cho thuật tốn DDA nhanh hơn hẳn so với cách tính y từ phƣơng trình bmxy  do khử đƣợc phép nhân trên số thực. Tuy nhiên, việc cộng dồn giá trị thực m vào y cĩ thể sẽ tích lũy sai số làm cho hàm làm trịn cĩ kết quả sai dẫn tới việc xác định vị trí của điểm vẽ ra bị chệch hƣớng so với đƣờng thẳng thực. Điều này chỉ xảy ra khi vẽ đoạn thẳng khá dài.  Tuy đã khử đƣợc phép nhân số thực nhƣng thuật tốn DDA vẫn cịn bị hạn chế về mặt tốc độ do vẫn cịn phép tốn cộng số thực và làm trịn. Cĩ thể khắc phục thao tác cộng số thực m và làm trịn trong thuật tốn bằng cách nhận xét Dx Dy m  với Dy, Dx là các số nguyên. 5.1.2. Thuật tốn Bresenham Thuật tốn Bresenham đƣa ra cách chọn 1iy là iy hay 1iy theo một hƣớng khác sao cho cĩ thể tối ƣu hĩa về mặt tốc độ so với thuật tốn DDA. Vấn đề mấu chốt ở đây là làm thế nào để hạn chế tối đa các phép tốn trên số thực trong thuật tốn. Hình 2.13 – Minh họa thuật tốn Bresenham Gọi  yx i ,1 là điểm thuộc đoạn thẳng. Ta cĩ:   bxmy i  1 . Đặt   yyd yyd i i   1 2 1 Xét tất cả các vị trí tƣơng đối của y so với i y và 1 i y , việc chọn điểm   11 ,  ii yx là S hay P phụ thuộc vào việc so sánh d1 và d2 hay dấu của 21 dd  :  Nếu 0 21  dd , ta sẽ chọn điểm S, tức là ii yy 1 .  Ngƣợc lại, nếu 0 21  dd , ta sẽ chọn điểm P, tức là 1 1  ii yy . Xét    122 21  ii yyDxddDxp    1212  iii ybxmDxp (x i +1, y) P S x i x i +1 y i y i +1 y d 1 d 2 16 Thay Dx Dy m  vào phƣơng trình trên ta đƣợc : cDxyDyxp iii  22 , với  DxbDyc 122  . Nhận xét rằng do 0Dx nên dấu của biểu thức 21 dd  cũng chính là dấu của i p . Hay nĩi một cách khác, nếu tại bƣớc thứ i ta xác định đƣợc dấu của i p thì xem nhƣ ta xác định đƣợc điểm cần chọn ở bƣớc (i+1). Vấn đề cịn lại là làm thế nào để tính đƣợc i p tại mỗi bƣớc thật nhanh. Ta cĩ :    cDxyDyxcDxyDyxpp iiiiii   2222 111     iiiiii yyDxxxDypp   111 22   1 do ,22 111   iiiiii xxyyDxDypp Từ đây ta cĩ thể suy ra cách tính 1ip từ ip nhƣ sau :  Nếu 0 i p thì Dypp ii 2 1  do ta chọn ii yy 1 .  Ngƣợc lại, nếu 0 i p , thì DxDypp ii 22 1  , do ta chọn 11  ii yy . Giá trị 0 p đƣợc tính từ điểm vẽ đầu tiên   00 , yx theo cơng thức :  DxbDyDxyDyxcDxyDyxp 1222222 00000  Do   00 , yx là điểm nguyên thuộc về đoạn thẳng nên ta cĩ bx Dx Dy bmxy  000 . Thế vào phƣơng trình trên ta suy ra : DxDyp  2 0 . Lƣu đồ thuật tốn Bresenham Begin p=2Dy-Dx; Const1=2Dy; Const2=2(Dy-Dx); x=x1; y=y1; putpixel(x, y, c); x<x2 Yes No p<0 Yes p=p+Const1; No p=p+Const2; y=y+1 x=x+1; putpixel(x,y,c); End 17 Cài đặt minh họa thuật tốn Bresenham void LineBres (int x1, int y1, int x2, int y2) { int Dx, Dy, p, Const1, Const2; int x, y; Dx = x2 - x1; Dy = y2 - y1; p = 2*Dy - Dx; // Dy <<1 - Dx Const1 = 2*Dy; // Dy <<1 Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1 x = x1; y = y1; putpixel(x, y, Color); for(i=x1; i<x2; i++) { if (p<0) p += Const1; else { p += Const2; y++; } x++; putpixel(x, y, Color); } } // LineBres Nhận xét  Thuật tốn Bresenham chỉ làm việc trên số nguyên và các thao tác trên số nguyên chỉ là phép cộng và phép dịch bit (phép nhân 2) điều này là một cải tiến làm tăng tốc độ đáng kể so với thuật tốn DDA. Ý tƣởng chính của thuật tốn nằm ở chỗ xét dấu i p để quyết định điểm kế tiếp, và sử dụng cơng thức truy hồi ii pp 1 để tính ip bằng các phép tốn đơn giản trên số nguyên.  Thuật tốn này cho kết quả tƣơng tự nhƣ thuật tốn DDA. 5.1.3. Thuật tốn MidPoint Thuật tốn MidPoint đƣa ra cách chọn 1iy là iy hay 1iy bằng cách so sánh điểm thực Q  yx i ,1 với điểm MidPoint là trung điểm của S và P. Ta cĩ :  Nếu điểm Q nằm dƣới điểm MidPoint, ta chọn S.  Ngƣợc lại nếu điểm Q nằm trên điểm MidPoint ta chọn P. Hình 2.14 – Minh họa thuật tốn MidPoint Ta cĩ dạng tổng quát của phƣơng trình đƣờng thẳng : 0 CByAx với   21121212 ,, yxyxCxxByyA  Đặt   CByAxyxF , , ta cĩ nhận xét : Q(x i +1, y) P S x i x i +1 y i y i +1 MidPoint 18               thẳng. đường dưới phía nằm yx, nếu,0 thẳng đường vềthuộc yx, nếu,0 thẳng đường trên phía nằm yx, nếu,0 , yxF Lúc này việc chọn các điểm S, P ở trên đƣợc đƣa về việc xét dấu của          2 1 ,12MidPoint2 iii yxFFp .  Nếu 0 i p , điểm MidPoint nằm phía trên đoạn thẳng. Lúc này điểm thực Q nằm dƣới điểm MidPoint nên ta chọn S, tức là ii yy 1 .  Ngƣợc lại, nếu 0 i p , điểm MidPoint nằm phía dƣới đoạn thẳng. Lúc này điểm thực Q nằm trên điểm MidPoint nên ta chọn P, tức là 1 1  ii yy . Mặt khác :               2 1 ,12 2 1 ,12 111 iiiiii yxFyxFpp                               CyBxACyBxApp iiiiii 2 1 12 2 1 12 111     iiiiii yyDxDyyyBApp   111 2222 Vậy :  Dypp ii 2 1  , nếu 0ip do ta chọn ii yy 1 .  DxDypp ii 22 1  , nếu 0ip do ta chọn 11  ii yy . Ta tính giá trị 0 p ứng với điểm ban đầu  00 , yx , với nhận xét rằng  00 , yx là điểm thuộc về đoạn thẳng, tức là cĩ : 0 00  CByAx                      CyBxAyxFp 2 1 12 2 1 ,12 00000   DxDyBABACByAxp  2222 000 Nhận xét rằng thuật tốn MidPoint cho kết quả tƣơng tự nhƣ thuật tốn Bresenham. 5.2. Thuật tốn vẽ đƣờng trịn Phƣơng trình đƣờng trịn cĩ tâm là gốc tọa độ, bán kính R là : 222 Ryx  . Từ phƣơng trình này ta cĩ thể đƣa về dạng 22 xRy  . Để vẽ các đƣờng trịn cĩ tâm   CC yx , bất kì, đơn giản chỉ cần tịnh tiến các điểm sau khi vẽ xong đƣờng trịn cĩ tâm là gốc tọa độ theo vector tịnh tiến   CC yx , . 5.2.1. Một số cách tiếp cận vẽ đƣờng trịn Do tính đối xứng nên để vẽ tồn bộ đƣờng trịn, ta chỉ cần vẽ cung ¼ đƣờng trịn sau đĩ lấy đối xứng để xác định các điểm cịn lại. Một trong những cách đơn giản nhất là cho x chạy từ 0 đến R, sau đĩ tính y từ cơng thức trên (chỉ lấy giá trị dƣơng) rồi làm trịn để xác định giá trị nguyên tƣơng ứng. Cách làm này khơng hiệu quả do gặp phải các phép tốn nhân và lấy căn làm hạn chế tốc độ, ngồi ra đƣờng trịn vẽ ra theo cách này cĩ thể khơng liền nét (trừ trƣờng hợp R lớn) khi x gần R (do chỉ cĩ một giá trị y duy nhất cho một giá trị x). Chúng ta cĩ thể khắc phục điều này bằng cách điều chỉnh đối tƣợng thay đổi là x (rồi tính y theo x) hay y (rồi tính x theo y) tùy vào giá trị tuyệt đối của hệ số gĩc đƣờng trịn là lớn hơn hay nhỏ hơn 1, nhƣng cách làm này địi hỏi thêm các phép tính tốn và kiểm tra nên làm cho thuật tốn phức tạp thêm. (Xem hình 2.15) Một cách tiếp cận khác là vẽ các điểm     ,sin,cos  RR với  chạy từ 00 đến 90 0. Cách này sẽ khắc phục hạn chế đƣờng khơng liền nét của thuật tốn trên, tuy nhiên điểm hạn chế chính của thuật tốn này đĩ là chọn bƣớc nhảy cho  nhƣ thế nào cho phù hợp khi bán kính thay đổi. Hình 2.15 – Đƣờng trịn vẽ ra khơng liền nét theo cách vẽ trên 5.2.2. Thuật tốn MidPoint Do tính đối xứng của đƣờng trịn (C) nên ta chỉ cần vẽ cung (C1/8) là cung 1/8 đƣờng (0,17) (17,0) 19 trịn, sau đĩ lấy đối xứng. Cung (C1/8) đƣợc mơ tả nhƣ sau (cung của phần tơ xám trong hình vẽ) :          RyR Rx 2 2 2 2 0 Hình 2.16 – Các vị trí đối xứng trên đƣờng trịn (C) tƣơng ứng với (x,y) Nhƣ vậy nếu cĩ (x, y)  (C1/8) thì các điểm : (y, x), (y,-x), (x,-y), (-x,-y), (-y,- x), (-y,x), (-x,y) sẽ thuộc (C). Chọn điểm bắt đầu để vẽ là điểm (0,R). Dựa vào hình vẽ, nếu   ii yx , là điểm nguyên đã tìm đƣợc ở bƣớc thứ i, thì điểm   11 ,  ii yx ở bƣớc thứ (i+1) là sự lựa chọn giữa S và P. Nhƣ vậy :         1, 1 1 1 iii ii yyy xx Tƣơng tự nhƣ thuật tốn MidPoint vẽ đoạn thẳng, việc quyết định chọn một trong hai điểm S và P sẽ đƣợc thực hiện thơng qua việc xét dấu của một hàm nào đĩ tại điểm MidPoint là điểm nằm giữa chúng. Hình 2.17 – Thuật tốn MidPoint vẽ đƣờng trịn Đặt   222, RyxyxF  , ta cĩ :               tròn. đường ngoài nằm yx, nếu,0 tròn đường trên nằm yx, nếu,0 tròn đường trong nằm yx, nếu,0 , yxF Xét          2 1 ,1MidPoint iii yxFFp . Ta cĩ :  Nếu 0 i p , điểm MidPoint nằm trong đƣờng trịn. Lúc này điểm thực Q gần S hơn nên ta chọn S, tức là ii yy 1 .  Ngƣợc lại, nếu 0 i p , điểm MidPoint nằm ngồi đƣờng trịn. Lúc này điểm thực Q gần P hơn nên ta chọn P, tức là 1 1  ii yy . Mặt khác :               2 1 ,1 2 1 ,1 111 iiiiii yxFyxFpp                                    2 2 22 2 1 2 11 2 1 1 2 1 1 RyxRyxpp iiiiii                                    2 2 22 2 1 2 1 2 1 1 2 1 2 RyxRyxpp iiiiii     iiiiiii yyyyxpp   1 22 11 32 Vậy :  32 1  iii xpp , nếu 0ip do ta chọn ii yy 1 .  522 1  iiii yxpp , nếu 0ip do ta chọn 11  ii yy . Ta tính giá trị 0 p ứng với điểm ban đầu    Ryx ,0, 00  . RRFyxFp              4 5 2 1 ,1 2 1 ,1 000 2 R (x,y)(-x,y) (y,x)(-y,x) (x,-y)(-x,-y) (-y,-x) (y,-x) S P MidPoint y i y i -1 x i x i +1 Q(x i +1, y) 20 Lƣu đồ thuật tốn MidPoint vẽ đƣờng trịn Cài đặt minh họa thuật tốn MidPoint vẽ đƣờng trịn // Ve 8 diem doi xung void Put8Pixel(int x, int y) { putpixel(x, y, Color); putpixel(y, x, Color); putpixel(y, -x, Color); putpixel(x, -y, Color); putpixel(-x, -y, Color); putpixel(-y, -x, Color); putpixel(-y, x, Color); putpixel(-x, y, Color); } // Put8Pixel void CircleMidPoint (int R) Begin p=5/4-R; x=0; y=R; Put8Pixel(x, y, c); x<y Yes No p<0 Yes p=p+2*x+3; No p=p+2(x-y)+5; y=y-1 x=x+1; Put8Pixel(x,y,c); End 21 { int x, y; x = 0; y = R; Put8Pixel(x, y); p = 1 - R; // 5/4-R while (x < y) { if (p < 0) p += 2*x + 3; else { p += 2*(x -y) + 5; y--; } x++; Put8Pixel(x, y); } } // CircleMidPoint 5.3. Thuật tốn vẽ các đƣờng conics và một số đƣờng cong khác Phƣơng trình tổng quát của các đƣờng conics cĩ dạng : 022  FEyDxCyBxyAx . Giá trị của các hằng số A, B, C, D, E, F sẽ quyết định dạng của đƣờng conics, cụ thể là nếu:          hyperbol. dạng ,0 parabol dạng ,0 ellipse hay ) 0B và C A(nếu tròn đường dạng ,0 4 2 ACB Ta sẽ áp dụng ý tƣởng của thuật tốn MidPoint để vẽ các đƣờng conics và một số đƣờng cong khác, theo các bƣớc tuần tự sau: Bƣớc 1 : Dựa vào dáng điệu và phƣơng trình đƣờng cong, để xem thử cĩ thể rút gọn phần đƣờng cong cần vẽ hay khơng. Điều này sẽ làm tăng tốc độ vẽ so với việc phải vẽ tồn bộ đƣờng cong. Một trong những cách đơn giản nhất là dựa vào tính đối xứng, tính chất của hàm chẵn, hàm lẻ,  Bƣớc 2 : Tính đạo hàm để từ đĩ phân thành các vùng vẽ :  Nếu 1)('0  xf thì         (*) 1, 1 1 1 iii ii yyy xx  Nếu 0)('1  xf thì         (*) 1, 1 1 1 iii ii yyy xx  Nếu 1)(' xf thì         (*) 1, 1 1 1 iii ii xxx yy  Nếu 1)(' xf thì         (*) 1, 1 1 1 iii ii xxx yy Đây là bƣớc quan trọng vì với việc xác định đối tƣợng x hay y biến thiên theo dáng điệu của đƣờng cong sẽ đảm bảo đƣờng sau khi đƣợc vẽ ra sẽ liền nét, khơng bị hở. 22 Bƣớc 3 : Xác định cơng thức của i p cho từng trƣờng hợp để quyết định (*) dựa trên dấu của i p . i p thƣờng là hàm đƣợc xây dựng từ phƣơng trình đƣờng cong để cho 0 i p nếu   ii yx , thuộc về đƣờng cong. Việc chọn i p cần phải chú ý sao cho thao tác tính i p sau này hạn chế phép tốn trên số thực. Bƣớc 4 : Tìm mối liên quan của 1ip và ip bằng cách xét hiệu ii pp 1 . Bƣớc 5 : Tính 0 p và hồn chỉnh thuật tốn. 6. CÁC THUẬT TỐN TƠ MÀU Các vùng tơ là một trong những đối tƣợng đồ họa cơ sở đƣợc hầu hết các cơng cụ lập trình đồ họa hỗ trợ. Cĩ hai dạng vùng tơ thƣờng gặp đĩ là : tơ bằng một màu thuần nhất (solid fill) hay tơ theo một mẫu tơ (fill-pattern) nào đĩ. Một vùng tơ thƣờng đƣợc xác định bởi một đƣờng khép kín nào đĩ gọi là đƣờng biên. Một trong những dạng đƣờng biên đơn giản nhất đĩ là đa giác. Để tơ màu một vùng tơ, ngƣời ta thƣờng chia làm hai cơng đoạn : cơng đoạn thứ nhất là xác định các điểm nào để tơ và cơng đoạn cịn lại đơn giản hơn đĩ là quyết định tơ các điểm đĩ bằng giá trị màu nào. Cơng đoạn thứ hai chỉ thực sự phức tạp nếu ta tơ theo một mẫu tơ nào đĩ khơng phải là tơ thuần một màu. Cĩ hai cách tiếp cận chính để tơ màu một vùng tơ đối với thiết bị hiển thị dạng điểm đĩ là : tơ theo dịng quét (scan-line fill) và tơ dựa theo đƣờng biên (boundary fill). Phƣơng pháp tơ theo dịng quét sẽ xác định các phần giao của các dịng quét kế tiếp nhau với đƣờng biên của vùng tơ, sau đĩ sẽ tơ màu các điểm thuộc về phần giao này. Cách tiếp cận này thƣờng đƣợc dùng để tơ màu các đa giác, đƣờng trịn, ellipse, và một số đƣờng cong đơn giản khác. Phƣơng pháp tơ dựa theo đƣờng biên sẽ bắt đầu từ một điểm ở bên trong vùng tơ và từ đĩ loang dần ra cho tới khi ta gặp các điểm biên. Cách tiếp cận này thƣờng đƣợc dùng cho các vùng tơ cĩ dạng đƣờng biên phức tạp hơn. 6.1. Thuật tốn tơ màu dựa theo dịng quét Giả sử vùng tơ đƣợc cho bởi một đa giác N đỉnh :   1,...0,,  NiyxP iii . Đa giác này cĩ thể là đa giác lồi, đa giác lõm, và cả đa giác tự cắt, Hình 2.18 sau minh họa ý tƣởng chính của thuật tốn. Với mỗi dịng quét, ta sẽ xác định phần giao của đa giác và dịng quét rồi tơ màu các pixel thuộc đoạn giao đĩ. Để xác định các đoạn giao ta tiến hành việc tìm giao điểm của dịng quét với các cạnh của đa giác, sau đĩ các giao điểm này sẽ đƣợc sắp theo thứ tự tăng dần của hồnh độ giao điểm. Các đoạn giao chính là các đoạn thẳng đƣợc giới hạn bởi từng cặp giao điểm một, ví dụ nhƣ (0,1), (2,3), . Hình 2.18 – Thuật tốn scan-line với một dịng quét nào đĩ Ta cĩ thể tĩm bắt các bƣớc chính của thuật tốn :  Tìm top y , bottom y lần lƣợt là giá trị lớn nhất, nhỏ nhất của tập các tung độ của các đỉnh của đa giác đã cho   Pyxyy iiitop  ,,max ,   Pyxyy iiibottom  ,,min .  Ứng với mỗi dịng quét ky  , với k thay đổi từ bottom y đến top y , lặp :  Tìm tất cả các hồnh độ giao điểm của dịng quét ky  với các cạnh của đa giác.  Sắp xếp các hồnh độ giao điểm theo thứ tự tăng dần : x0, x1,  Tơ màu các đoạn thẳng trên đƣờng thẳng ky  lần lƣợt đƣợc giới hạn bởi các cặp       1223210 ,,...,,,, kk xxxxxx . Nếu chỉ dừng ở mức này và chuyển sang cài đặt, chúng ta sẽ gặp một số vấn đề sau :  Nhận xét rằng, ứng với mỗi dịng quét, khơng phải lúc nào tất cả các cạnh của đa giác cũng tham gia cắt dịng quét. Do đĩ để cải thiện tốc độ cần phải cĩ một cách nào đĩ để hạn chế đƣợc số cạnh cần tìm giao điểm ứng với mỗi dịng quét.  Việc tìm giao điểm của cạnh đa giác với mỗi dịng quét sẽ gặp các phép tốn phức tạp nhƣ nhân, chia, trên số thực nếu ta dùng cách giải hệ phƣơng trình tìm giao điểm. Điều này sẽ làm giảm tốc độ thuật tốn khi phải lặp đi lặp lại nhiều lần thao tác này khi dịng quét quét qua đa giác.  Nếu số giao điểm tìm đƣợc giữa các cạnh đa giác và dịng quét là lẻ thì việc nhĩm từng cặp giao điểm kế tiếp nhau để hình thành các đoạn tơ cĩ thể sẽ khơng chính xác. Điều này chỉ xảy ra khi dịng quét đi ngang qua các đỉnh của đa giác. Nếu tính số giao điểm tại đỉnh dịng quét đi ngang qua là hai thì cĩ thể sẽ cho kết quả tơ khơng chính xác nhƣ trong trƣờng hợp của hình 2.19. Ngồi ra, việc tìm giao điểm của dịng quét với các cạnh nằm ngang là một trƣờng hợp đặc biệt cần phải cĩ cách xử lí thích hợp. O y 0 1 2 3 x y bottom y top 23 Để giải quyết các vấn đề trên, cần phải xây dựng một cấu trúc dữ liệu và thuật tốn thích hợp đối với chúng. Hình 2.19 – Dịng quét y=k2 đi ngang qua đỉnh cĩ thể sẽ cho kết quả tơ khơng chính xác so với dịng quét y=k1 6.1.1. Danh sách các cạnh kích hoạt AET (Active Edge Table) Để hạn chế số cạnh cần tìm giao điểm ứng với mỗi dịng quét, ta xây dựng một số cấu trúc dữ liệu nhƣ sau : Cạnh đa giác (EDGE) Mỗi cạnh của đa giác đƣợc xây dựng từ hai đỉnh kề nhau   iii yxP , và   111 ,  iii yxP gồm các thơng tin sau :  Min y : giá trị tung độ nhỏ nhất trong 2 đỉnh của cạnh.  xIntersect : hồnh độ giao điểm của cạnh với dịng quét hiện đang xét.  DxPerScan : giá trị 1/m (m là hệ số gĩc của cạnh).  deltaY : khoảng cách từ dịng quét hiện hành tới đỉnh Max y . Danh sách các cạnh kích hoạt AET Danh sách này dùng để lƣu các tập cạnh của đa giác cĩ thể cắt ứng với dịng quét hiện hành và tập các điểm giao tƣơng ứng. Nĩ cĩ một số đặc điểm :  Các cạnh trong danh sách đƣợc sắp theo thứ tự tăng dần của các hồnh độ giao điểm để cĩ thể tơ màu các đoạn giao một cách dễ dàng.  Thay đổi ứng với mỗi dịng quét đang xét, do đĩ danh sách này sẽ đƣợc cập nhật liên tục trong quá trình thực hiện thuật tốn. Để hỗ trợ cho thao tác này, đầu tiên ngƣời ta sẽ tổ chức một danh sách chứa tồn bộ các cạnh của đa giác gọi là ET (Edge Table) đƣợc sắp theo thứ tự tăng dần của Min y , rồi sau mỗi lần dịng quét thay đổi sẽ di chuyển các cạnh trong ET thỏa điều kiện sang AET.  Một dịng quét ky  chỉ cắt một cạnh của đa giác khi và chỉ khi      0deltaY yk Min . Chính vì vậy mà với cách tổ chức của ET (sắp theo thứ tự tăng dần của Min y ) điều kiện để chuyển các cạnh từ ET sang AET sẽ là Min yk  ; và điều kiện để loại một cạnh ra khỏi AET là 0deltaY . Hình 2.20 – Thơng tin của một cạnh 6.1.2. Cơng thức tìm giao điểm nhanh Nếu gọi k x , 1kx lần lƣợt là các hồnh độ giao điểm của một cạnh nào đĩ với các dịng quét ky  và 1 ky , ta cĩ :    m kk m xx kk 1 1 1 1  hay m xx kk 1 1  . Nhƣ vậy nếu lƣu hồnh độ giao điểm ứng với dịng quét trƣớc lại, cùng với hệ số gĩc của cạnh, ta cĩ thể dễ dàng xác định hồnh độ giao điểm ứng với dịng quét kế tiếp một cách đơn giản theo cơng thức trên. Điều này rút gọn đáng kể thao tác tìm giao điểm của cạnh ứng với dịng quét. Chính vì vậy mà trong thơng tin của một cạnh chúng ta cĩ hai biến DxPerScan và xIntersect. Hình 2.21 – Cơng thức tìm giao điểm nhanh 6.1.3. Giải quyết trƣờng hợp dịng quét đi ngang qua đỉnh Ngƣời ta đƣa ra quy tắc sau để tính số giao điểm khi dịng quét đi ngang qua đỉnh :  Tính một giao điểm nếu chiều của hai cạnh kề của đỉnh đĩ cĩ xu hƣớng tăng hay giảm.  Tính hai giao điểm nếu chiều của hai cạnh kề của đỉnh đĩ cĩ xu hƣớng thay đổi, nghĩa là tăng-giảm hay giảm-tăng. y=k 1 y=k 2 0 1,2 3 4 0 1,2 3 yMin xIntersect y=k deltaY y=k+1 y=k x k x k+1 24 Hình 2.22 – Quy tắc tính một giao điểm (a) và hai giao điểm (b) Khi cài đặt để khỏi phải xét điều kiện này cho phức tạp, khi xây dựng dữ liệu cho mỗi cạnh trƣớc khi đƣa vào ET, ngƣời ta sẽ xử lí các cạnh cĩ đỉnh tính hai giao điểm bằng cách loại đi một pixel trên cùng của một trong hai cạnh nhƣ hình 2.23 : Hình 2.23 – Cạnh ii PP 1 đƣợc lƣu trong ET chỉ là * 1 ii PP Cài đặt minh họa sau sử dụng chung một danh sách EDGELIST cho cả ET và AET. AET đƣợc quản lí nhờ vào hai con trỏ FirstId và LastId. Cài đặt minh họa thuật tốn tơ màu scan-line #include #include #include #include #include #define MAXVERTEX 20 #define MAXEDGE 20 #define TRUE 1 #define FALSE 0 typedef struct { int x; int y; }POINT; typedef struct{ int NumVertex; POINT aVertex[MAXVERTEX]; }POLYGON; typedef struct { int NumPt; float xPt[MAXEDGE]; }XINTERSECT; typedef struct { int yMin; // Gia tri y nho nhat cua 2 dinh (a) (b) P i P i-1 P i+1 P i P i-1 P i+1 P i-1 P i-1 P i+1 P i+1 P i P i y=k P i-1 P i P i+1 y=k-1 P i+1 y=k P i-1 P i P i+1 y=k-1 P i+1 P i * P i * P i-1 P i-1 25 float xIntersect; // Hoanh do giao diem cua canh & dong quet float dxPerScan; // Gia tri 1/m int DeltaY; }EDGE; typedef struct { int NumEdge; EDGE aEdge[MAXEDGE]; }EDGELIST; /* Dat 1 canh vao danh sach canh. Cac canh duoc sap theo thu tu giam dan cua yMin (yMin la gia tri y lon nhat cua 2 dinh 1 canh) Xu li luon truong hop dong quet di ngang qua dinh ma tai do chi tinh 1 diem giao */ void PutEdgeInList(EDGELIST &EdgeList, POINT p1, POINT p2, int NextY) { EDGE EdgeTmp; EdgeTmp.dxPerScan = float(p2.x-p1.x)/(p2.y-p1.y); // 1/m if(p1.y < p2.y) { /* Truong hop dong quet di ngang qua dinh la giao diem cua 2 canh co huong y cung tang */ if(p2.y < NextY) { p2.y--; p2.x -= EdgeTmp.dxPerScan; } EdgeTmp.yMin = p1.y; EdgeTmp.xIntersect= p1.x; EdgeTmp.DeltaY = abs(p2.y-p1.y)+1; } // if else { /* Truong hop dong quet di ngang qua dinh la giao diem cua 2 canh co huong y cung giam */ if(p2.y > NextY) { p2.y++; p2.x+= EdgeTmp.dxPerScan; 26 } EdgeTmp.yMin = p2.y; EdgeTmp.xIntersect= p2.x; EdgeTmp.DeltaY = abs(p2.y-p1.y)+1; }//else // xac dinh vi tri chen int j = EdgeList.NumEdge; while((j>0) && (EdgeList.aEdge[j-1].yMin>EdgeTmp.yMin)) { EdgeList.aEdge[j] = EdgeList.aEdge[j-1]; j--; } // tien hanh chen dinh moi vao canh EdgeList.NumEdge++; EdgeList.aEdge[j] = EdgeTmp; } // PutEdgeInList /* Tim dinh ke tiep sao cho khong nam tren cung duong thang voi dinh dang xet */ int FindNextY(POLYGON P, int id) { int j = (id+1)%P.NumVertex; while((j<P.NumVertex)&&(P.aVertex[id].y == P.aVertex[j].y)) j++; if(j<P.NumVertex) return (P.aVertex[j].y); return 0; } // FindNextY // Tao danh sach cac canh tu polygon da cho void MakeSortedEdge(POLYGON P, EDGELIST &EdgeList, int &TopScan, int &BottomScan) { TopScan = BottomScan = P.aVertex[0].y; EdgeList.NumEdge = 0; for(int i=0; i<P.NumVertex; i++) { // Truong hop canh khong phai la canh nam ngang if(P.aVertex[i].y != P.aVertex[i+1].y) PutEdgeInList(EdgeList, P.aVertex[i], P.aVertex[i+1], FindNextY(P, i+1)); //else Xu li truong hop canh nam ngang if(P.aVertex[i+1].y > TopScan) TopScan = P.aVertex[i+1].y; } BottomScan = EdgeList.aEdge[0].yMin; } //MakeSortedEdge // Cap nhat lai hai con tro FirstId, LastId cho biet danhsach cac canh active 27 void UpdateActiveEdgeList(EDGELIST EdgeList, int yScan, int &FirstId, int &LastId) { while((FirstId<EdgeList.NumEdge-1) &&(EdgeList.aEdge[FirstId].DeltaY == 0)) FirstId++; while((LastId<EdgeList.NumEdge-1) &&(EdgeList.aEdge[LastId+1].yMin<=yScan)) LastId++; } // UpdateActiveEdgeList void SortOnX(XINTERSECT & aIntersectPt) { for(int i=0; i<aIntersectPt.NumPt-1; i++) { int Min = i, t; for(int j=i+1; j<aIntersectPt.NumPt; j++) if( aIntersectPt.xPt[j] < aIntersectPt.xPt[Min]) Min = j; t = aIntersectPt.xPt[Min]; aIntersectPt.xPt[Min] = aIntersectPt.xPt[i]; aIntersectPt.xPt[i] = t; } } // SortOnX /* Tim cac hoanh do giao diem cua cac canh cua da giac voi dong quet yScan. Sau khi tim cac hoanh do giao diem, ta sap xep lai theo chieu tang cua x */ void FindXIntersection(EDGELIST EdgeList, XINTERSECT &aIntersectPt, int FirstId, int LastId) { aIntersectPt.NumPt = 0; for(int i=FirstId; i<=LastId; i++) { if(EdgeList.aEdge[i].DeltaY>0) { aIntersectPt.xPt[aIntersectPt.NumPt] = EdgeList.aEdge[i].xIntersect; aIntersectPt.NumPt++; } } SortOnX(aIntersectPt); } //FindXIntersection #define Round(x) int(x+0.5) void FillLine(XINTERSECT aIntersectPt, int yScan) { for(int i=0; i<aIntersectPt.NumPt; i+=2) line(Round(aIntersectPt.xPt[i]), yScan, Round(aIntersectPt.xPt[i+1]), yScan); } // FillLine void UpdateEdgeList(EDGELIST &EdgeList,int FirstId,int LastId) { 28 for(int i=FirstId; i<=LastId; i++) { if(EdgeList.aEdge[i].DeltaY>0) { EdgeList.aEdge[i].DeltaY--; EdgeList.aEdge[i].xIntersect += EdgeList.aEdge[i].dxPerScan; } } } //FillLine void ScanLineFill(POLYGON P) { EDGELIST EdgeList; XINTERSECT aIntersectPt; int TopScan, BottomScan, FirstId, LastId; MakeSortedEdge(P, EdgeList, TopScan, BottomScan); FirstId = LastId = 0; for(int i=BottomScan; i<=TopScan; i++) { // Cap nhat lai danh sach cac canh active - tuc la cac canh cat dong quet i UpdateActiveEdgeList(EdgeList, i, FirstId, LastId); // Tim cac hoanh do giao diem cua dong quet voi cac canh cua da giac va sap xep lai cac hoanh do giao diem truc tiep tren EdgeList FindXIntersection(EdgeList, aIntersectPt, FirstId, LastId); FillLine(aIntersectPt, i); UpdateEdgeList(EdgeList, FirstId, LastId); } } //ScanLineFill 29 Lƣu đồ thuật tốn tơ màu theo dịng quét 6.2. Thuật tốn tơ màu dựa theo đƣờng biên Khác với thuật tốn tơ màu dựa theo dịng quét, đƣờng biên của vùng tơ đƣợc xác định bởi tập các đỉnh của một đa giác, đƣờng biên trong thuật tốn đƣợc mơ tả bằng một giá trị duy nhất đĩ là màu của tất cả các điểm thuộc về đƣờng biên. Bắt đầu từ điểm nằm bên trong vùng tơ, ta sẽ kiểm tra các điểm lân cận của nĩ đã đƣợc tơ màu hay cĩ phải là điểm biên hay khơng, nếu khơng phải là điểm đã tơ và khơng phải là điểm biên ta sẽ tơ màu nĩ. Quá trình này đƣợc lặp lại cho tới khi nào khơng cịn tơ đƣợc điểm nào nữa thì dừng. Bằng cách này, tồn bộ các điểm thuộc vùng tơ đƣợc kiểm tra và sẽ đƣợc tơ hết. Hình 2.24 – Thuật tốn tơ màu dựa theo đƣờng biên Cĩ hai quan điểm về cách tơ này, đĩ là dùng bốn điểm lân cận hay tám điểm lân cận đối với điểm đang xét đƣợc tơ bằng màu trắng (xem hình 2.25). Hình 2.25 – 4 điểm lân cận (a) và 8 điểm lân cận (b) Đoạn chƣơng trình sau minh họa cài đặt thuật tốn tơ màu dựa theo đƣờng biên sử dụng phƣơng pháp tơ 4 điểm lân cận. Cài đặt minh họa thuật tốn tơ màu dựa theo đƣờng biên void BoundaryFill(int x, int y, int FillColor, int BoundaryColor) { (a) (b) Begin Tạo danh sách tất cả các cạnh ET i<TopScan i=BottomScan Yes No Cập nhật danh sách các cạnh kích hoạt AET Tìm hoành độ giao điểm và sắp xếp theo thứ tự tăng dần Tô màu các đoạn giao được tạo bởi từng cặp hoành độ kế tiếp nhau Cập nhật lại thông tin của các cạnh để sử dụng cho dòng quét kế tiếp i=i+1 End 30 int CurrentColor; CurrentColor = getpixel(x,y); if((CurrentColor!=BoundaryColor)&&CurrentColor!= FillColor)) { putpixel(x,y,FillColor); BoundaryFill(x-1, y, FillColor, BoundaryColor); BoundaryFill(x, y+1, FillColor, BoundaryColor); BoundaryFill(x+1, y, FillColor, BoundaryColor); BoundaryFill(x, y-1, FillColor, BoundaryColor); } } // Boundary Fill Nhận xét  Thuật tốn này cĩ thể sẽ khơng hoạt động chính xác khi cĩ một số điểm nằm trong vùng tơ cĩ màu là màu cần tơ của vùng (FillColor). Để khắc phục điều này, trƣớc khi tơ màu cần phải đảm bảo rằng tồn bộ các điểm thuộc về vùng tơ cĩ màu khác màu tơ.  Nhận xét rằng trong cài đặt thuật tốn ở trên, việc gọi thực hiện đệ quy thuật tốn cho bốn điểm lân cận của điểm hiện hành khơng quan tâm tới một trong bốn điểm đĩ đã đƣợc xét ở bƣớc trƣớc hay chƣa. Ví dụ khi ta xét bốn điểm lân cận của điểm hiện hành (x,y), thì khi gọi thực hiện đệ quy với điểm hiện hành là một trong bốn điểm lân cận trên, (x,y) vẫn đƣợc xem là điểm lân cận của chúng và lại đƣợc gọi thực hiện lại. Ta sẽ đƣa ra một cải tiến nhỏ để khắc phục điểm này, bằng cách mỗi lần xét điểm hiện hành (x,y) ta sẽ gọi 4 thủ tục riêng để tơ các điểm lân cận và trong 4 thủ tục này ta sẽ tránh gọi lại việc xét điểm (x,y). void BoundaryFillEnhanced(int x, int y, int F_Color, int B_Color) { int CurrentColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); FillLeft(x-1, y, F_Color, B_Color); FillTop(x, y+1, F_Color, B_Color); FillRight(x+1, y, F_Color, B_Color); FillBottom(x, y-1, F_Color, B_Color); } } // BoundaryFillEnhanced void FillLeft(int x, int y, int F_Color, int B_Color) { int CurrentColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); 31 FillLeft(x-1, y, F_Color, B_Color); FillTop(x, y+1, F_Color, B_Color); FillBottom(x, y-1, F_Color, B_Color); } } // FillLeft void FillTop(int x, int y, int F_Color, int B_Color) { int CurrentColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); FillLeft(x-1, y, F_Color, B_Color); FillTop(x, y+1, F_Color, B_Color); FillRight(x+1, y, F_Color, B_Color); } } // FillTop void FillRight(int x, int y, int F_Color, int B_Color) { int CurrentColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); FillTop(x, y+1, F_Color, B_Color); FillRight(x+1, y, F_Color, B_Color); FillBottom(x, y-1, F_Color, B_Color); } } // FillRight void FillBottom(int x, int y, int F_Color, int B_Color) { int CurrentColor; CurrentColor = getpixel(x,y); if((CurrentColor!=B_Color)&&CurrentColor!= F_Color)) { putpixel(x,y,F_Color); FillLeft(x-1, y, F_Color, B_Color); 32 FillRight(x+1, y, F_Color, B_Color); FillBottom(x, y-1, F_Color, B_Color); } } // FillBottom  Thuật tốn này cĩ tính đệ quy, do đĩ khi cài đặt thƣờng gây lỗi tràn bộ nhớ khi vùng tơ khá lớn, do đĩ để cải tiến chúng ta sẽ tiến hành loang dần và lần lƣợt tơ từng đoạn giao theo dịng quét ngang thay vì tơ theo 4 điểm lân cận. Nhƣ vậy chúng ta chỉ cần lƣu lại thơng tin của điểm bắt đầu mỗi đoạn giao của dịng quét ngang thay vì phải lƣu hết tất cả các điểm lân cận chƣa đƣợc tơ của điểm hiện hành. Chúng ta sẽ cho các dịng quét loang từ điểm bắt đầu theo hƣớng lên biên trên, sau khi đã tơ xong, các dịng quét cịn lại theo hƣớng xuống biên dƣới sẽ đƣợc tơ. Ứng với mỗi dịng quét ngang, ta sẽ loang và tìm pixel trái nhất (cĩ hồnh độ nhỏ nhất) để lƣu lại. Trong hình 2.26, đoạn giao đầu tiên chứa điểm bắt đầu (tơ màu trắng) sẽ đƣợc tơ trƣớc. Sau đĩ các vị trí 1, 2 ứng với các đoạn giao của các dịng quét kế tiếp sẽ đƣợc lƣu lại (hình 2.26a). Bƣớc tiếp theo, điểm ứng với vị trí 2 sẽ đƣợc lấy ra và tiến hành tơ màu bằng cách loang từ điểm này ra theo chiều ngang, sau đĩ pixel ứng vị trí 3 của dịng quét kế tiếp sẽ đƣợc lƣu lại (hình 2.26b). Sau khi dịng quét ứng với điểm 3 đã đƣợc xử lí tƣơng tự nhƣ trên xong, stack lƣu các vị trí của các điểm “hạt giống” cho các dịng quét kế tiếp nhƣ trong hình 2.26c. Hình 2.26d minh họa khi thuật tốn đã tơ đƣợc tồn bộ một phần vùng phía trên bên phải của vùng tơ. Khi pixel ứng với vị trí 5 đƣợc xử lí xong, ta cĩ phần cịn lại phía trên bên trái sẽ đƣợc tơ. Sau đĩ pixel ứng với vị trí 4 sẽ đƣợc xử lí, các dịng quét phía dƣới sẽ đƣợc tơ tiếp theo. Hình 2.26 – Thuật tốn tơ màu theo dịng quét cải tiến TĨM TẮT Các đối tƣợng đồ họa cơ sở cung cấp các cơng cụ cơ bản nhất cho việc xây dựng các ảnh đồ họa của các đối tƣợng phức tạp. Các đoạn thẳng, đƣờng cong, vùng tơ, kí tự, là các đối tƣợng đồ họa cơ sở đƣợc hầu hết tất cả các cơng cụ lập trình đồ họa hỗ trợ. Mỗi đối tƣợng đồ họa cơ sở đƣợc mơ tả thơng qua dữ liệu về tọa độ và các thuộc tính của nĩ. Hệ tọa độ thƣờng đƣợc dùng để mơ tả đối tƣợng là hệ tọa độ Descartes. Các thuộc tính của đối tƣợng nhƣ màu sắc, kiểu, độ rộng, cho biết kiểu cách mà đối tƣợng đƣợc hiển thị trên thiết bị. Để cĩ thể hiển thị các đối tƣợng đồ họa trên thiết bị hiển thị dạng điểm mà điển hình là màn hình, cần phải cĩ một quá trình chuyển các mơ tả hình học của các đối tƣợng này trong hệ tọa độ thế giới thực về dãy các pixel tƣơng ứng gần với chúng nhất trên hệ tọa độ của thiết bị. Quá trình này cịn đƣợc gọi là quá trình chuyển đổi bằng dịng quét. Yêu cầu quan trọng nhất đối với quá trình này ngồi việc phải cho kết quả xấp xỉ tốt nhất cịn phải cho tốc độ tối ƣu. Ba cách tiếp cận để vẽ đoạn thẳng gồm thuật tốn DDA, thuật tốn Bresenham, thuật tốn MidPoint đều tập trung vào việc đƣa ra cách chọn một trong hai điểm nguyên kế tiếp khi đã biết đƣợc điểm nguyên ở bƣớc trƣớc. Thuật tốn DDA đơn giản chỉ dùng thao tác làm trịn nên phải dùng các phép tốn trên số thực, trong khi đĩ thuật tốn Bresenham và thuật tốn MidPoint đƣa ra cách chọn phức tạp hơn nhƣng cho kết quả tốt hơn. Đối với trƣờng hợp vẽ đoạn thẳng, hai thuật tốn Bresenham và thuật tốn MidPoint cho kết quả giống nhau và tốc độ tối ƣu. Các đối tƣợng khác nhƣ đƣờng trịn, ellipse và các đƣờng conics khác cũng đƣợc vẽ tƣơng tự bằng cách sử dụng thuật tốn MidPoint. Riêng với các đƣờng phức tạp hơn nhƣ đƣờng spline, sẽ đƣợc xây dựng từ các đoạn thẳng xấp xỉ với đƣờng cong thay vì phải xấp xỉ chúng từ các điểm (xem phần sau). Các thuật tốn tơ màu các vùng tơ thƣờng chia làm hai cơng đoạn : cơng đoạn thứ nhất là xác định các điểm nào để tơ và cơng đoạn cịn lại đơn giản hơn đĩ là quyết định tơ các điểm đĩ bằng giá trị màu nào. Cơng đoạn thứ hai chỉ thực sự phức tạp nếu ta tơ theo một mẫu tơ nào đĩ khơng phải là tơ thuần một màu. Cĩ hai cách tiếp cận chính để tơ màu một vùng tơ đối với thiết bị hiển thị dạng điểm đĩ là : tơ theo dịng quét và tơ dựa theo đƣờng biên. Cách tơ theo dịng quét thƣờng đƣợc dùng để tơ màu các đa giác, đƣờng trịn, ellipse, và một số đƣờng cong đơn giản khác, cịn cách tơ theo đƣờng biên thƣờng đƣợc dùng cho các vùng tơ cĩ dạng đƣờng biên phức tạp hơn. Thuật tốn tơ màu đa giác theo dịng quét xác định các điểm thuộc vùng tơ bằng cách xác định phần giao của các dịng quét với các đoạn thẳng biên của đa giác. Điểm độc đáo của thuật tốn này ở chỗ đƣa ra cấu trúc dữ liệu danh sách các cạnh kích hoạt AET và cách hoạt động của chúng để cĩ thể hạn chế tối đa các cạnh cần tìm giao điểm ứng với mỗi dịng quét. Đây là điểm mấu chốt trong vấn đề cải thiện tốc độ của thuật tốn. Thuật tốn này cĩ thể đƣợc áp dụng cho nhiều dạng đa giác khác nhau nhƣ đa giác lồi, đa giác lõm, và cả đa giác tự cắt, Thuật tốn tơ màu dựa theo đƣờng biên xuất phát từ điểm nằm bên trong vùng tơ và tiến hành loang dần ra các điểm lân cận cho tới khi gặp các điểm thuộc biên thì dừng. Cách làm này gặp hạn chế về bộ nhớ khi cài đặt bằng đệ quy. Một phƣơng pháp cải tiến đã đƣợc đề cập đĩ là loang theo từng dịng quét. Việc tơ màu theo cách này thực sự là thuận tiện cho các chƣơng trình đồ họa ứng dụng cĩ khả năng tƣơng tác cao. BÀI TẬP 1. Thiết kế và cài đặt hàm vẽ hình chữ nhật, đƣờng gấp khúc, đa giác từ hàm vẽ đoạn thẳng. 2. Trong phần trình bày thuật tốn Bresenham để vẽ đƣờng thẳng, hãy cho biết với cách đặt d1, d2 nhƣ vậy, cĩ khi nào d1, d2 lấy giá trị âm hay khơng ? Nếu cĩ hãy cho ví dụ minh họa. 3. Tại sao phải so sánh i p với giá trị 0 trong các thuật tốn Bresenham, MidPoint. Bản chất của việc so sánh này là gì? 4. Cài đặt các thuật tốn DDA, Bresenham, MidPoint vẽ đoạn thẳng qua hai điểm cho trƣớc trong trƣờng hợp tổng quát với hệ số gĩc m lấy giá trị bất kì. 5. Ngƣời ta cĩ thể cải thiện tốc độ cài đặt thuật tốn vẽ đoạn thẳng bằng cách chỉ cần vẽ một nửa đoạn thẳng, phần cịn lại lấy 33 đối xứng nửa đoạn thẳng đã vẽ. Hãy cài đặt minh họa. 6. Cho biết các điểm nguyên vẽ phát sinh khi sử dụng các thuật tốn DDA, MidPoint cho các đoạn thẳng đi qua các điểm lần lƣợt là A1(5,10), B1(15,17); A2(-2,3), B2(-12,7); A3(6,3), B3(9,13); A4(2,4), B4(-5,14); A5(0,10), B5(15,10); A6(5,-1), B6(5,- 11); 7. Trình bày thuật tốn MidPoint vẽ cung trịn 1/8, bán kính R, tâm I(xC, yC) và đƣợc giới hạn bởi : 8. Sử dụng ý tƣởng của thuật tốn Bresenham, xây dựng thuật tốn vẽ đƣờng trịn cĩ tâm là gốc tọa độ, bán kính R. 9. Giải thích tại sao chỉ chọn cung 1/8 để vẽ rồi lấy đối xứng mà khơng mở rộng cho cung 1/16 hay 1/32. 10. Giải thích tại sao cĩ thể thay cơng thức p0 = 5/4 - R bằng cơng thức p0 = 1- R khi cài đặt thuật tốn MidPoint vẽ đƣờng trịn. 11. Trình bày thuật tốn Bresenham vẽ đƣờng trịn bán kính R, từ đĩ nhận xét về cách tiếp cận của thuật tốn MidPoint cĩ gì lợi hơn so với thuật tốn Bresenham. 12. Xây dựng và cài đặt thuật tốn vẽ ellipse cĩ tâm là gốc tọa độ với bán kính trục chính, bán kính trục phụ lần lƣợt là A, B. 13. Dựa vào thuật tốn vẽ đƣờng trịn để xây dựng thủ tục vẽ một cung trịn (arc) tâm (x,y) bán kính R, biết gĩc bắt đầu và kết thúc của cung lần lƣợt là , .. 14. Dựa vào thuật tốn vẽ ellipse để xây dựng thủ tục vẽ một cung (pie slice) tâm (x,y) và bán kính trục chính, trục phụ lần lƣợt là A, B, gĩc bắt đầu và kết thúc của cung lần lƣợt là , . 15. Hãy tìm hiểu các cài đặt tối ƣu hơn cho các thuật tốn vẽ đoạn thẳng và vẽ đƣờng trịn, ellipse. 16. Xây dựng và cài đặt thuật tốn vẽ các parabol A x y 2  , và Axy 2 với A là số nguyên bất kì. 17. Xây dựng và cài đặt thuật tốn vẽ các hyperbol 1 2 2 2 2  B y A x , và 1 2 2 2 2  B y A x với A, B là các số nguyên bất kì. 18. Xây dựng và cài đặt thuật tốn vẽ các đƣờng cong sau :  )sin(   xAy , với A nguyên.  )cos(   xAy , với A nguyên.  2Axy  , với A nguyên.  Axy /3 , với A nguyên.  042422  yxyx  021618259 22  xyx  0100100 2  xxy  07425  yxxy  0250025100 22  yx  19. Các bƣớc chính của các thuật tốn vẽ đƣờng dạng  xfy  . Minh họa cho các trƣờng hợp vẽ đƣờng thẳng, đƣờng trịn. 20. Bản chất của quá trình vẽ các đƣờng đơn giản theo từng điểm là rời rạc hĩa và nguyên hĩa. Hãy cho biết lí do tại sao, bƣớc nào trong thuật tốn tổng quát thể hiện hai ý trên. Minh họa bằng các đƣờng đã học. 21. Các thuật tốn vẽ đƣờng bao hàm rất lớn kĩ thuật tối ƣu hĩa chƣơng trình. Hãy minh họa qua các đối tƣợng đã học. 22. Ý nghĩa của danh sách kích hoạt AET trong thuật tốn tơ màu đa giác theo dịng quét. Cấu trúc dữ liệu và nguyên tắc hoạt động của AET. 23. Cài đặt thuật tốn tơ màu đa giác theo dịng quét bằng cách dùng xâu liên kết thay vì dùng mảng nhƣ cài đặt minh họa. 24. Cài đặt thuật tốn tơ màu theo đƣờng biên khơng dùng đệ quy. 25. Xây dựng và cài đặt thuật tơ màu đƣờng trịn, ellipse.          2 2 0 2 2 Ry RxR 4 CHƢƠNG 3 CÁC PHÉP BIẾN ĐỔI TRONG ĐỒ HỌA HAI CHIỀU Một trong những ƣu điểm quan trọng của đồ họa là cho phép dễ dàng thao tác lên các đối tƣợng đã đƣợc tạo ra. Một nhà quản lí cĩ nhu cầu thu nhỏ các biểu đồ trong một báo cáo, một kiến trúc sƣ muốn nhìn tịa nhà ở những gĩc nhìn khác nhau, một nhà thiết kế muốn quan sát và chỉnh sửa các mẫu đối tƣợng trong quá trình thiết kế, Tất cả các thao tác này cĩ thể đƣợc hỗ trợ một cách dễ dàng nhờ vào các phép biến đổi hình học. Các phép biến đổi hình học sẽ làm thay đổi mơ tả về tọa độ của các đối tƣợng, từ đĩ làm cho đối tƣợng bị thay đổi về hƣớng, kích thƣớc và hình dạng. Các phép biến đổi hình học cơ sở bao gồm : tịnh tiến (translation), quay (rotation) và biến đổi tỉ lệ (scaling). Ngồi ra một số phép biến đổi khác cũng thƣờng đƣợc áp dụng đĩ là phép đối xứng (reflection) và biến dạng (shearing). Cĩ hai quan điểm về phép biến đổi hình học đĩ là : biến đổi đối tƣợng (object transformation) và biến đổi hệ tọa độ (coordinate transformation). Biến đổi đối tƣợng là thay đổi tọa độ của các điểm mơ tả nĩ theo một quy tắc nào đĩ, cịn biến đổi hệ tọa độ là tạo ra một hệ tọa độ mới và tất cả các điểm mơ tả đối tƣợng sẽ đƣợc chuyển về hệ tọa độ mới. Hai cách này cĩ những mối liên hệ chặt chẽ với nhau và mỗi cách đều cĩ những lợi thế riêng. Chúng ta sẽ bàn về phép biến đổi đối tƣợng trƣớc. 1. CÁC PHÉP BIẾN ĐỔI HÌNH HỌC CƠ SỞ Một phép biến đổi hai chiều sẽ biến đổi điểm P trong mặt phẳng thành điểm cĩ tọa độ mới Q theo một quy luật nào đĩ. Về mặt bản chất, một phép biến đổi điểm là một ánh xạ T đƣợc định nghĩa :    ',', : 22 yxQyxP T  RR  Nĩi cách khác, T là hàm số  yxT , theo hai biến  yx, :         yxgy yxfx ,' ,' Phép biến đổi affine là phép biến đổi với  yxf , và  yxg , là các hàm tuyến tính. Phép biến đổi này cĩ dạng : 0,,,,,,, ' '       bcadRfedcba fdybxy ecyaxx . Ta chỉ khảo sát các phép biến đổi affine nên từ nay về sau ta dùng cụm từ "phép biến đổi" thay cho "phép biến đổi affine". 1.1. Phép tịnh tiến Để tịnh tiến một điểm  yxP , từ vị trí này sang vị trí khác trong mặt phẳng, ta cộng thêm các giá trị mơ tả độ dời vào các tọa độ của P. Nếu gọi x tr và y tr lần lƣợt là độ dời theo trục hồnh và trục tung thì tọa độ của điểm mới  ',' yxQ sẽ là :      y x tryy trxx ' ' ,   yx trtr , cịn đƣợc gọi là vector tịnh tiến hay vector độ dời. Chúng ta cĩ thể dịch chuyển tồn bộ một đối tƣợng bằng cách áp dụng quy tắc trên cho mọi điểm thuộc đối tƣợng. Để tịnh tiến một đoạn thẳng, đơn giản chỉ cần tịnh tiến hai điểm đầu và cuối của nĩ rồi sau đĩ vẽ lại đoạn thẳng nối hai điểm mới. Với đa giác, ta tịnh tiến các đỉnh của nĩ sau đĩ vẽ lại đa giác với các đỉnh mới. Một cách tƣơng tự, để tịnh tiến các đối tƣợng nhƣ đƣờng trịn, ellipse, ta tịnh tiến tâm của chúng tới vị trí mới rồi vẽ lại. Hình 3.1 – Phép tịnh tiến một điểm (a) và đối tƣợng với vector tịnh tiến (-4,2) (b) 1.2. Phép biến đổi tỉ lệ Phép biến đổi tỉ lệ làm thay đổi kích thƣớc đối tƣợng. Để co hay giãn tọa độ của một điểm  yxP , theo trục hồnh và trục tung lần lƣợt là x s và y s , ta nhân x s và y s lần lƣợt cho các tọa độ của P.      ysy xsx y x .' .' , x s và y s đƣợc gọi là các hệ số tỉ lệ. Khi các giá trị x s , y s nhỏ hơn 1, phép biến đổi sẽ thu nhỏ đối tƣợng, ngƣợc lại khi các giá trị này lớn hơn 1, phép biến P x y Q tr x tr y (a) y x (2,3) (4,3) (6,1) (8,1) (b) 5 đổi sẽ phĩng lớn đối tƣợng. Khi x s , y s bằng nhau, ta gọi đĩ là phép đồng dạng (uniform scaling), phép đồng dạng là phép biến đổi bảo tồn tính cân xứng của đối tƣợng. Tâm tỉ lệ là điểm khơng bị thay đổi qua phép biến đổi tỉ lệ. Phép biến đổi tỉ lệ mơ tả nhƣ trên cịn gọi là phép biến đổi tỉ lệ quanh gốc tọa độ vì cĩ tâm tỉ lệ là gốc tọa độ. Nhận xét rằng khi phép biến đổi tỉ lệ thu nhỏ đối tƣợng, đối tƣợng sẽ đƣợc dời về gần gốc tọa độ hơn, tƣơng tự khi phĩng lớn đối tƣợng, đối tƣợng sẽ đƣợc dịch chuyển xa gốc tọa độ hơn. Hình 3.2 – Phép biến đổi tỉ lệ với 5.2 x s và 5.0 y s 1.3. Phép quay Phép quay làm thay đổi hƣớng của đối tƣợng. Một phép quay địi hỏi phải cĩ tâm quay, gĩc quay. Gĩc quay dƣơng thƣờng đƣợc quy ƣớc là chiều ngƣợc chiều kim đồng hồ. Ta cĩ cơng thức biến đổi của phép quay điểm  yxP , quanh gốc tọa độ một gĩc  :      yxy yxx .cos.sin' .sin.cos'   Hình 3.3 – Phép quay một đối tƣợng quanh gốc tọa độ một gĩc 600 1.4. Biểu diễn ma trận của phép biến đổi Trong nhiều ứng dụng đồ họa, ngƣời dùng thƣờng xuyên cĩ nhu cầu thực hiện nhiều phép biến đổi hình học khác nhau trên một đối tƣợng để tạo ra các hiệu quả nhƣ mong muốn. Ví dụ trong các ứng dụng thiết kế, chúng ta cần phải thực hiện nhiều phép tịnh tiến, quay, tỉ lệ để cĩ thể khớp từng phần của đối tƣợng vào đúng vị trí của chúng, hay sau khi thực hiện các phép biến đổi nhƣng khơng đƣợc ƣng ý, ngƣời dùng muốn trở lại hiện trạng trƣớc khi biến đổi (undo), Do đĩ cần phải cĩ một cách nào đĩ để cĩ thể xử lí dãy các phép biến đổi trên đƣợc nhanh chĩng và hiệu quả. Nếu ta biểu diễn tọa độ của điểm  yxP , và  ',' yxQ dƣới dạng các vector dịng lần lƣợt là  yx và  '' yx thì các phép biến đổi tịnh tiến, tỉ lệ, quay cĩ thể đƣợc biểu diễn dƣới dạng ma trận nhƣ sau : Phép tịnh tiến       yx trtryxyx '' hay TPQ  với   yx trtrT  Phép biến đổi tỉ lệ             y x s s yxyx 0 0 '' hay SPQ . với          y x s s S 0 0 Phép quay quanh gốc tọa độ               cossin sincos '' yxyx hay RPQ . với           cossin sincos R Với cách biểu diễn này, chúng ta sẽ gặp khĩ khăn khi muốn kết hợp các phép biến đổi lại với nhau vì biểu diễn của phép tịnh tiến khác với dạng của các phép biến đổi tỉ lệ và quay. Chính vì vậy mà cần phải cĩ một cách nào đĩ để biểu diễn ba phép biến đổi này về một dạng duy nhất để cĩ thể dễ dàng xử lí sau này. 1.4.1. Hệ tọa độ thuần nhất (hormogeneous coordinates) Tọa độ thuần nhất của một điểm trên mặt phẳng đƣợc biểu diễn bằng bộ ba số tỉ lệ  hyx hh ,, khơng đồng thời bằng 0 và liên hệ với các tọa độ  yx, của điểm đĩ bởi cơng thức : h y y h x x hh  , y x (2,3) (4,3) (10,1.5)(5,1.5) y x 6 Nếu một điểm cĩ tọa độ thuần nhất là  zyx ,, thì nĩ cũng cĩ tọa độ thuần nhất là  zhyhxh .,.,. trong đĩ h là số thực khác 0 bất kì. Tọa độ thuần nhất của một điểm trong khơng gian ba chiều hay cĩ số chiều lớn hơn cũng đƣợc xác định một cách tƣơng tự. Về mặt tốn học, việc đƣa tọa độ thuần nhất vào là do sự cần thiết phải bổ sung cho mặt phẳng Euclid các điểm xa vơ tận  0,, yx (điểm phi chính) cĩ tọa độ thứ ba bằng 0, điều này dẫn đến khái niệm mặt phẳng xạ ảnh trong hình học xạ ảnh. Trong hệ tọa độ thuần nhất, các điểm xa vơ tận khơng đĩng một vai trị gì đặc biệt so với các điểm khác của mặt phẳng. Với các phép biến đổi hình học đang khảo sát, nếu một điểm đƣợc biểu diễn dƣới dạng tọa độ thuần nhất, cả ba phép biến đổi trên đều đƣợc biểu diễn dƣới dạng tích các ma trận. Điều này giúp cho việc khảo sát các tính chất và sự kết hợp của các phép biến đổi này đƣợc thuận tiện do mỗi phép biến đổi đƣợc đại diện bởi một ma trận duy nhất. Bộ ba các tọa độ thƣờng biểu diễn các điểm trong khơng gian ba chiều, nhƣng ở đây ta sử dụng chúng để biểu diễn các điểm trong khơng gian hai chiều. Mối liên hệ ở đây là : nếu chúng ta xét tất cả các bộ ba tọa độ thuần nhất biểu diễn cho cùng một điểm, nghĩa là bộ ba số cĩ dạng  .,.,. hyhxh , với 0h , chúng ta sẽ nhận đƣợc một đƣờng thẳng trong khơng gian ba chiều. Để đơn giản hĩa chúng ta cĩ thể chọn 1h , lúc này mỗi điểm  yxP , sẽ đƣợc biểu diễn dƣới dạng tọa độ thuần nhất là  1,, yx . 1.4.2. Biểu diễn các phép biến đổi dƣới dạng tọa độ thuần nhất Phép tịnh tiến                1 010 001 .11'' yx trtr yxyx hay   yxT trtrMPQ ,. với              1 010 001 , yx yxT trtr trtrM Phép biến đổi tỉ lệ                100 00 00 .11'' y x s s yxyx hay   yxS ssMPQ ,. với              100 00 00 , y x yxS s s ssM Phép quay quanh gốc tọa độ                100 0cossin 0sincos .11''   yxyx hay   R MPQ . với              100 0cossin 0sincos    R M 2. KẾT HỢP CÁC PHÉP BIẾN ĐỔI Quá trình áp dụng các phép biến đổi liên tiếp để tạo nên một phép biến đổi tổng thể đƣợc gọi là sự kết hợp các phép biến đổi (composing transformation). 2.1. Kết hợp các phép tịnh tiến Nếu ta thực hiện phép tịnh tiến lên  yxP , đƣợc P’ , rồi lại thực hiện tiếp một phép tịnh tiến khác lên P’, ta đƣợc điểm  ',' yxQ . Nhƣ vậy, Q là ảnh của phép biến đổi kết hợp hai phép tịnh tiến liên tiếp   111 , yxT trtrM và   222 , yxT trtrM cĩ tọa độ :           222111222111 ,.,.,.,. yxTyxTyxTyxT trtrMtrtrMPtrtrMtrtrMPQ  Ta cĩ : 7                          1 010 001 . 1 010 001 ,., 2211 222111 yxyx yxTyxT trtrtrtr trtrMtrtrM             1 010 001 2121 yyxx trtrtrtr hay :       2121222111 ,,., yyxxTyxTyxT trtrtrtrMtrtrMtrtrM  Vậy kết hợp hai phép tịnh tiến là một phép tịnh tiến. Từ đĩ ta cĩ kết hợp của nhiều phép tịnh tiến cũng là một phép tịnh tiến. 2.2. Kết hợp các phép tỉ lệ Tƣơng tự nhƣ phép tịnh tiến, ta cĩ tọa độ điểm  ',' yxQ là điểm cĩ đƣợc sau khi kết hợp hai phép tỉ lệ   111 , yxS ssM và   222 , yxS ssM là :           222111222111 ,.,.,.,. yxSyxSyxSyxS ssMssMPssMssMPQ  Ta cĩ :                          100 00 00 . 100 00 00 ,., 2 2 1 1 222111 y x y x yxSyxS s s s s ssMssM            100 0.0 00. 21 21 yy xx ss ss hay :       2121222111 .,.,., yyxxSyxSyxS ssssMssMssM  Vậy kết hợp hai phép tỉ lệ là một phép tỉ lệ. Dễ dàng mở rộng cho kết quả : kết hợp của nhiều phép tỉ lệ cũng là một phép tỉ lệ. 2.3. Kết hợp các phép quay Tƣơng tự, ta cĩ tọa độ điểm  ',' yxQ là điểm phát sinh sau khi kết hợp hai phép quay quanh gốc tọa độ   11  R M và   22  R M là :           22112211 ....  RRRR MMPMMPQ  Ta cĩ :                           100 0cossin 0sincos . 100 0cossin 0sincos . 22 22 11 11 2211      RR MM                      100 0cossin 0sincos 2121 2121   hay :       212211 .   RRR MMM Vậy kết hợp hai phép quay quanh gốc tọa độ là một phép quay quanh gốc tọa độ. Từ đĩ dễ dàng suy ra kết hợp của nhiều phép quay quanh gốc tọa độ cũng là một phép quay quanh gốc tọa độ. 2.4. Phép quay cĩ tâm quay là điểm bất kì Giả sử tâm quay cĩ tọa độ   RR yxI , , ta cĩ thể xem phép quay quanh tâm I một gĩc đƣợc kết hợp từ các phép biến đổi cơ sở sau:  Tịnh tiến theo vector tịnh tiến   RR yx  , để dịch chuyển tâm quay về gốc tọa độ (đƣa về trƣờng hợp quay quanh gốc tọa độ). 8  Quay quanh gốc tọa độ một gĩc  .  Tịnh tiến theo vector tịnh tiến   RR yx , để đƣa tâm quay về lại vị trí ban đầu. Hình 3.4 – Phép quay quanh tâm là điểm bất kì. Đối tƣợng trƣớc khi biến đổi(a), Sau khi tịnh tiến về gốc tọa độ(b), Sau khi quay gĩc  (c), Sau khi tịnh tiến về tâm quay ban đầu(d). Ta cĩ ma trận của phép biến đổi :         RRTRRRTRRR yxMMyxMyxM ,..,,,                                    1 010 001 . 100 0cossin 0sincos . 1 010 001 RRRR yxyx                   1cos1.sin.sincos1 0cossin 0sincos RRRR yxyx    3. MỘT SỐ TÍNH CHẤT CỦA PHÉP BIẾN ĐỔI AFFINE Phép biến đổi affine bảo tồn đƣờng thẳng Ảnh của đƣờng thẳng qua phép biến đổi affine là đƣờng thẳng. Thật vậy, ta cĩ phƣơng trình tham số của đƣờng thẳng qua hai điểm A, B là :     tBAttP  1 .  tQ các điểm nhận đƣợc sau phép biến đổi M.          tBMAMtMtBAtMtPtQ  11. Nếu gọi A’, B’ lần lƣợt là ảnh của A, B qua phép biến đổi M, ta sẽ cĩ BMBAMA  ',' . Lúc này     ''1 tBAttQ  . Đây chính là dạng của phƣơng trình tham số đoạn thẳng qua A’, B’. Từ kết quả trên, để biến đổi một đoạn thẳng đi qua hai điểm A và B, ta chỉ cần áp dụng phép biến đổi cho hai điểm A, B rồi vẽ lại đoạn thẳng qua hai điểm mới. Tính song song của các đƣờng thẳng đƣợc bảo tồn Ảnh của hai đƣờng thẳng song song là hai đƣờng song song. Chúng ta cĩ thể viết lại phƣơng trình tham số của đƣờng thẳng dƣới dạng tia xuất phát từ A ứng với t=0 và theo phƣơng AB  nhƣ sau : tA  . Lúc này ta biểu diễn hai đƣờng thẳng song song dƣới dạng tia :   tAtL  11 và   tAtL  22 cĩ cùng phƣơng t nhƣng xuất phát từ hai điểm khác nhau. Lúc này áp dụng phép biến đổi lên hai đƣờng thẳng song song này, dễ dàng nhận ra ảnh của chúng sẽ cĩ phƣơng M nên chúng song song. Một hệ quả quan trọng của tính chất này đĩ là ảnh của các hình bình hành sau phép biến đổi là các hình bình hành. Tính tỉ lệ về khoảng cách đƣợc bảo tồn Giả sử C là điểm chia đoạn AB theo tỉ số t. Nếu A’, B’, C’ lần lƣợt là ảnh A, B, C qua phép biến đổi thì C’ cũng sẽ chia A’B’ theo tỉ số t. Trong trƣờng hợp đặc biệt, nếu C là trung điểm của AB thì C’ cũng là trung điểm của A’B’, từ đĩ ta cĩ thể suy ra một số tính chất sau :  Trong hình vuơng, các đƣờng chéo cắt nhau tại trung điểm của mỗi đƣờng nên các đƣờng chéo của bất cứ hình bình hành nào cũng cắt nhau tại trung điểm của mỗi đƣờng.  Trong tam giác đều, giao điểm của ba đƣờng trung tuyến chia mỗi đƣờng theo tỉ số 1:2. Mặt khác, một tam giác bất kì là ảnh của tam giác đều qua phép biến đổi affine, nên giao điểm của các đƣờng trung tuyến của nĩ cũng sẽ chia chúng theo tỉ lệ 1:2. 4. MỘT SỐ PHÉP BIẾN ĐỔI KHÁC 4.1. Phép đối xứng Phép đối xứng trục cĩ thể xem là phép quay quanh trục đối xứng một gĩc 1800. Nếu trục đối xứng là trục hồnh hay trục tung, chúng ta cĩ biểu diễn của phép đối xứng qua trục hồnh, trục tung lần lƣợt là : x y x y  x y I(x R ,y R ) x y I(x R ,y R ) (a) (b) (c) (d) 9            100 010 001 Rfx M            100 010 001 Rfy M 4.2. Phép biến dạng Phép biến dạng là phép biến đổi làm thay đổi, méo mĩ hình dạng của các đối tƣợng. Hai dạng phép biến dạng thƣờng gặp đĩ là biến dạng theo phƣơng trục x và biến dạng theo phƣơng trục y bằng cách thay đổi tọa độ  yx, của điểm ban đầu theo cách sau : Biến dạng theo phƣơng trục x sẽ làm thay đổi hồnh độ cịn tung độ vẫn giữ nguyên            100 01 001 xyShx shM Biến dạng theo phƣơng trục y sẽ làm thay đổi tung độ cịn hồnh độ vẫn giữ nguyên            100 010 01 yx Shy sh M xy sh và yx sh lần lƣợt đƣợc gọi là các hệ số biến dạng. Hình 3.5 – Phép biến dạng theo phƣơng trục x với hệ số biến dạng 3 xy sh 4.3. Phép biến đổi ngƣợc Chúng ta thƣờng dùng phép biến đổi ngƣợc để cĩ thể undo một phép biến đổi đã thực hiện. Ta cĩ Q là ảnh của P qua phép biến đổi T cĩ ma trận biến đổi M là : PMQ  , từ đĩ phép biến đổi ngƣợc T-1 sẽ cĩ ma trận biến đổi là M-1 với M-1 là ma trận nghịch đảo của ma trận M. Với giả thiết ban đầu về ma trận M là 0 bcad , ta cĩ cơng thức tính ma trận nghịch đảo M-1 của            1 0 0 fe dc ba M là :                1 0 0 1 1 afbedecf ac bd bcad M Nhƣ vậy ta cĩ ma trận của các phép biến đổi ngƣợc của các phép biến đổi cơ sở tịnh tiến, tỉ lệ, quay lần lƣợt nhƣ sau :     yxT yx yxT trtrM trtr trtrM              , 1 010 001 , 1                                          yx S y x x y yx yxS ss M s s s s ss ssM 1 , 1 100 0 1 0 00 1 100 00 00 1 , 1 x y (1,1) (3,1) (3,3)(1,3) (4,1) (6,1) (12,3)(10,3) 10                    RR MM 100 0cossin 0sincos 1 4.4. Phân rã phép biến đổi Một phép biến đổi bất kì cĩ thể đƣợc phân rã thành tích các phép biến đổi cơ sở nhƣ tịnh tiến, quay, tỉ lệ. Một phép biến dạng theo phƣơng trục x cĩ thể đƣợc phân rã thành tích của một phép biến đổi tỉ lệ và một phép biến dạng đơn v

Các file đính kèm theo tài liệu này:

  • pdf42697_autocad_cho_he_thong_thiet_ke.pdf
Tài liệu liên quan