II I CÁC THUẬT TỐN TEST QUAN HỆ HÌNH HỌC
3- Xác định giao điểm hai đoạn thẳng
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, hai đoạn thẳng cĩ thể bố trí theo nhiều cách. Hai đường khơng song song luơn cắt nhau, nhưng hai đoạn thẳng khơng song song cũng cĩ thể khơng cắt nhau.
b d b
d a
c c b d d b c a a c Cơ sở tốn học:
Các phương trình tham số cho mỗi đường như sau: x1 (t) = ax + (bx – ax) * t
y1 (t) = ay + (by – ay) * t (1) và
x2 (u) = cx + (dx – cx) * u
y2 (u) = cy + (dy – cy) * u (2)
Xét đường “cha” của mỗi đoạn đường, đây là đường vơ hạn. Phương pháp là, trước hết xét hai đường “cha” cĩ giao nhau khơng, sau đĩ xem giao điểm cĩ thuộc cả hai đoạn đường khơng. Nếu các đường “cha’ giao nhau, ta cĩ giá trị to và uo sao cho x1 (to) = x2(uo) và y1(to) =y2(uo). Từ đây cĩ các phương trình sau:
ax + (bx – ax) * to = cx + (dx – cx ) * uo ay + (by – ay) * to = cy + (dy – cy ) * uo (3) Khử uo ta được: D* to = (cx – ax) * (dy – cy ) – (cy – ay) * (dx – cx) (4) Với D = (bx – ax) * (dy – cy) – ( by – ay) * (dx – cx) (5) Cĩ hai trường hợp cơ bản, D bằng hay khác 0.
Nếu D khác 0, ta tính to từ phương trình (4). Nếu to nằm ngồ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 uo nằ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) (6)
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 này là:
(bx – ax) * (y – ay) – (by – ay) * (x – ax) = 0 (7)
thay cx cho x và cy cho y và xem vế trái cĩ đủ gần 0 khơng (i.e 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 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 cx và dx, ta cĩ :
tc = (cx – ax) / (bx – ax)
td = (dx – ax) / (bx – ax) (8)
Đườ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, tc và td, ta xác định được vị trí tương đối của hai đường. Sẽ chồng nhau trừ khi cả hai tc và 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ừ tc và td.
Giải thuật được cho 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ĩ giá trị sau:
• 1: cĩ một giao điểm.
• 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) Bằng khơng 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 0 + 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) Bằng khơng Return 3; (2 đoạn thẳng song song )
4-Vẽ Polygon
Polygone là tập hợp các đoạn thẳng liên tiếp cùng nằm trong mặt phẳng khép kín.
Giải thuật:
- Xuất phát từ đỉnh đầu tiên
- Vẽ nối đến đỉnh kế tiếp theo thứ tự cùng chiều kim đồng hồ. - Vẽ nối từ đỉnh cuối cùng đến đỉnh đầu tiên.