1. Trang chủ
  2. » Giáo Dục - Đào Tạo

MỘT số THUẬT TOÁN HÌNH học cơ bản

15 209 0

Đ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 15
Dung lượng 135 KB

Nội dung

MỘT SỐ THUẬT TOÁN HÌNH HỌC BẢN Hình học giác quan người quen thuộc dễ dàng Nhưng hình học máy tính lại vấn đề khác Nhiếu toán ta giải cách “nhìn vào hình vẽ ta thấy”, để thể máy tính cần chương trình không đơn giản chút Các giải thuật hình học thường giải thuật đẹp bất ngờ Thực vậy, tưởng toán ta phải giải với chi phí thuật toán lớn (đôi chấp nhận được), nhờ vào tính chất đặc biệt hình học mà ta lại giải cách dễ dàng “đẹp mắt” I Biểu diễn hình học máy tính Đây vấn đề khó khăn Nhưng ta nên cách biểu diễn thống cho riêng mình, dễ dàng việc thể thuật toán Thông thường người ta cách biểu diễn sau: Điểm: Point = record x, y: Real; end; Đường thẳng: Line = Record p1, p2: Point; end; Đa giác: Polygon = array[1 n] of Point; Để thuận lợi biểu diễn đa giác ta nên thêm hai đỉnh đầu cuối: đỉnh đỉnh n đỉnh n + đỉnh Từ ta thống với cách khai báo cho đoạn chương trình dùng đến Chú ý: Ta dễ dàng nhận thấy phép toán thực để giải toán hình học hầu hết phải làm việc với số thực Vì ta cần phải ý số mẹo nhỏ khai báo liệu biên dịch Tuỳ vào kích thước yêu cầu độ xác kết toán ta phải chọn lựa hợp lý Bảng kiểu số thực mà Pascal sẵn: Kiểu Giới hạn Chữ số nghĩa Kích thước (Byte) Single 1.5e-45 3.4e38 7-8 Real 2.9e-39 1.7e38 11-12 Double 5.0e-324 1.7e308 15-16 Page of Extended 3.4e-4932 1.1e4932 19-20 10 Đặc biệt, ta dùng Double Extended ta phải khai báo biên dịch {$N+}, ta nên lúc làm Vì máy tính dùng đồng xử lý toán học, phép toán với số thực thực nhanh chẳng so với số nguyên (thậm chí nhanh ta dùng kiểu số thực Double) Tốt dùng thử tự so sánh, thấy khác biệt Một điều cần ý sai số tính toán Làm việc với số thực ta phải chấp nhận với sai số định Vì so sánh hai giá trị với ta ý không dùng dấu “=”, mà phải xét trị tuyệt đối hiệu hai giá trị với giá trị Epsilon Ở đây, Epsilon số tương đối bé, tuỳ vào yêu cầu toán mà ta chọn lựa giá trị Ví dụ: Không dùng: if x1 = x2 then … mà phải dùng : if Abs(x1 – x2) < Eps then … II Các phương pháp hình học Điểm, đoạn thẳng - đường thẳng, diện tích đa giác a Quan hệ điểm - hàm CCW Điều gợi nhớ ta nhắc đến quan hệ điểm khoảng cách chúng Ta tính khoảng cách hai điểm sau: function Dist(p1, p2: Point): Real; begin Dist := Sqrt(Sqr(p1.x – p2.x) + Sqr(p1.y – p2.y)); end; Nhiều ta phải trả lời câu hỏi: “việc từ A, B sang C ta rẻ phải hay rẽ trái?” Điều tưởng chừng đơn giản cảm giác vô nghĩa, thực tế lại quan trọng số thuật toán cụ thể B A C C B A Rẽ phải Rẽ trái Page of Ta dùng tích hướng không gian để giải vấn đề Ta làm việc không gian chiều (mặt phẳng) chiều thứ giá trị Zero (nếu hỏi tích hướng xin tham khảo chỗ khác) Hàm CCW sau trả -1 rẽ trái, rẽ phải, điểm thẳng hàng Bạn đọc xử lý cụ thể trường hợp điểm thẳng hàng (điểm nằm giữa), nhiều ứng dụng điều không cấn thiết function CCW(p1, p2, p3: Point): Integer; var a1, b1, a2, b2, t: Real; begin a1 := p2.x – p1.x; b1 := p2.y – p1.y; a2 := p3.x – p2.x; b2 := p3.y – p2.y; t := a1*b2 – a2*b1; if Abs(t) < Eps then CCW := else if t > then CCW := else CCW := -1; end; b Đường thẳng, đoạn thẳng giao chúng Để biểu diễn đường thẳng ta biểu diễn toạ độ hai điểm đường thẳng Nhưng để tiện lợi cho tính toán, ta phải phương trình dạng tổng quát Điều dễ dàng, bạn đọc tham khảo thủ tục sau procedure Extract(p1, p2: Point; var a, b, c: Real); begin a := p1.y – p2.y; b := p2.x – p1.x; with p1 c := -(a*x + b*y); end; Việc kiểm tra hai đoạn thẳng cắt không cần thiết vấn đề khó Hai đoạn thẳng cắt hai đầu đoạn nằm hai phía đường thẳng chứa đoạn Ta dùng hàm CCW Nhưng cách làm thô thiển bình thường tốt hơn: function Intersect(l1, l2: Line): Boolean; Page of var a1, b1, c1, a2, b2, c2, t1, t2: Real; begin Extract(l1.p1, l1.p2, a1, b1, c1); Extract(l2.p1, l2.p2, a2, b2, c2); with l1 t1 := (p1.x*a2+p1.y*b2+c2)*(p2.x*a2+p2.y*b2+c2); with l2 t2 := (p1.x*a1+p1.y*b1+c1)*(p2.x*a1+p2.y*b1+c1); Intersect := (t1 < Eps) and (t2 < Eps); end; Nếu ta muốn tính cụ thể toạ độ giao điểm hai đường thẳng lẽ vấn đề tuý toán học Bạn đọc thử tự cài đặt xem c Diện tích đa giác Để tính diện tích đa giác ta dùng cách tính diện tích hình bị giới hạn đường (kiến thức vi phân) Trong trường hợp đường giới hạn đường thẳng nên việc tính toán dễ dàng Ta thử tham khảo thủ tục sau: function Area: Real; var i: Integer; S: Real; begin p[n + 1] := p[1]; S := 0; for i := to n + S := S + (p[i].x – p[i – 1].x)*(p[i].y + p[i – 1].y); Area := Abs(S)/2; end; Việc ta lấy trị tuyệt đối S lý Nếu theo thứ tự p[1], p[2],…, p[n] ngược chiều kim đồng hồ ta S âm, ngược lại ta nhận S dương Điều quan trọng số trường hợp cụ thể Chú ý: định nghĩa xác cho khái niệm thuận hay ngược chiều kim đồng hồ sau: Nếu ta thuận chiều kim đồng hồ phần đa giác bên phía tay phải ta, phía bên tay trái phần Page of đa giác Tất nhiên ngược chiều kim đồng hồ trường hợp lại Điểm nằm đa giác Bài toán: Cho đa giác không tự cắt, kiểm tra xem điểm nằm đa giác hay không? Tư tưởng cho toán nói qua đơn giản dễ hiểu: Từ điểm cần kiểm tra ta kẻ tia bất kỳ, tia giao với đa giác số chẵn lần nghĩa nằm đa giác, số lẻ lần nằm đa giác Nhưng thực tế nhiều trường hợp cần phải giải quết triệt để: Một số trường hợp gây khó khăn cho thuật toán Vì vậy, thuật giải toán sau: Ta vòng quanh đa giác, ta từ bên tia sang bên khác ta tính lần giao với đa giác Dưới cách cài đặt, bạn đọc cải tiến tìm cách cài đặt khác hay Ta dùng lại hàm Intersect nói phần trước Để tiện lợi, ta coi đỉnh đỉnh thấp đa giác (có toạ độ y nhỏ nhất) Hơn nữa, việc ta chọn tia tuỳ thích, ta chọn tia song song chiều với chiều dương trục Ox, dễ dàng cho tính toán function Inside(t: Point): Boolean; var Count, i, l: Integer; Ray, li: Line; Page of begin if t.y = then Break else if Dist(p[i], p[j]) < then Page 14 of begin {cập nhật kết quả} := Dist(p[i], p[j]); Result.x := p[i]; Result.y := p[j]; end; end; Merge(l, r); {trộn hai phần} end; Result biến lưu kết quả, cấu trúc giống kiểu Line Biến dùng để lưu khoảng cách nhỏ tìm thời điểm Page 15 of ... xử lý toán học, phép toán với số thực thực nhanh chẳng so với số nguyên (thậm chí nhanh ta dùng kiểu số thực Double) Tốt dùng thử tự so sánh, thấy khác biệt Một điều cần ý sai số tính toán Làm... có nghĩa nằm đa giác, số lẻ lần nằm đa giác Nhưng thực tế có nhiều trường hợp cần phải giải quết triệt để: Một số trường hợp gây khó khăn cho thuật toán Vì vậy, thuật giải toán sau: Ta vòng quanh... until li = n + 1; end; b Thuật toán Graham Thuật toán bọc gói đòi hỏi chi phí O(M*N) (trong M số điểm bao) Vì làm việc tốt trường hợp số điểm nằm bao nhỏ nhiều so với tổng số Nhưng trường hợp xấu

Ngày đăng: 12/09/2017, 16:09

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w