Đề tài các thuật toán cơ bản trong pascal

28 707 4
Đề tài các thuật toán cơ bản trong pascal

Đ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

0 thì hai đoạn thẳng có hướng và cộng tuyến. Ngược chiều kim đồng hồ Cùng chiều kim đồng hồ Hình 1.3. Dùng đại lượng C(, ) để xác định chiều quay của các đoạn thẳng có hướng liên tiếp và 1.6. Xác định hai đoạn thẳng giao nhau Để kiểm tra hai đoạn thẳng và có giao nhau hay không ta tiến hành qua hai giai đoạn. Giai đoạn thứ nhất là phép loại nhanh các đoạn thẳng không thể giao nhau đó là trường hợp hai hình chữ nhật định cận không giao nhau. Hình chữ nhật định cận của một hình là hình chữ nhật nhỏ nhất chứa hình đó và có các cạnh song song với hai trục toạ độ. Với đoạn thẳng thì hình chữ nhật định cận là hình chữ nhật được biểu diễn thông qua hai điểm và , trong đó , , , . Hai hình chữ nhật định cận của và là (, ) và (, ) giao nhau nếu và chỉ nếu phép hội là đúng. Các hình chữ nhật phải giao nhau theo cả hai chiều; chiều của trục x (thể hiện ở hai phép so sánh đầu tiên) và chiều của trục y (thể hiện ở hai phép so sánh cuối cùng). Giai đoạn thứ hai để xác định hai đoạn thẳng có giao nhau hay không khi biết các hình chữ nhật định cận đã giao nhau. Để biết được điều này, chúng ta xét xem mỗi đoạn thẳng có nằm trên đường thẳng chứa đoạn thẳng kia hay không. Nếu thoả mãn điều kiện trên thì ta kết luận hai đoạn thẳng giao nhau. a)P4 P3 P2 P1 b)P2 P3 P4 P1 c)P2 P3 P4 P1 d) P2 P1 P3 P4 Hình 1.4. Xác định xem đoạn thẳng nằm trên đường thẳng chứa đoạn thẳng . (a) Nếu nó nằm trên, thì các dấu của các và khác nhau; (b) Nếu nó không nằm trên, thì các dấu của hai đại lượng trên là giống nhau; (c)(d) Tồn tại một đại lượng bằng 0 nếu có ít nhất một cận của nằm trên đường thẳng kia. Ta có thể dùng phương pháp tích vectơ để xác định đoạn thẳng có nằm trên đường thẳng chứa đoạn thẳng hay không. Như đã nêu trong hình 1.4. (a) và (b), ta xét xem các đoạn thẳng có hướng và có hướng trái ngược nhau tương đối với hay không. Tức là, dấu của đại lượng và có khác nhau hay không. Nếu có, thì đoạn thẳng nằm trên đường thẳng, ngược lại thì đoạn thẳng không nằm trên đường thẳng. Trong trường hợp hoặc nằm trên đường thẳng chứa đoạn thẳng thì sẽ có một đại lượng hoặc bằng 0. Ta gọi đây là trường hợp cận như đã thấy trong hình 1.4. (c) và (d). Độ dài một đoạn thẳng bằng 0 khi và chỉ khi bằng 0. Sau đây là đoạn chương trình minh hoạ hai đoạn thẳng có giao nhau hay không. Giá trị trả về là 1 nếu hai đoạn thẳng giao nhau; 0 nếu hai đoạn thẳng không giao nhau. FUNCTION Intersect(L1,L2 : Line) : Boolean; Var x1, x2, x3, x4, y1, y2, y3, y4 : Integer; Begin x1:=Min(L1.P1.x,L1.P2.x); y1:=Min(L1.P1.y,L1.P2.y); x2:=Max(L1.P1.x,L1.P2.x); y2:=Max(L1.P1.y,L1.P2.y); x3:=Min(L2.P1.x,L2.P2.x); y3:=Min(L2.P1.y,L2.P2.y); x4:=Min(L2.P1.x,L2.P2.x); y4:=Min(L2.P1.y,L2.P2.y); If (x2>x3) and (x4>x1) and (y2>y3) and (y4>y1) Then If (ccw(l1.p1,l2.p2,l1.p2)ccw(l1.p1,l2.p1,l1.p2)0 thì hai cạnh này cùng phía với nhau so với tia kiểm tra, ngược lại hai cạnh này khác phía với nhau so với tia kiểm tra. Trong thuật toán sau đây ta đã hoán đổi đa giác ban đầu về một đa giác cùng hình dạng nhưng đỉnh bắt đầu là đỉnh Q1. Q1 là đỉnh có toạ độ y nhỏ nhất. Trong trường hợp có nhiều đỉnh có cùng toạ độ y nhỏ nhất thì ta lấy đỉnh có toạ độ x nhỏ nhất. Trong cài đặt thuật toán, ta sử dụng kỹ thuật dùng một điểm Q0 có toạ độ (∞, ∞) để làm lính canh cho việc xử lý trường hợp đỉnh Q1. Kết quả trả về của đoạn chương trình là True nếu điểm P nằm trong đa giác; False nếu điểm P nằm ngoài đa giác. FUNCTION cn_poly(P: Point; Poly: Polygon, n: Integer):Boolean; Var d1, d2, cn, i, j, Min : Integer; L1, L2 : Line; Q : Polygon; Begin Min:=1; For i:=2 to n do If Polyi.y0) Then wn:=wn+1 End Else Begin If (Polyi+1.y

Ngày đăng: 17/10/2014, 21:53

Từ khóa liên quan

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

Tài liệu liên quan