Nghiên cứu về đường và mặt trong hình học fractal ứng dụng cài đặt chương trình tạo ảnh trên máy tính

80 438 0
Nghiên cứu về đường và mặt trong hình học fractal  ứng dụng cài đặt chương trình tạo ảnh trên máy tính

Đ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

LỜI CẢM ƠN Em xin chân thành cảm ơn cô giáo hướng dẫn ThS Nguyễn Hiền Trinh giúp đỡ dìu dắt tận tình cô suốt trình em thực đồ án Em xin cảm ơn quý thầy cô môn Khoa học máy tính – Khoa CNTT – Đại học Thái Nguyên giảng dạy, trang bị cho em kiến thức quý báu suốt năm học vừa qua Em xin gửi lời cảm ơn đến gia đình bè bạn tạo điều kiện động viên em hoàn thành đồ án yêu cầu thời gian Mặc dù cố gắng để có kết tốt chắn đề tài tránh khỏi thiếu sót định Rất mong nhận thông cảm đóng góp ý kiến vô quý báu quý Thầy Cô, bạn bè để đề tài hoàn thiện Em xin chân thành cảm ơn! Sinh viên thực Nguyễn Huyền Trang LỜI CAM ĐOAN Em xin cam đoan : Những nội dung đồ án em thực hướng dẫn trực tiếp cô giáo ThS Nguyễn Hiền Trinh Mọi tham khảo dùng đồ án trích dẫn rõ ràng tên tác giả, tên công trình, thời gian, địa điểm công bố Mọi chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, em xin chịu hoàn toàn trách nhiệm Sinh viên Nguyễn Huyền Trang MỤC LỤC LỜI CẢM ƠN LỜI CAM ĐOAN MỤC LỤC LỜI MỞ ĐẦU Chương TỔNG QUAN VỀ HÌNH HỌC FRACTAL 1.1 Sự đời phát triển lý thuyết hình học phân hình .7 1.1.1 Sự đời lý thuyết hình học phân hình 1.1.2 Sự phát triển lý thuyết hình học phân hình .9 1.2 Ứng dụng hình học Fractal 10 1.2.1 Ứng dụng vấn đề tạo ảnh máy tính .11 1.2.2 Ứng dụng công nghệ nén ảnh .11 1.2.3 Ứng dụng nghiên cứu khoa học .12 1.3 Các kiến thức sở lý thuyết hình học Fractal 13 1.3.1 Một số khái niệm 13 1.3.2 Số chiều Fractal 13 Chương 17 MỘT SỐ HỌ ĐƯỜNG CƠ BẢN VÀ TẬP FRACTAL PHỔ BIẾN 17 2.1 Họ đường Vonkock .17 2.1.1 Đường hoa tuyết Vonkock ─ Snowflake .17 2.1.2 Đường Vonkock ─ Gosper 19 2.1.3 Đường Vonkock bậc hai 3–Đoạn 20 2.1.4 Đường Vonkock bậc hai 8–Đoạn 21 2.1.5 Generator phức tạp .22 2.2 Họ đường Peano 24 2.2.1 Đường Peano nguyên thủy 24 2.2.2 Đường Peano cải tiến 25 2.2.3 Tam giác Cesaro 26 2.2.4 Tam giác Cesaro cải tiến 27 2.2.5 Đường hoa tuyết Peano – đoạn 28 2.3 Đường Sierpinski 29 2.4 Tập Mandelbrot 30 2.4.1 Giới thiệu chung 30 2.4.2 Công thức toán học 31 2.4.3 Thuật toán thể tập Mandelbrot .31 Chương 37 GIẢI THUẬT LẶP HỖ TRỢ TẠO ẢNH FRACTAL 37 3.1 Các hệ hàm lặp IFS (Iterated Function System) 37 3.2 Các phép biến đổi Affine không gian R2 41 3.2.1 Các phép biến đổi quanh gốc tọa độ 41 3.2.2 Các phép biến đổi với gốc điểm 43 3.2.3 Hệ IFS phép biến đổi Affine không gian R2 46 3.3 Giải thuật lặp 47 3.3.1 Ý tưởng giải thuật 47 3.3.2 Giả mã giải thuật lặp 48 3.4 Giải thuật lặp ngẫu nhiên .49 3.4.1 Ý tưởng giải thuật 49 3.4.2 Giả mã giải thuật lặp ngẫu nhiên 50 Chương 52 CHƯƠNG TRÌNH TẠO ẢNH FRACTAL TRÊN MÁY TÍNH 52 4.1 Cài đặt số đường 52 4.1.1 Ý tưởng ứng dụng 52 4.1.2 Thuật toán .52 4.1.3 Thực cài đặt ứng dụng 55 4.1.4 Kết thực 71 4.2 Cài đặt mặt 72 4.2.1 Ý tưởng ứng dụng 72 4.2.2 Thuật toán .73 4.2.3 Thực cài đặt ứng dụng 73 4.2.4 Kết thực 74 4.3 Ứng dụng tạo ảnh Fractal 75 4.3.1 Ý tưởng ứng dụng 75 4.3.2 Thuật toán .75 4.3.3 Thực cài đặt ứng dụng 76 4.3.4 Kết thực 76 4.4 Đánh giá chung chương trình 77 4.4.1 Ưu điểm 77 4.4.2 Hạn chế 77 KẾT LUẬN 78 NHẬN XÉT CỦA GIÁO VIÊN 79 TÀI LIỆU THAM KHẢO 80 LỜI MỞ ĐẦU Trong năm gần đây, toán học khoa học tự nhiên bước lên bậc thềm mới, mở rộng sáng tạo khoa học trở nghiệm liên ngành Đề tài Hình học phân hình đông đảo người ý thích thú nghiên cứu Vấn đề cung cấp cho nhà khoa học môi trường phong phú cho thám hiểm mô hình hoá tính phức tạp tự nhiên Trong ngữ cảnh Hình học phân hình ngôn ngữ để mô tả, mô hình hoá phân tích dạng phức tạp tìm thấy tự nhiên Trong phần tử ngôn ngữ truyền thống (Hình học Euclide) dạng hiển thị đoạn thẳng, mặt phẳng… hình học phân hình thuật toán biến đổi thành dạng cấu trúc nhờ máy tính Việc nghiên cứu ngôn ngữ hình học tự nhiên mở nhiều hướng cho khoa học ứng dụng Và em xin đề cập đến vấn đề đồ án tốt nghiệp với nội dung: “Nghiên cứu đường mặt hình học Fractal Ứng dụng cài đặt chương trình tạo ảnh máy tính” Nội dung đồ án gồm: Chương 1: Trình bày tổng quan hình học phân hình Chương 2: Một số họ đường tập Fractal phổ biến Chương 3: Các giải thuật lặp hỗ trợ tạo ảnh Fractal Chương 4: Cài đặt chương trình tạo ảnh Fractal máy tính Sinh viên thực Nguyễn Huyền Trang Chương TỔNG QUAN VỀ HÌNH HỌC FRACTAL 1.1 Sự đời phát triển lý thuyết hình học phân hình 1.1.1 Sự đời lý thuyết hình học phân hình Hình học phân hình hay Fractal thuật ngữ nhà Toán học Mandelbrot đưa ông khảo sát hình tượng thiên nhiên đặc trưng độ dài Nhà toán học vĩ đại kỷ 20 nói rằng: “Các đám mây hình cầu, núi hình nón” Theo ông Fractal đối tượng hình học có hình dáng ghồ ghề, không trơn nhẵn thiên nhiên Cụ thể vật thể có tính đối xứng xếp phạm vi định, có nghĩa ta chia vật thể fractal, với hình dáng ghồ ghề, gãy góc thành phần nhỏ có đặc tính đối xứng cấu trúc tưởng hỗn đoạn Hình dáng đám mây, đường tia chớp ví dụ mà ta dễ nhìn thấy Khái niệm Fractal: Cho đến nhà toán học đưa khái niệm xác Nhưng ta hiểu sau: Một phân dạng (còn gọi hình học phân hình hay fractal) vật thể hình học thường có hình dạng gấp khúc tỷ lệ phóng đại, tách thành phần: phần trông giống hình tổng thể, tỷ lệ phóng đại nhỏ Sự đời lý thuyết hình học phân hình kết nhiều thập kỷ nổ lực giải vấn đề nan giải nhiều ngành khoa học xác, đặc biệt vật lý toán học Một cách cụ thể, lý thuyết hình học phân hình xây dựng dựa vấn đề lớn quan tâm thập niên đầu kỷ 20 Các vấn đề bao gồm: + Tính hỗn độn trình phát triển có quy luật tự nhiên + Mở rộng khái niệm số chiều độ đo lý thuyết hình học Euclide cổ điển * Tính hỗn độn trình phát triển có quy luật tự nhiên Các công thức lặp có dạng: Xn+1=f(Xn) thường sử dụng ngành khoa học xác để mô tả trình lặp lặp lại có tính xác định Các trình xác định công thức trên, f thể mối liên hệ phi tuyến hai trạng thái nối tiếp X n Xn+1, quan tâm đặc biệt Các khảo sát thập niên gần phát số khác lạ tiến trình lặp Khảo sát chi tiết nhà khí tượng học Edward N Lorenz tiến hành vào năm 1961 nghiên cứu hệ toán học mô dự báo thời tiết Về mặt lý thuyết, hệ cho kết dự đoán xác khoảng thời gian dài Tuy nhiên, theo Lorenz quan sát, bắt đầu tính toán lại dựa vào liệu cho hệ thời điểm tiếp sau không giống với kết dự đoán ban đầu Hơn sai số tính toán tăng lên nhanh chóng theo thời gian Điều dẫn đến kết luận tiến trình dự đoán lại từ thời điểm tiến trình dự báo, khoảng thời gian để kết dự báo xác bị thu hẹp lại tức dự báo xác thời tiết khoảng thời gian lớn Vấn đề Lorenz tìm thấy ngày gọi diện tính chất hỗn độn tiến trình lặp xác định * Sự mở rộng khái niệm số chiều độ đo lý thuyết hình học Euclide cổ điển Vào năm 1890 & 1891, tìm kiếm đặc trưng bất biến đối tượng hình học qua phép biến đổi đồng phôi lý thuyết topo, nhà toán học Peano & Hilbert phát minh đường cong có tính chất đặc biệt Đó đường cong không tự cắt theo quy luật, chúng lấp đầy miền hữu hạn mặt phẳng Hình học Euclide cổ điển quan niệm đường cong đối tượng chiều đường thẳng Tuy nhiên trực quan cho thấy cách nhìn số chiều gò bó Do người ta bắt đầu nghĩ đến phân lớp mới, đường có số chiều đại diện đường thẳng, đối tượng hai chiều đại diện mặt phẳng, đường cong lấp đầy mặt phẳng đại diện cho đối tượng có số chiều Ý tưởng cách mạng dẫn đến việc hình thành giải toán số chiều hữu tỷ gây nhiều tranh luận toán học thập kỷ gần Năm 1904 nhà toán học Thụy Điển Helge Koch đưa loại đường cong khác với đường cong Peano Hilbert Đó đường Von Kock Các đường cong Von Koch không lấp đầy mặt phẳng có độ dài thay đổi vô hạn chúng chứa miền hữu hạn Những đường cong có nhiều tự nhiên, ví dụ đường bờ biển, đường biên hoa tuyết, đám mây, vv… Tính chất đặc trưng cá đường cong tính đồng dạng (biểu giống phần nhỏ đường cong phóng lớn với phần khác lớn đường cong đó) Đây tính chất quan trọng việc hình thành nên dạng cấu trúc phức tạp tự nhiên, vào thời Von Koch lại hiểu biết sơ lược Chỉ với giúp đỡ máy tính điện tử, chất tính đồng dạng nghiên cứu đầy đủ chi tiết tác phẩm “Hình học phân hình tự nhiên” Benoit B Mandelbrot xuất năm 1982 Trong nghiên cứu mình, Mandelbrot phân rã dạng cấu trúc phức tạp tự nhiên thành thành phần gọi fractal Các fractal chứa đựng hình dáng tự đồng dạng với nhiều kích thước khác Mandelbrot tạo nên tranh fractal trừu tượng nhận thấy đằng sau đối tượng tự nhiên đám mây, dãy núi, khu rừng, vv… cấu trúc toán học tương tự Các đối tượng có khuynh hướng hài hoà màu sắc cân đối hình thể Ngoài Mandelbrot thiết lập cách xác định số chiều độ dài dạng fractal sở Với định nghĩa số chiều này, toán số chiều không nguyên giải cách hoàn chỉnh Có thể nói công trình Benoit B.Mandelbrot thức khai sinh lý thuyết hình học phân hình sau nửa kỷ nghiên cứu liên tục 1.1.2 Sự phát triển lý thuyết hình học phân hình Năm 1982, lý thuyết hính học phân hình thức đời phát triển cách nhanh chóng Sau đặt móng cho lý thuyết phân hình, Mandelbrot với nhà toán học khác A Douady J.Hubbard phát triển lý thuyết mặt fractal Các kết đạt chủ yếu tập trung tính chất cấu trúc fractal sở tập Mandelbrot tập Julia Ngoài nghiên cứu cố gắng tìm kiếm mối liên hệ cấu trúc này, ví dụ mối liên hệ tập Mandelbrot tập Julia Vào năm 1986, 1988, dựa công trình Mandelbrot (trong năm 1976, 1979, 1982) Hutchinson (1981), Michael F.Barnsley M.Begger phát triển lý thuyết biểu diễn đối tượng tự nhiên dựa sở lý thuyết hệ hàm lặp IFS Các hệ hàm lặp bao gồm hữu hạn phép biến đổi affine cho phép tạo nên hình ảnh đối tượng tự nhiên với giúp đỡ máy tính Theo lý thuyết hình học Euclide cổ điển có hiệu lực việc biểu diễn đối tượng nhân tạo nhà, cỗ máy lại không thích hợp cho việc biểu diễn đối tượng giới thực đòi hỏi lượng lớn đặc tả cần có Trong hình học Euclide, yếu tố sở đường thẳng, đường tròn, hình vuông, … lý thuyết IFS mở rộng hình học cổ điển với yếu tố sở vô số thuật toán để vẽ nên fractal tự nhiên Ngoài công trình có tính chất lý thuyết, hình học phân hình bổ sung nhiều nghiên cứu ứng dụng lý thuyết vào khoa học máy tính khoa học xác khác, ví dụ dựa lý thuyết IFS, Barnsley phát triển lý thuyết biến đổi phân hình áp dụng vào công nghệ nén ảnh tự động máy tính, lĩnh vực đòi hỏi kỹ thuật tiên tiến tin học đại Ưu điểm phương pháp nén ảnh Fractal là: trình Fractal hóa, bạn nhận chữ số nhỏ thể hình ảnh Do hệ số nén phương pháp lớn, chất lượng ảnh sau nén bảo đảm xác Phương pháp hiệu với ảnh có độ phân giải cao Phương pháp áp dụng nén liệu mà để thể mối quan hệ phần tử ánh xạ Hiện nhiều vấn đề, lý thuyết phân hình tiếp tục nghiên cứu Một vấn đề lớn quan tâm toán độ đo đa phân hình (multifractal measurement) có liên quan đến mở rộng khái niệm số chiều fractal với đối tượng fractal tự nhiên, đồng thời liên quan đến việc áp dụng độ đo fractal ngành khoa học tự nhiên 1.2 Ứng dụng hình học Fractal + Ứng dụng vấn đề tạo ảnh máy tính + Ứng dụng công nghệ nén ảnh + Ứng dụng nghiên cứu khoa học 10 } } else { } for (i = 0; i < NumLines; i++) { Pen p1 = new Pen(Color.Blue); g.DrawLine(p1, (int)(xPoint[i] + 0.5), (int)(yPoint[i] + 0.5),(int)(xPoint[i + 1] + 0.5), (int)(yPoint[i + 1] + 0.5)); } } - Tam giác Cesaro cải tiến Mức Với: Mức numLines = lineLen = 1/2 mảng Angles = { 0, 170, 0, -85, } Hàm phát sinh đường Cesaro cải tiến giống với hàm đường Cesaro gốc chiều dài đoạn generator có khác Chúng chia làm hai loại: Loại 1: Bằng nửa chiều dài đoạn thẳng ban đầu Loại 2: Bằng nửa chiều dài đoạn ban đầu nhân với 0.9128442 ( = – sin 5o) Đoạn mã cụ thể thể đường sau: //Phat sinh Tam giac Cesaro cai tien public static void CesaroCT(Graphics g, ref double x1, ref double y1, ref double x2, ref double y2, int level, int NumLines, double LineLen, double[] Angles, int[] sign) { double[] xPoint = new double[NumLines + 1]; double[] yPoint = new double[NumLines + 1]; int i; double t_x, t_y; double gocTheta, r, r1; level; r1 = Math.Sqrt(Math.Pow(x2-x1, 2)+Math.Pow(y2-y1,2))*LineLen; r = r1 * 0.9128442; xPoint[0] = x1; xPoint[NumLines - 2] = x2; yPoint[0] = y1; yPoint[NumLines - 2] = y2; 66 } gocTheta = tinhGoc(x1, y1, x2, y2); t_x = x1; t_y = y1; for (i = NumLines - 1; i >= 1; i -= 2) { Chuyen(ref t_x, ref t_y, r, gocTheta); xPoint[i] = t_x; yPoint[i] = t_y; gocTheta = quayGoc(gocTheta, Angles[i] * sign[level]); if (i == NumLines - 1) r = r1; } Chuyen(ref t_x, ref t_y, r, gocTheta); xPoint[NumLines] = t_x; yPoint[NumLines] = t_y; gocTheta = quayGoc(gocTheta, Angles[NumLines] * sign[level]); if (level > 0) { for (i = 0; i < NumLines - 2; i++) { x1 = xPoint[i]; y1 = yPoint[i]; x2 = xPoint[i + 1]; y2 = yPoint[i + 1]; CesaroCT(g, ref x1, ref y1, ref x2, ref y2, level, NumLines, LineLen, Angles, sign); } } else { Pen p1 = new Pen(Color.Blue); for (i = 0; i < NumLines - 2; i++) { g.DrawLine(p1, (int)(xPoint[i] + 0.5), (int)(yPoint[i] + 0.5), (int)(xPoint[i + 3] + 0.5), (int)(yPoint[i + 3] + 0.5)); } for (i = 1; i < NumLines - 1; i++) { g.DrawLine(p1, (int)(xPoint[i] + 0.5), (int)(yPoint[i] + 0.5), (int)(xPoint[i + 2] + 0.5), (int)(yPoint[i + 2] + 0.5)); } } - Đường hoa tuyết Peano – đoạn Mức Mức 67 Với: numLines = lineLen = 1/3 mảng Angles = { -60, 0, 60, 60, 60, 0, 60 } Giống trường hợp generator phức tạp, có khả lựa chọn cho vị trí generator phải chọn cẩn thận mức, đoạn thẳng để đảm bảo đường cong tạo thành không tự giao hay tự chồng lên Đoạn mã generator sau: public static void Peano7(Graphics g, ref double x1, ref double y1, ref double x2, ref double y2, int level, int NumLines, double LineLen, double[] Angles, int type, int sign) { double[] xPoint = new double[NumLines + 1]; double[] yPoint = new double[NumLines + 1]; int i; double t_x, t_y, gocTheta, r; switch (type) { case 0: break; case 1: { sign = sign * (-1); break; } case 2: { sign = sign * (-1); double temp; temp = x1; x1 = x2; x2 = temp; temp = y1; y1 = y2; y2 = temp; break; } case 3: { double temp; temp = x1; x1 = x2; x2 = temp; temp = y1; y1 = y2; y2 = temp; break; } } level; r = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)) * LineLen; xPoint[0] = x1; xPoint[NumLines] = x2; yPoint[0] = y1; yPoint[NumLines] = y2; gocTheta = tinhGoc(x1, y1, x2, y2); 68 t_x = x1; t_y = y1; gocTheta = quayGoc(gocTheta, Angles[0] * sign); for (i = 1; i < NumLines - 2; i++) { Chuyen(ref t_x, ref t_y, r, gocTheta); xPoint[i] = t_x; yPoint[i] = t_y; gocTheta = quayGoc(gocTheta, Angles[i] * sign); } for (i = NumLines - 1; i >= NumLines - 2; i ) { Chuyen(ref t_x, ref t_y, r, gocTheta); xPoint[i] = t_x; yPoint[i] = t_y; gocTheta = quayGoc(gocTheta, Angles[i] * sign); } } if (level > 0) { for (i = 0; i < NumLines; i++) { switch (i) { case 0: case 5: { type = 1; break; } case 1: case 2: case 3: case 6: { type = 2; break; } case 4: { type = 3; break; } } x1 = xPoint[i]; y1 = yPoint[i]; x2 = xPoint[i + 1]; y2 = yPoint[i + 1]; Peano7(g, ref x1, ref y1, ref x2, ref y2, level, NumLines, LineLen, Angles, type, sign); } } else { Pen p1 = new Pen(Color.Blue); for (i = 0; i < NumLines; i++) { g.DrawLine(p1, (int)(xPoint[i] + 0.5), (int)(yPoint[i] + 0.5), (int)(xPoint[i + 1] + 0.5), (int)(yPoint[i + 1] + 0.5)); } } 69 c Đường Sierpinski Mức Với: Mức numLines = lineLen = 1/2 mảng Angles = { -60, 60, } Để phát sinh đường ta dùng kỹ thuật giống đường họ Von Kock Peano phải sử dụng thêm tham số sign để đản bảo đường không tự cắt hay chồng lên Đoạn mã hàm Generator sau: //Phat sinh duong Sierpinski public static void Sierpinski(Graphics g, ref double x1, ref double y1, ref double x2, ref double y2, int level, int NumLines, double LineLen, double[] Angles, int sign) { double[] xPoint = new double[NumLines + 1]; double[] yPoint = new double[NumLines + 1]; int i, init_sign; double t_x, t_y, r, gocTheta; level; r = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)) * LineLen; xPoint[0] = x1; xPoint[NumLines] = x2; yPoint[0] = y1; yPoint[NumLines] = y2; gocTheta = tinhGoc(x1, y1, x2, y2); t_x = x1; t_y = y1; gocTheta = quayGoc(gocTheta, Angles[0] * sign); for (i = 1; i < NumLines; i++) { Chuyen(ref t_x, ref t_y, r, gocTheta); xPoint[i] = t_x; yPoint[i] = t_y; gocTheta = quayGoc(gocTheta, Angles[i] * sign); } sign *= -1; if (level > 0) 70 { init_sign = sign; for (i = 0; i < NumLines; i++) { x1 = xPoint[i]; y1 = yPoint[i]; x2 = xPoint[i + 1]; y2 = yPoint[i + 1]; Sierpinski(g, ref x1, ref y1, ref x2, ref y2, level, NumLines, LineLen, Angles, init_sign); init_sign *= -1; } } else { Pen p1 = new Pen(Color.Blue); for (i = 0; i < NumLines; i++) { g.DrawLine(p1, (int)(xPoint[i] + 0.5), (int)(yPoint[i] + 0.5), (int)(xPoint[i + 1] + 0.5), (int)(yPoint[i + 1] + 0.5)); } } } 4.1.4 Kết thực Kết thực cài đặt đường 71 4.2 Cài đặt mặt Mặt Mandelbrot 4.2.1 Ý tưởng ứng dụng Ứng dụng cài đặt thể việc mô mặt Fractal tiếng mặt Mandelbrot Mặt Mandelbrot (tập Mandelbrot) thể dãy số phức {zn} xác định bởi: z0 = zn+1 = zn2 + c (c∈ C) Với giá trị phức c ta có dãy số phức: c, c + c, (c2 + c)2 + c,… biểu diễn vô hạn điểm mặt phẳng phức Tập điển phức c cho tập biểu diễn dãy số phức {zn} bị chắn làm thành Fractal, gọi tập Mandelbrot Nói cách khác, thể tập Mandelbrot thể dãy số phức {z n} hình ảnh trực quan Với nhiều số khởi đầu c khác nhau, ta tạo tranh thể tập {zn} khác Ngoài với việc mở rộng lũy thừa tập Z không bậc nữa, ta có tập Mandelbrot hình thức lạ đẹp mắt 72 4.2.2 Thuật toán - Input: + Giá tri khởi đầu c(p,q) + Vùng khảo sát - Output: Hình ảnh tập Mandelbrot - Thuật toán thể tập Mandelbort mô tả sau: for(Col= 0; Col

Ngày đăng: 23/04/2017, 10:12

Từ khóa liên quan

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

Tài liệu liên quan