1. Trang chủ
  2. » Luận Văn - Báo Cáo

Cài đặt thuật toán xén một đa giác vào một vùng hình chữ nhật

45 3,6K 5

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 45
Dung lượng 410 KB

Nội dung

Và để phục vụ cho việc tìm hiểu thêm về các thuật toán trong Đồ Họa Máy Tính, Nhóm 16 chúng em với sự hướng dẫn của Giảng viên – Th.s Nguyễn Thị Cẩm Ngoan – Khoa CNTT – Trường ĐH Công N

Trang 1

KHOA CÔNG NGHỆ THÔNG TIN

Trang 2

LỜI NÓI ĐẦU

Đồ Họa Máy Tính là một lĩnh vực của Công Nghệ Thông Tin, ở đó nghiên cứu, xây

dựng và tập hợp các công cụ (mô hình lý thuyết và phần mềm) khác nhau để kiến tạo,

xây dựng, lưu trữ và xử lý các mô hình và hình ảnh của các đối tượng, sự vật, hiện tượng

trong cuộc sống, sản xuất, nghiên cứu

Đồ Họa Máy Tính góp phần quan trọng làm cho giao tiếp giữa con người và máy tính trở nên thân thiện hơn Trong lĩnh vực kỹ thuật máy tính, Đồ Họa Máy Tính càng ngày càng phát triển mạng mẽ Từ đồ họa trên máy tính chúng ta có nhiều lĩnh vực có ứng dụng rất quan trọng của Đồ Họa Máy Tính trong thực tế như: tạo mô hình, hoạt cảnh (game, giải trí,…), hỗ trợ thiết kế đồ họa, mô phỏng hình ảnh, chuẩn đoán hình ảnh (trong Y tế), huấn luyện đào tạo ảnh (quân sự, hàng không,…), …

Trong Đồ Họa Máy Tính có nhiều thuật toán khác nhau Xong mỗi thuật toán lại tỏ ra

có những ưu việt và hạn chế riêng đối với từng bài toán cụ thể Và để phục vụ cho việc

tìm hiểu thêm về các thuật toán trong Đồ Họa Máy Tính, Nhóm 16 chúng em với sự hướng dẫn của Giảng viên – Th.s Nguyễn Thị Cẩm Ngoan – Khoa CNTT – Trường

ĐH Công Nghiệp Hà Nội đã thực hiện đề tài: “Cài đặt thuật toán xén một đa giác vào một vùng hình chữ nhật”.

Chúng em xin gửi lời cảm ơn chân thành tới cô giáo: “Nguyễn Thị Cẩm Ngoan” đã

tận tâm chỉ bảo và giúp đỡ chúng em hoàn thành đề tài này Trong quá trình làm đề tài sẽ không tránh khỏi những sai sót, khuyết điểm Vì vậy, nhóm thực hiện chúng em hy vọng

Trang 3

nhận được sự đánh giá và đóng góp nhiệt tình từ phía thầy cô và các bạn để bài của nhómchúng em được hoàn thiện hơn

Nhóm 16, lớp KHMT1 – K5 chúng em xin chân thành cảm ơn!

Trường ĐH Công Nghiệp Hà Nội, tháng 02 năm 2012

Trang 4

MỤC LỤC

Tiêu Đề Trang LỜI NÓI ĐẦU Error: Reference source not found

MỤC LỤC 3

PHẦN 1: GIỚI THIỆU CHUNG VỀ ĐỀ TÀI 4

I Giới Thiệu Đề Tài……….……… …4

II Giới Thiệu Ngôn Ngữ Lập Trình Được Sử Dụng Trong Đề Tài…… …… … 4

III Giới Thiệu Thư Viện Graphics.h Trong Dev-C++……… …….……… 5

IV Cách sử dụng thư viện đồ họa trong Dev-C++……….… … … 5

PHẦN 2: Ý TƯỞNG XÂY DỰNG CHƯƠNG TRÌNH VÀ CÀI ĐẶT THUẬT TOÁN……… ………… 6

I Qui định hiển thị đối tượng 2 chiều……… ……… ……… 6

1.1 Một số khái niệm……… ……… ………6

1.2 Hệ tọa độ quan sát và hệ tọa độ thiết bị chuẩn……… ……… 8

1.2.1 Hệ tọa độ quan sát……… ……….….……… 8

1.2.2 Hệ tọa độ thiết bị chuẩn……….……….………9

