III. CÁC THUẬT TOÁN KIỂM TRA SỰ TƯƠNG QUAN GIỮA CÁC ĐỐI TƯỢNG HÌNH HỌC
3. Xác định giao điểm giữa hai đoạn thẳng
Cơ sở toán học:
Cho hai đoạn thẳng, xác định chúng có cắt nhau không, nếu có tìm giao điểm.Giả sử đường 1 từ a đến b và đường 2 từ c đến d như trong hình vẽ, hai đoạn thẳng có thể bố trí theo nhiều cách khác nhau.
a b c d d c b a b a d c a b c d 1 2
Luận văn tốt nghiệp
Thiết kế hệ thống kiểm tra cácc quan hệ hình họctrang 30 trang 30
Phương trình tham số cho mỗi đường như sau: x1 (t) = ax + (bx - ax) * t y1 (t) = ay + (by - ay) * t và
x2 (u) = cx + (dx - cx) * u y2 (u) = cy + (dy - cy) * u
Ta gọi các đường thẳng chứa các đoạn thẳng ab và cd là các đường cha, đây là các đường vô hạn. Trước hết, ta xét hai đường “cha” có giao nhau không, sau đó xem giao điểm có thuộc cả hai đoạn thẳng không? Nếu các đường “cha’ giao nhau, ta có giá trị to
và uosao cho:
x1(to) = x2(uo) và y1(to) =y2(uo) Từ đây, ta có các phương trình sau:
ax+ (bx- ax) * to = cx+ (dx- cx) * uo
ay+ (by- ay) * to= cy+ (dy- cy) * uo
Khử uo,ta được:
D* to= (cx- ax) * (dy- cy) - (cy- ay) * (dx- cx) với D = (bx- ax) * (dy - cy) - ( by- ay) * (dx- cx) Có hai trường hợp cơ bản, D bằng hay khác 0.
D khác zero (1) (2) (3) (4) (5)
Luận văn tốt nghiệp
Thiết kế hệ thống kiểm tra cácc quan hệ hình họctrang 31 trang 31
Nếu D khác 0, ta tính to từ phương trình (4). Nếu to nằm ngoài đoạn [0, 1] thì không có giao điểm giữa hai đoạn. Ngược lại, thì có thể có giao điểm, thay to vào (3) để tính uo. Nếu uonằm trong đoạn [0, 1] thì chắc chắn có giao điểm, và dùng phương trình (1) và (2) để tính.
D bằng zero
Nếu D bằng 0, từ phương trình (5) suy ra:
(dy- cy) / (dx- cx) = (by - ay) / (bx- ax)
Nghĩa là các hệ số góc bằng nhau, nên các đường cha song song. Nếu các đường cha trùng nhau thì các đoạn cũng có thể trùng nhau. Để kiểm điều này, ta xem c có nằm trên đường cha đi qua a và b không. Dựa vào phương trình của đường cha là:
(bx- ax) * (y - ay) - (by - ay) * (x - ax) = 0
thay cxcho x và cy cho y và xem vế trái có đủ gần 0 không (nghĩa là: nhỏ hơn lượng nào đó, như 10- 5). Nếu không, các đường cha không trùng nhau, và không có
giao điểm. Nếu thỏa mãn thì phải thực hiện bước kiểm cuối cùng để xem các đoạn có trùng nhau không.
Từ phương trình (1) tìm hai giá trị tc và td mà đường đạt tới vị trí c và d. Vì các đường cha trùng nhau, ta chỉ cần dùng thành phần x (nếu đường 1 thẳng đứng, thì dùng thành phần y), và thay cxvà dx, ta có :
tc= (cx - ax) / (bx- ax) td= (dx- ax) / (bx- ax)
Đường 1 bắt đầu tại 0 và kết thúc tại 1, và xét thứ tự của bốn giá trị 0, 1, tcvà td, ta xác định được vị trí tương đối của hai đường. Sẽ chồng nhau trừ khi cả hai tcvà td nhỏ hơn 0 hay lớn hơn 1. Nếu có trùng nhau, ta dễ dàng xác định các điểm đầu trùng nhau từ tcvà td.
Giải thuật được xây dựng trong thủ tục Intersect (), gồm các tham số là bốn điểm đầu của các đường, giá trị trả về có thể có thể có các giá trị sau:
1: có một giao điểm.
(6)
(7)
Luận văn tốt nghiệp
Thiết kế hệ thống kiểm tra cácc quan hệ hình họctrang 32 trang 32
2: không giao nhau.
3: các đoạn thẳng song song nhau. 4: hai đoạn thẳng chồng nhau.
5: hai đoạn thẳng cùng nằm trên 1 đường thẳng, không cắt nhau.
Giải thuật:
-Tính Mẫu số D; -Nếu D < > 0
. Tính to,uo;
. Nếu to thuộc [0,1] và uo thuộc [0,1] + Tính giao điểm M
+ Return 1; ( 2 đoạn thẳng cắt nhau tại M) Ngược lại Return 2; (2 doạn thẳng không cắt nhau) - Ngược lại,
. Nếu c nằm trên đoạn ab + Tính tc, td;
+ Nếu không phải cả tc và td < 0 hoặc cả tc, td >1 Return 4; (2 doạn thẳng chồng nhau) + Ngược lại,
Return 5; (2đoạn thẳng nằm trên 1 đường thẳng và không cắt nhau)
. Ngược lại, Return 3; (2 đoạn thẳng song song )