Một số thuật toán liên quan đến nội dung hình học

59 2.2K 7
Một số thuật toán liên quan đến nội dung hình học

Đ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

ĐẠI HỌC THÁI NGUYÊN NGUYỄN THANH HOA MỘT SỐ THUẬT TOÁN LIÊN QUAN ĐẾN NỘI DUNG HÌNH HỌC Chuyên ngành: Tin học LUẬN VĂN TỐT NGHIỆP ĐẠI HỌC Người hướng dẫn khoa học: Thạc sĩ: Nguyễn Văn An THÁI NGUYÊN - 2010 2 MỤC LỤC Trang Trang bìa phụ 1 Mục lục 2 Mở đầu 4 1. Lý do chọn đề tài 4 2. Mục đích - yêu cầu và phạm vi nghiên cứu 5 3. Phương pháp nghiên cứu 5 4. Cấu trúc của luận văn 5 Chương 1. Cơ sở lý thuyết 7 1.1. Một số đối tượng hình học 7 1.1.1. Điểm 7 1.1.2. Đường thẳng 7 1.1.3. Đoạn thẳng 8 1.1.4. Đa giác 8 1.2. Phương trình tương quan giữa điểm và đường thẳng, đoạn thẳng 9 1.2.1. Tương quan giữa điểm và đường thẳng 9 1.2.2. Tương quan giữa điểm và đoạn thẳng 10 1.3. Giao giữa đường thẳng, đoạn thẳng 10 1.3.1. Đường thẳng cắt đường thẳng 10 1.3.2. Đường thẳng cắt đoạn thẳng 11 1.3.3. Đoạn thẳng cắt đoạn thẳng 11 1.4. Một số bài tập áp dụng 13 1.4.1. Kiểm tra một điểm thuộc một tia 13 1.4.2. Kiểm tra một tia cắt một đoạn 13 1.4.3. Kiểm tra tính lồi, lõm của đa giác 14 1.4.4. Kiểm tra vị trí của một điểm với một đa giác 17 3 1.4.5. Bài toán tìm phần giao, phần hợp của hai đường tròn 19 1.4.6. Bài toán áp dụng phương pháp lưới 23 1.4.7. Tìm tâm và tỉ số vị tự biến đường tròn này thành đường tròn kia 27 Chương 2. Thuật toán tìm phần giao và phần hợp của hai đa giác 29 2.1. Bài toán 1 29 2.1.1. Thuật toán tìm phần giao của hai đa giác 31 2.1.2. Tóm tắt thuật toán 32 2.1.3. Mô tả một số hàm, thủ tục trong chương trình 33 2.1.4. Đánh giá thuật toán 34 2.1.5. Thuật toán tìm phần hợp của hai đa giác 35 2.1.6. Minh họa một số test 35 2.2. Bài toán 2 37 2.2.1. Thuật toán 39 2.2.2. Một số bộ test 40 2.3. Bài toán 3 41 Chương 3. Thuật toán tính thể tích nước ngập trong mô hình dữ liệu địa lý Raster 42 3.1. Đặt vấn đề 42 3.2. Mô hình dữ liệu Raster 43 3.3. Thuật toán 43 3.4. Mô phỏng chương trình minh họa 46 3.5. Một số bộ test 46 3.6. Đánh giá thuật toán 50 3.7. Mở rộng 50 Kết luận 51 Tài liệu tham khảo 52 Phụ lục 53 4 MỞ ĐẦU 1. Lý do chọn đề tài Như chúng ta đã biết Toán học có ảnh hưởng rất lớn đến mọi lĩnh vực của cuộc sống. Các bài toán trong tin học nếu có thuật toán giải dựa trên cơ sở lý thuyết toán học vững chắc thì sẽ đem lại kết quả tốt. Điều đó được khẳng định rõ trong các bài toán liên quan đến nội dung về hình học. Những bài toán dạng này đòi hỏi người lập trình không những phải nắm vững các kiến thức về toán học mà còn phải có tư duy thuật toán tốt. Đa số các thuật toán đều tập trung vào dữ liệu kiểu văn bản và kiểu số, chúng được thiết kế và xử lý sẵn trong phần lớn các môi trường lập trình. Đối với các bài toán hình học thì tình huống khác hẳn, ngay cả các phép toán sơ cấp trên các đối tượng là điểm và đoạn thẳng cũng có thể là một thách thức về tính toán và lập trình. Những bài toán hình học thường trực quan và cũng không quá khó về mặt giải thuật nhưng lại rườm rà về mặt chương trình. Chính vì thế mà chỉ cần một sai sót nhỏ cũng dẫn đến việc khó có thể chỉnh sửa chương trình trong thời gian cho phép. Bên cạnh đó, trên thực tế nhiều bài toán hình học có thể giải quyết được ngay lập tức bằng cách nhìn vào hình vẽ nhưng lại đòi hỏi những chương trình không đơn giản, ví dụ như kiểm tra một điểm có nằm trong đa giác hay không?. Có thể vì những lý do như trên mà nhiều nguời còn e ngại khi lập trình các bài toán liên quan đến nội dung hình học mặc dù họ không hề phủ nhận đó là những bài toán rất hay. Xuất phát từ nhận thức trên, được sự đồng ý của Hội đồng khoa học Khoa CNTT và sự hướng dẫn của Thầy giáo Nguyễn Văn An, em đã lựa chọn đề tài “Một số thuật toán liên quan đến nội dung hình học” làm luận văn tốt nghiệp của mình. 5 2. Mục đích - yêu cầu và phạm vi nghiên cứu * Tìm hiểu và lập trình thể hiện một số thuật toán liên quan đến nội dung hình học. * Áp dụng vào một số bài toán cụ thể như: Tìm thể tích nước ngập trong một vùng, tìm phần giao của các đa giác, một số đề thi học sinh giỏi, đề thi Olimpic 3. Phương pháp nghiên cứu * Nghiên cứu tài liệu, sách báo * Lấy ý kiến chuyên gia. * Lập trình minh họa các thuật toán liên quan. 4. Cấu trúc của luận văn Luận văn bao gồm 3 chương và phần phụ lục: Chương 1: Trình bày các khái niệm về các đối tượng hình học cơ bản, mối tương quan giữa chúng và một số bài tập áp dụng. Chương 2: Trình bày chi tiết thuật toán tìm phần giao và phần hợp của hai đa giác và bài toán mở rộng của thuật toán này. Chương 3: Trình bày thuật toán tìm thể tích nước ngập trong mô hình dữ liệu địa lý Raster. Phần phụ lục là cài đặt minh họa một số hàm, thủ tục liên quan đến thuật toán tìm phần giao của hai đa giác. Để hoàn thành luận văn này, cùng với sự nỗ lực của bản thân là sự giúp đỡ chỉ bảo tận tình, cặn kẽ của của Thầy giáo Nguyễn Văn Trường. Em xin chân thành cảm ơn sự giúp đỡ chỉ bảo quý báu của Thầy! Em xin chân thành cảm ơn sự tạo điều kiện của Ban chủ nhiệm khoa Toán, sự động viên, chỉ bảo của các Thầy Cô giáo trong Khoa đã giúp em hoàn thành khóa luận này! 6 Tôi xin cảm ơn các bạn sinh viên lớp sư phạm Tin Học K37 đã cổ vũ động viên tôi trong quá trình thực hiện khóa luận! Dù đã có nhiều cố gắng nhưng luận văn không tránh khỏi những thiếu sót, tác giả rất mong nhận được sự đóng góp ý kiến của các Thầy, Cô và các bạn để khóa luận được hoàn thiện. 7 Chương 1. CƠ SỞ LÝ THUYẾT Chương này giới thiệu những cơ sở lý thuyết cơ bản nhất về các đối tượng hình học, qua đó giúp đọc giả có thể hiểu rõ hơn về các đối tượng hình học và mối tương quan giữa chúng. 1.1. Một số đối tượng hình học 1.1.1. Điểm Điểm thường được xét bằng một cặp số thực là tọa độ của điểm đó trong hệ trục tọa độ Descarter thường dùng [4]. Trong hầu hết các bài toán hình học chúng ta sẽ dùng kiểu lưu trữ đơn giản, dễ hiểu như sau: typedef struct { float x, y; }xy; Chính vì vậy khi xét tới tọa độ của P(x, y) thì ta xét tới P.x, P.y. Chúng ta có thể tính được khoảng cách giữa hai điểm A(x1, y2), B(x2, y2) trong mặt phẳng tọa độ như sau: float khoangcach (xy A, xy B) {float T; T = sqrt ((A.x - B.x)* (A.x- B.x) +(A.y - B.y)*(A.y- B.y)); return T; } 1.1.2. Đường thẳng Trong hình học, chúng ta có phương trình của một đường thẳng trong mặt phẳng: Ax + By + C = 0. Chúng ta coi A, B, C là biểu diễn cho đường 8 thẳng đó. Nếu một đường thẳng (d): Ax + By + C = 0, đi qua 2 điểm A(x1, y1) và B(x2, y2) thì ta có: A: = y1- y2; B: = x2 - x1; C: = -(A*x1 + B* y1); //[8] 1.1.3. Đoạn thẳng Đoạn thẳng là một cặp điểm được nối với nhau bởi một phần của đường thẳng [4]. 1.1.4. Đa giác 1.1.4.1. Tam giác Tam giác được định nghĩa là tập ba điểm không thẳng hàng: A(x1, y1), B(x2, y2), C(x3, y3). Chúng ta có thể tính diện tích tam giác theo công thức Herong S = Sqrt ((p - a)*(p - b)*(p - c)*p), trong đó a, b, c là độ dài ba cạnh của tam giác, p = (a + b + c)/2 hoặc tính theo công thức: 1 , 2 S AB AC     = r r [4]. 1.1.4.2. Hình chữ nhật Chúng ta xét trường hợp cho các cạnh song song với các trục tọa độ. Trong hệ tọa độ Descarter vuông góc, xét một hình chữ nhật ABCD, A(x1, y1); B(x2, y2); C(x3, y3); D(x4, y4). Nhưng có một điều đặc biệt là chúng ta chỉ cần xác định tọa độ đỉnh của hai đỉnh đối nhau thì xác định được một hình chữ nhật duy nhất. Chính vì thế thông thường chúng ta gọi tọa độ của điểm dưới trái và điểm trên phải là hai điểm đặc trưng cho hình chữ nhật đó [4]. 1.1.4.3. Đa giác Đa giác là một dãy các điểm với hai điểm liên tiếp được nối bởi một đoạn thẳng, và điểm đầu nối với điểm cuối tạo thành một hình gấp khúc khép kín. 9 Đa giác được gọi là đa giác lồi khi mọi điểm còn lại của đa giác nằm cùng phía với nhau so với một cạnh nào đó [4]. Để tính diện tích đa giác (lồi hoặc lõm và không tự cắt) gồm n đỉnh A[1], A[2], , A[n] ta làm như sau: Chia đa giác thành n - 2 tam giác rồi tính tổng diện tích của các tam giác ấy. Tuy nhiên phương pháp này dài dòng, ta làm cách khác như sau: Chia đa giác thành các hình thang bằng cách chiếu các cạnh xuống trục hoành (hình vẽ). Hình thang được xác lập bởi cạnh A[i]A[i+1] có diện tích là Abs (S) với: Sau khi gán đỉnh A[n+1] = A[1] ta tính diện tích toàn phần của đa giác như sau: S = 0; For (i: = 1; i< = n; i++) S = (1/2) * Abs (S); Chú ý: a. Hoàn toàn tương tự ta có thể tìm diện tích của đa giác bằng cách chiếu các cạnh xuống trục tung. b. Nếu thay bước gán S = (1/2) * abs (S) bởi S = S/2 thì dấu của S là dương hay âm sẽ cho ta biết chiều đánh số của các đỉnh theo thứ tự từ 1, 2, , n là ngược hay xuôi chiều kim đồng hồ. c. Thông thường ta dùng mảng một chiều để biểu diễn một đa giác. 1.2. Phương trình tương quan giữa điểm và đường thẳng, đoạn thẳng 1.2.1. Tương quan giữa điểm và đường thẳng [ ] [ ] ( ) [ ] [ ] ( ) 1 . . 1 . * . 1 . 2 S A i x A i x A i y A i y = − + + + [ ] [ ] ( ) [ ] [ ] ( ) . 1 . * . 1 . ;S S A i x A i x A i y A i y = + − + + + y x A i + +i A i+1 O 10 [...]... Dữ liệu: Vào cho trong file DAGIAC.INP: dòng đầu tiên là một số nguyên n>3 là số cạnh của đa giác A, tiếp đó là n dòng, mỗi dòng theo thứ tự ghi hai số thực cách nhau một dấu cách là tọa độ của các đỉnh của đa giác; dòng tiếp theo là một số nguyên m>3 là số cạnh của đa giác B, tiếp đó là m dòng, mỗi dòng theo thứ tự ghi hai số thực cách nhau một dấu cách là tọa độ của các đỉnh của đa giác B Dữ liệu:... nhiều nhóm dòng Nhóm thứ i mô tả về một đa giác là giao của A và B và có cấu trúc như sau: dòng đầu ghi một số nguyên dương là số cạnh của đa giác, tiếp đó là một số thực là diện tích của đa giác, và mỗi dòng còn lại theo thứ tự ghi hai số là tọa độ của các đỉnh của đa giác thứ i tương ứng Nếu A và B không có giao điểm thì ghi một số 0 Minh hoạ kết quả trên màn hình đồ hoạ 31 ví dụ: Dagiac.inp 6 02... điểm cụm lại thành đám (ví dụ, tất cả các điểm có thể rơi trong một ô, nghĩa là các ô khác sẽ không chứa gì cả) 21 - Cần có kỹ thuật duyệt để hạn chế số lượng hay khoanh vùng các ô vuông nhỏ cần kiểm tra Chẳng hạn, với bài toán trên thì rõ ràng ta chỉ cần duyệt các ô vuông nằm trong một hình vuông ngoại tiếp một trong hai đường tròn Thuật toán tìm phần hợp của hai đường tròn rất đơn giản là ta chỉ việc... scanf("%f%f%f",&i2.x,&i2.y,&r2); tinh(); getch(); } 30 Chương 2 THUẬT TOÁN TÌM PHẦN GIAO VÀ PHẦN HỢP CỦA HAI ĐA GIÁC Trong chương này chúng tôi sẽ trình bày chi tiết thuật toán tìm phần giao và hợp của hai đa giác trong trường hợp tổng quát: các đa giác lồi hoặc lõm (không tự cắt) và các bài toán mở rộng của thuật toán này 2.1 Bài toán 1 Bài toán đặt ra như sau: Hãy tìm các đa giác là phần giao của hai... trong hình vuông ngoại tiếp đường tròn có bán kính bé hơn Đến đây chúng ta có thể giải được nhiều bài toán tương tự với các đối tượng hình học khác như giữa hai (hay nhiều) tam giác, giữa hai (hay nhiều) hình chữ nhật hay hỗn hợp nhiều loại đối tượng với nhau, chẳng hạn tìm giao của đường tròn và tam giác 1.4.6 Bài toán áp dụng phương pháp lưới Ta nói rằng đoạn AB nhìn thấy được từ điểm C dưới một góc... void main() {docfile(); xuly(); getch(); } 1.4.4 Kiểm tra vị trí của một điểm với một đa giác Bài toán: kiểm tra vị trí của một điểm M so với một đa giác Xét đa giác có thể lồi hay lõm như hình vẽ A5 M’ A4 A7 A6 M A1 A3 A2 18 Để giải bài toán này ta có hai cách sau: C1: Trước hết ta tìm M’(x, y) sao cho x > max {xi|xi là hoành độ một đỉnh i của đa giác; i = 1, 2 } Còn y có giá trị sao cho đoạn MM’... liệu: Ra ghi vào file CIRCLE.OUT gồm hai dòng, dòng đầu tiên ghi một số thực là diện tích phần giao, dòng tiếp theo ghi diện tích phần hợp (các số thực được lấy chính xác đến hai chữ số thập phân) Ví dụ: CIRCLE.INP 001 003 CIRCLE.OUT 3.12 28.30 Thuật toán tìm diện tích phần giao (hay còn gọi là phương pháp chia lưới): Chia mặt phẳng ra thành một lưới các ô vuông bởi các đường thẳng song song với các trục... (“ Khong cat nhau”); Getch();} 1.4 Một số bài tập áp dụng 1.4.1 Kiểm tra một điểm thuộc một tia A Bài toán: kiểm tra điểm M có thuộc tia AB hay không? M B Điểm M thuộc tia AB ⇔ 2 điều kiện sau đều thoả mãn: 1 M, A, B thẳng hàng ⇔ F(A, B, M) = 0 2 A không nằm giữa B, M ⇔ (xm - xa)*(xb - xa) ≥ 0 và (ym - ya)*(yb -ya) ≥ 0 1.4.2 Kiểm tra một tia có cắt một đoạn không Bài toán: kiểm tra tia AB có cắt đoạn... giác nằm trong màn hình đồ họa 21 Thủ tục truc: Vẽ trục tọa độ 22 Thủ tục inkq: Hiện lên màn hình đồ họa 2.1.4 Đánh giá thuật toán Thuật toán gồm 03 bước chính: Bước 1 Tìm giao điểm các cạnh của một đa giác với các cạnh của đa giác kia và sắp xếp (sử dụng QuickSort) các giao điểm tìm được có độ phức tạp tương ứng là O(n.m) và O(klogk), với k = max(n, m) Bước 2 Xử lý các cạnh có một phần giao nhau như... AB có thể tìm được một điểm D sao cho AB ⊥ CD Bài toán như sau: Cho một đa giác N đỉnh, hãy xác định một điểm nằm trên đa giác (hoặc ở phần trong, hoặc ở trên cạnh) sao cho từ đó có thể nhìn được dưới một góc vuông nhiều cạnh của đa giác nhất Dữ liệu: Vào từ file văn bản DAGIAC.INP:  Dòng đầu tiên chứa số đỉnh của đa giác N (3 ≤ N ≤ 100)  N dòng tiếp theo mỗi dòng chứa tọa độ của một đỉnh của đa giác . Một số thuật toán liên quan đến nội dung hình học làm luận văn tốt nghiệp của mình. 5 2. Mục đích - yêu cầu và phạm vi nghiên cứu * Tìm hiểu và lập trình thể hiện một số thuật toán liên quan. ĐẠI HỌC THÁI NGUYÊN NGUYỄN THANH HOA MỘT SỐ THUẬT TOÁN LIÊN QUAN ĐẾN NỘI DUNG HÌNH HỌC Chuyên ngành: Tin học LUẬN VĂN TỐT NGHIỆP ĐẠI HỌC Người hướng dẫn khoa học: Thạc sĩ: Nguyễn. bài toán liên quan đến nội dung về hình học. Những bài toán dạng này đòi hỏi người lập trình không những phải nắm vững các kiến thức về toán học mà còn phải có tư duy thuật toán tốt. Đa số các

Ngày đăng: 21/07/2014, 18:55

Từ khóa liên quan

Mục lục

  • MỘT SỐ THUẬT TOÁN LIÊN QUAN ĐẾN NỘI DUNG HÌNH HỌC

  • Chuyên ngành: Tin học

  • Thạc sĩ: Nguyễn Văn An

    • { float T;

    • return T;

    • {i = 1;

    • Tim_M;

    • void main()

    • Chương 2. THUẬT TOÁN TÌM PHẦN GIAO

    • VÀ PHẦN HỢP CỦA HAI ĐA GIÁC

      • Thuật toán

        • Test 1 Test 2

        • Algorithm NGAP

        • KẾT LUẬN

        • PHỤ LỤC

Tài liệu cùng người dùng

Tài liệu liên quan