1.3 Các thuật toán xén hình……… ………9

II Thuật toán Cohen-Sutherland………….………… ………10

III Thuật toán xén đa giác vào hình chữ nhật và các lần biến đổi …… ………11

IV CoDe Thuật Toán Xén Đa Giác Vào Hình Chữ Nhật………13

KẾT LUẬN……….………41

TÀI LIỆU THAM KHẢO……….………42

Trang 5

PHẦN 1: GIỚI THIỆU CHUNG VỀ ĐỀ TÀI

I Giới Thiệu Đề Tài.

Cùng với sự phát triển của nền kinh tế hiện nay là sự phát triển mạnh mẽ của ngànhcông nghệ thông tin Các ứng dụng của công nghệ thông tin ngày càng nhiều và có mặttrong hầu hết các lĩnh vực của cuộc sống

Với đề tài: “Cài đặt thuật toán xén một đa giác vào một vùng hình chữ nhật”,

nhóm 16 – lớp KHMT1K5 sẽ trình bày về thuật toán về xén hình Sutherland Hodgeman Ý nghĩa của thuật toán xén hình trong công nghệ thông tin là không hề nhỏ,đặc biệt là đối với màn hình máy tính thì nó có ý nghĩa vô cùng quan trọng

-Qua đề tài này nhóm 16 mong sẽ giúp ích được cho mọi người hiểu thêm phần nào vềthuật toán xén hình

II Giới Thiệu Ngôn Ngữ Lập Trình Được Sử Dụng Trong Đề Tài

Stroustrup đã bắt đầu làm việc với khái niệm lớp trong 1979 Ý tưởng tạo ra một ngôn ngữ mới bắt nguồn từ kinh nghiệm lập trình khi mà ông viết luận án tiến sĩ Stroustrup nhận ra rằng Simulacó nhiều tính năng hữu dụng cho việc phát triển một phần mềm lớn nhưng nó đã quá chậm trong ứng dụng thực tế, trong khi đó, BCPL lại nhanh nhưng ở cấp quá thấp và không tiện cho việc phát triển phần mềm lớn Đến khi làm việc ở Bell Labs, thì ông gặp phải vấn đề trong việc phân tích nhân Unix với việc tính toán phân tán Dùng lại kinh nghiệm lúc làm luận án tiến sĩ, Stroustrup cài thêm các tính năng giống như Simula vào trong C để nâng cao C được chọn là vì đó là ngôn ngữ tổng quát, nhanh

và năng động Lần đầu tiên, các chức năng như là lớp, lớp dẫn xuất, kiểm tra kiểu mạnh, nội tuyến (inline), và đối số mặc định đã được thêm vào trong C Lần xuất bản đầu tiên vào thị trường xảy ra trong tháng 11/1985

Năm 1983, thì tên C với các lớp được đổi thành C++ các chức năng mới được thêm vào

