Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
246,96 KB
Nội dung
MỘT SỐ THUẬT TỐN HÌNH HỌC 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 tố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 có tốn ta phải giải với chi phí thuật tố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 khơng phải vấn đề khó khăn Nhưng ta nên có cách biểu diễn thống cho riêng mình, dễ dàng việc thể thuật tốn Thơng thường người ta có 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; Page of 21 Để 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 tố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 tốn ta phải có chọn lựa hợp lý Bảng kiểu số thực mà Pascal có sẵn: Kiểu Giới hạn Chữ số có 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 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 tố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 có chọn lựa giá trị Page of 21 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ó cảm giác vơ nghĩa, thực tế lại quan trọng số thuật toán cụ thể B C A C B A Rẽ phải Rẽ trái Ta dùng tích có 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 có hướng xin tham khảo chỗ khác) Page of 21 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 đơi để tiện lợi cho tính tốn, ta phải có phương trình dạng tổng qt Đ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; Page of 21 b := p2.x – p1.x; with p1 c := -(a*x + b*y); end; Việc kiểm tra hai đoạn thẳng có cắt khơng cần thiết khơng phải 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 có Nhưng cách làm thơ thiển bình thường tốt hơn: function Intersect(l1, l2: Line): Boolean; 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 có lẽ vấn đề t tốn học thơi 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 Page of 21 đường giới hạn đường thẳng nên việc tính tố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 có lý Nếu theo thứ tự p[1], p[2],…, p[n] ngược chiều kim đồng hồ ta có 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 ln bên phía tay phải ta, phía bên tay trái phần ngồi đ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 tốn: Cho đa giác khơng tự cắt, kiểm tra xem điểm có nằm đa giác hay khơng? Page of 21 Tư tưởng cho tố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 có nghĩa nằm ngồi đ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 tốn Vì vậy, thuật giải tố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 tốn function Inside(t: Point): Boolean; Page of 21 var Count, i, l: Integer; Ray, li: Line; begin if t.y = then Break else if Dist(p[i], p[j]) < then Page 20 of 21 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ó 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 21 of 21 ... đồ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ố ngun (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 tốn... giải tố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 tốn ta phải có chọn lựa hợp lý Bảng kiểu số thực mà... có nghĩa nằm ngồi đ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 tốn Vì vậy, thuật giải tốn sau: Ta vòng