bao gồm hàm ảo, quá tải hàm và toán tử, tham chiếu, hằng, khả năng kiểm soát bộ nhớ của lưu trữ tự do, nâng cao việc kiểm soát kiểu, và lệnh chú giải kiểu (//)

Năm 1985, tác phẩm The C++ Programming Language được xuất bản lần đầu tiên, cung

cấp một tài liệu tham khảo quan trọng cho ngôn ngữ nhưng đó chưa là một tiêu chuẩn chính thức

Trang 6

Năm 1989 phiên bản C++ 2.0 phát hành Các tính năng mới bao gồm đa kế thừa, lớp trừutượng, hàm tĩnh, hàm thành viên hằng, và thành viên bảo tồn.

Năm 1990, cuốn The Annotated C++ Reference Manual được xuất bản cung cấp nền

tảng cho tiêu chuẩn tương lai

Phiên bản xuất bản sau đó có thêm các chức năng tiêu bản, ngoại lệ, không gian tên, chuyển kiểu cho toán tử new, và kiểu Boolean

Khi C++ hình thành, thì thư viện chuẩn hoàn thiện với nó Thư viện C++ đầu tiên thêm vào là iostream.h cung cấp cơ sở để thay thế các hàm C truyền thống như

là printf và scanf Sàu này, trong những thư viện chuẩn quan trọng nhất được thêm vào

là Thư viện Tiêu bản Chuẩn

Sau nhiều năm làm việc, có sự cộng tác giữa ANSI và hội đồng tiêu chuẩn hoá C++

của ISO để soạn thảo tiêu chuẩn ISO/IEC 14882:1998 Phiên bản tiêu chuẩn này được

phát hành năm 1989, hội đồng tiếp tục xử lí các báo cáo trục trặc, và ấn hành một phiên bản sửa sai của chuẩn C++ trong năm 2003

Không ai là chủ nhân của ngôn ngữ C++, nó hoàn toàn miễn phí khi dùng Mặc dù vậy, các văn bản tiêu chuẩn thì không miễn phí

Tạo một chương trình đồ hoạ 2D trong DOS sữ dụng turbo C khá dễ dàng và ai cũng

có thể làm được.Thư viện đựoc #include có tên là graphis.h Nhưng các thư viện C/C++ của borland lại có 1 điều đặc biệt là không sữ dụng được đối với 1 số trình compiler khác,tuy nhiên so với các IDE hiện đại thì borland lại kém về mặt quản lý và tính thuận tiện Chính vì lẽ đó mà bản hack thư viện graphics cũng nhưcác thư viện khác ra đời, và

của borland bằng dev-c++

IV Cách sử dụng thư viện đồ họa trong Dev-C++.

Đầu tiên bạn tải file đính kèm về máy mình, giải nén ra sẽ được 2 file là graphics.h và libbgi.a

+ File graphics.h để ở thư mục C:\Dev-Cpp\include

+ File libbgi.a để ở thư mục C:\Dev-Cpp\lib

(Nếu bạn cài mặc đinh Dev C++ ở ổ C)

Tiếp theo bạn khởi động Dev C++ lên, vào File >New > Project >Empty

Project (Nhớ chọn C++ Project) >OK

Trang 7

Đặt tên cho Project của mình!

Nhấn chuột phải lên cái project của bạn >New File

Nhấn Alt + P ->Chọn thẻ Parameters > Copy và paste vào ô Linker những dìng dưới đây:

Phần 2: Ý tưởng xây dựng chương trình và cài đặt thuật toán

I Qui định hiển thị đối tượng 2 chiều

1.1 Một số khái niệm

Cửa sổ (window) là một vùng được chọn để hiển thị trong hệ tọa độ thế giới thực Vùng quan sát (viewport) là vùng đƣợc chọn trên thiết bị hiển thị để các đối tượng ở trong cửa sổ ánh xạ vào

Cửa sổ xác định cái gì được thấy trên thiết bị hiển thị, còn vùng quan sát xác định nơi nào nó sẽ được hiển thị

Ở đây chúng ta nên phân biệt khái niệm cửa sổ đƣợc dùng trong phần này với khái niệm cửa sổ đƣợc dùng trong các chương trình ứng dụng trên các hệ điều hành như Windows

Thông thường cửa sổ và vùng quan sát có dạng hình chữ nhật, có các cạnh song song với các trục tọa độ Tuy nhiên chúng cũng còn có một số dạng khác như đa giác, hình tròn, …

Quá trình ánh xạ một vùng định nghĩa trong hệ tọa độ thế giới thực vào một vùng trong hệ tọa độ thiết bị được gọi là phép biến đổi hệ quan sát (viewing transformation)

Trang 8

Phép biến đổi hệ quan sát với cửa sổ và vùng quan sát có dạng là các hình chữ nhật Quy trình hiển thị các đối tượnng trong đồ họa hai chiều có thể được mô tả qua sơ

đồ sau :

Trước tiên, các đối tượng sẽ đƣợc mô tả bằng các đối tượng đồ họa cơ sở và cácthuộc tính của chúng trong từng hệ tọa độ cục bộ (modeling coordinates - MC) nhằm đơngiản hóa và tận dụng các đặc trƣng riêng của từng loại Sau đó, chúng ta sẽ dùng cácphép biến đổi hệ tọa độ để chuyển các mô tả từ các hệ tọa độ cục bộ này sang một hệ tọa

độ thế giới thực (world coordinates - WC) duy nhất chứa toàn bộ các đối tƣợng thànhphần Phép chuyển đổi này đƣợc gọi là phép chuyển đổi mô hình (modeling coordinatestransformation)

Tiếp theo, chúng ta sẽ định một hệ tọa độ quan sát (viewing coordinates - VC), là hệtọa độ mô tả vị trí của người quan sát đối tượng Nhờ việc sử dụng hệ tọa độ này mà cùngmột mô tả, các đối tượng có thể được quan sát ở nhiều góc độ và vị trí khác nhau

Trang 9

Qui trình hiền thị đối tượng 2 chiều Sau khi chuyển các mô tả đối tượng từ hệ tọa độ thế giới thực sang hệ tọa độquan sát, chúng ta sẽ định nghĩa cửa sổ trong hệ tọa độ này, đồng thời định nghĩavùng quan sát trong hệ tọa độ thiết bị chuẩn (normalized device coordinates - NDC)

có tọa độ các chiều thay đổi trong khoảng từ 0 đến 1

Sau khi thực hiện phép ánh xạ từ cửa sổ sang vùng quan sát, tất cả các phần củađối tượng nằm ngoài vùng quan sát sẽ bị xén (clip) và toàn bộ những gì nằm trong vùngquan sát sẽ được ánh xạ sang hệ tọa độ thiết bị (device coordinates - DC) Việc đưa ra hệtọa độ thiết bị chuẩn nhằm giúp cho việc tương thích dễ dàng với nhiều loại thiết bị hiểnthị khác nhau.Bằng cách thay đổi vị trí của vùng quan sát chúng ta có thể quan sát các đốitượng tại các vị trí khác nhau trên màn hình hiển thị, đồng thời, bằng cách thay đổi kíchthước của vùng quan sát, chúng ta có thể thay đổi kích thước và tính cân xứng của cácđối tượng được hiển thị Chúng ta có thể thực hiện các hiệu ứng thu phóng bằng cách ánh

xạ các cửa sổ có kích thước khác nhau vào vùng quan sát có kích thước cố định Khi cáccửa sổ được thu nhỏ, phần nằm trong cửa sổ sẽ được phóng to giúp chúng ta dễ dàngquan sát các chi tiết mà không thể thấy được trong các cửa sổ lớn hơn

1.2 Hệ tọa độ quan sát và hệ tọa độ thiết bị chuẩn

Chuyển đổi

từ hệ tọa độ quan sát sang

hệ tọa đồ thiết bị chuẩn

Ánh xạ từ hệ tọa độ thiết bịchuẩn sang

hệ tọa độ thiết bị

Trang 10

Sau đó chúng ta sẽ sử dụng một vector V mô tả hướng quan sát để định hướng chotrục tung yv của hệ tọa độ Vector V được gọi là view-up vector.

Từ V chúng ta có thể tính đƣợc các vector đơn vị v = (vxvy ) và u = (ux,uy ) tươngứng cho các trục tung yvvà trục hoành xvcủa hệ tọa độ Các vector đơn vị này sẽ đượcdùng để tạo thành hai dòng đầu tiên của ma trận quay MR để đưa các trục xv yv trùng vớicác trục xw ywcủa hệ trục tọa độ thế giới thực

Ma trận của phép chuyển một điểm trong hệ tọa độ thế giới thực sang hệ tọa độquan sát là tích của hai ma trận của các phép biến đổi : phép tịnh tiến gốc tọa độ hệ quansát về gốc tọa độ hệ tọa độ thế giới thực, phép quay đưa các trục của hệ tọa

độ quan sát trùng với các trục của hệ tọa độ thế giới thực MWC,VC =MTMR

1.2.2 Hệ tọa độ thiết bị chuẩn

Do cách định nghĩa của các hệ tọa độ thiết bị khác nhau nên một hình ảnh hiển thịđược trên thiết bị này chưa chắc hiển thị chính xác trên thiết bị kia Chính vì vậy cần phảixây dựng hệ tọa độ thiết bị chuẩn đại diện chung cho các thiết bị để có thể mô tả các hìnhảnh của thế giới thực mà không phụ thuộc vào bất cứ thiết bị nào

Trong hệ tọa độ này, các tọa độ x, y sẽ đƣợc gán các giá trị trong khoảng từ 0 đến 1.Như vậy, vùng không gian của hệ tọa độ thiết bị chuẩn chính là hình vuông đơn vị có góctrái dưới là (0,0) và góc phải trên (1,1)

Trang 11

II Thuật toán Cohen-Sutherland

Đây là một trong những thuật toán ra đời sớm nhất và thông dụng nhất

Bằng cách kéo dài các biên của cửa sổ, người ta chia mặt phẳng thành chín vùng gồm cửa

sổ và tám vùng xung quanh nó

Khái niệm mã vùng (area code)

Một con số 4 bit nhị phân gọi là mã vùng sẽ được gán cho mỗi vùng để mô tả vị trí tương đối của vùng đó so với cửa sổ Bằng cách đánh số từ 1 đến 4 theo thứ tự từ phải qua trái, các bit của mã vùng được dùng theo quy ước sau để chỉ một trong bốn vị trí tương đối của vùng so với cửa sổ bao gồm : trái, phải, trên, dưới

Bit 1 : trái (LEFT)

Bit 2 : phải (RIGHT)

Trang 12

Bit 3 : trên (TOP)

Bit 4 : dưới (BOTTOM)

Bit 1 được đặt là 1 nếu x < xmin, các bit khác được tính tương tự

Chúng ta có thể hiệu chỉnh các thuật toán xén đoạn thẳng để xén đa giác bằng cách

xem đa giác như là một tập các đoạn thẳng liên tiếp nối với nhau Tuy nhiên, kết quả sau khi xén nhiều khi lại là tập các đoạn thẳng rời nhau Điều chúng ta mongmuốn ở đây đó

là kết quả sau khi xén phải là một các đa giác để sau này có thể chuyển thành các vùng tô

Trang 13

Kết quả sau khi xén đa giác ban đầu Đa giác ban đầu (a) Kết quả là các đoạn rời nhau

(b) và kết quả là các đa giác (c)

Trong phần này chúng ta sẽ khảo sát một trong các thuật toán xén đa giác đó là thuật toán Sutherland-Hodgeman

Thuật toán này sẽ tiến hành xén đa giác lần lượt với các biên cửa sổ Đầu tiên, đa giác sẽ được xén dọc theo biên trái của cửa sổ, kết quả sau bước này sẽ được dùng để xéntiếp biên phải, rồi cứ tương tự như vậy cho các biên trên, dưới Sau khi xén hết với bốn biên của cửa sổ, ta được kết quả cuối cùng

Với mỗi lần xén đa giác dọc theo một biên nào đó của cửa sổ, nếu gọi Vi,Vi+1 là hai đỉnh

kề cạnh ViVi+1, ta có 4 trường hợp có thể xảy ra khi xét từng cặp đỉnh của đa giác ban đầuvới biên của cửa sổ như sau:

i) Nếu Vi nằm ngoài, Vi+1 nằm trong, ta lưu giao điểm I của ViVi+1với biên của cửa sổ

và Vi+1

ii) Nếu cả Vi, Vi+1đều nằm trong, ta sẽ lưu cả Vi, Vi+1

iii) Nếu Vinằm trong, Vi+1nằm ngoài, ta sẽ lưu Vi và I

iiii) Nếu cả Vi, Vi+1đều nằm ngoài, ta không lưu gì cả

Trang 14

Các trường hợp khi xét Vi,Vi+1với các biên của cửa sổ

IV CoDe Thuật Toán Xén Đa Giác Vào Hình Chữ Nhật.

Trang 16

RectangularCoordinates,const RectangularCoordinates,int &,int &);

void clip_polygon(const RectangularCoordinates,const int,const int []);

const int check_line(const LineCoordinates,const LineCoordinates);

const int check_point(const LineCoordinates,const float,const float);

const PointCoordinates

get_intersection_point(LineCoordinates,LineCoordinates);

Trang 17

void Polygon(const int,const int []);

void Rectangle(const int,const int,const int,const int);

void Line(const int,const int,const int,const int);

void Dashed_line(const int,const int,const int,const int,const int=0);int main( )

Trang 20

outtextxy(213,450," ");

for(int count=0;count<n;count++)

apply_window_to_viewport_coordinate_transformation(WC,VC,polygon_vertices[(count*2)],polygon_vertices[((count*2)+1)]);

Trang 21

int *edges=new int[(n*4)];

int *clipped_edges=new int[(n*4)];

Trang 22

switch(rule_no)

Trang 23

case 1 : clipped_edges[(edges_counter*2)]=(int)(line.x_2+0.5); clipped_edges[((edges_counter*2)+1)]=(int)(line.y_2+0.5); edges_counter++;

break;

case 4 : point=get_intersection_point(window_line,line);

clipped_edges[(edges_counter*2)]=(int)(point.x+0.5);

clipped_edges[((edges_counter*2)+1)]=(int)(point.y+0.5); edges_counter++;

clipped_edges[(edges_counter*2)]=(int)(line.x_2+0.5);

clipped_edges[((edges_counter*2)+1)]=(int)(line.y_2+0.5); edges_counter++;

Ngày đăng: 08/11/2014, 23:42

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w