Xác định hai đoạn thẳng có cắt nhau không ª Bài toán Cho hai đoạn thẳng p1p2 và p3p4.. Hỏi: Hai đoạn thẳng có cắt nhau không?. Hai cách giải quyết để tìm tọa độ của điểm cắt nếu có.. C
Trang 1HÌNH HỌC TÍNH TOÁN
Trang 2Tính chất của đoạn thẳng
ª Định nghĩa
= (x1,y1) và p2 = (x2 ,y2) là một điểm p3 =
(x3 ,y3) sao cho
x3 = α x1 + (1 − α ) x2
y3 = α y1 + (1 − α ) y2
0 ≤ α ≤ 1 .
của p1 và p2 , ký hiệu đt p1p2
là p1 và p2
– Đoạn thẳng có hướng p1p2 là đoạn thẳng
p1p2 được định hướng từ p1 đến p2 , ký
hiệu p1→p2 .
Trang 3Tích chéo
ª Định nghĩa Tích chéo của hai vectors p1 = (x1,y1) và p2
= (x2 ,y2) là
ª Nhận xét
– Nếu p 1 × p 2 > 0 thì vectơ p 1 nằm theo chiều kim đồng hồ từ vectơ p 2 đối với (0, 0)
– Nếu p 1 × p 2 < 0 thì vectơ p 1 nằm ngược chiều kim đồng hồ từ vectơ p 2 đối với (0, 0)
– Nếu p 1 × p 2 = 0 thì O, p 1 và p 2 thẳng hàng.
p1
p2
(0,0)
p1
p2
(0,0)
1 2 2
1
2 1
2
1 2
y x y
x
y y
x
x p
p
−
=
=
×
Trang 4
Tích chéo (tiếp)
x
y
p1
p2
(0,0)
p
x
y
(0,0)
vectơ nằm ngược chiều
kim đồng hồ từ p
vectơ nằm theo chiều
kim đồng hồ từ p
p1 × p2 là diện tích của hình bình hành
Trang 5Tích chéo (tiếp)
ª Nhận xét
Cho hai đoạn thẳng có hướng p0 →p1 và p0 →p2 Dùng
– Nếu (p1 − p0) × (p2 − p0) > 0 thì p0→p1 nằm theo chiều kim đồng hồ từ p0→p2
– Nếu (p1 − p0) × (p2 − p0) < 0 thì p0→p1 nằm
ngược chiều kim đồng hồ từ p0→p2 .
p0
p1
p2
p0
p1
p2
ngược chiều
kim đồng hồ
theo chiều kim đồng hồ
Trang 6Xác định hai đoạn thẳng có cắt nhau
không
ª Bài toán
Cho hai đoạn thẳng p1p2 và p3p4 Hỏi: Hai đoạn
thẳng có cắt nhau không?
Hai cách giải quyết
để tìm tọa độ của điểm cắt (nếu có) Cách
giải này cần dùng phép chia nên không chính xác khi tử số gần bằng 0.
tới).
Trang 7Xác định hai đoạn thẳng có cắt nhau
không (tiếp)
bên (“straddle”) một đường thẳng nếu p1
và p2 nằm ở hai bên khác nhau của
đường thẳng (Trường hợp biên: p1 hay p2
nằm trên đường thẳng.) p2
p1
p2
p1
đt p1p2 nằm hai bên
đường thẳng L
đt p1p2 không nằm hai bên
đường thẳng L
p2
p1
L
Trang 8Xác định hai đoạn thẳng có cắt nhau
không (tiếp)
– Định lý: Hai đoạn thẳng cắt nhau nếu và
chỉ nếu một trong các điều kiện sau
(hoặc cả hai) là đúng.
chứa đoạn thẳng kia.
thẳng này nằm trên đoạn thẳng kia
a
b Đoạn thẳng a nằm hai
bên đường thẳng chứa b, và đoạn thẳng b nằm hai bên đường thẳng chứa a
Trang 9Xác định hai đoạn thẳng có cắt nhau
không (tiếp)
p2
p1
p3
p4
(p4 − p1) × (p2 − p1) > 0
(p3 − p1) × (p2 − p1) < 0
p4
p1
p3
p2
(p4 − p1) × (p2 − p1) < 0
(p3 − p1) × (p2 − p1) < 0
Các tích chéo (p3 − p1) ×
(p2 − p1) và (p4 − p1) × (p2 −
p1) có dấu khác nhau,
do đó đt p3 p4 nằmhai bên đường thẳng chứa
đt p1 p2 (và ngược lại)
Các tích chéo (p3 − p1) ×
(p2 − p1) và (p4 − p1) × (p2 −
p1) có cùng dấu, do đó
đt p3 p4 khôngnằmhai bên đường thẳng chứa
đt p1 p2 (và ngược lại) Dùng tích chéo để xác định một đoạn thẳng có nằm hai bên một đường thẳng hay không
Trang 10Xác định hai đoạn thẳng có cắt nhau
không (tiếp)
p1
p3
p4
p2
(p4 − p1) × (p2 − p1) = 0
(p3 − p1) × (p2 − p1) < 0
(p4 − p1) × (p2 − p1) = 0
(p3 − p1) × (p2 − p1) = 0
p1
p3 p2
p4
p1
p2
p3
p4
Trang 11Xác định hai đoạn thẳng có cắt nhau
không (tiếp)
và p3p4 có cắt nhau không (mã giả) Thủ tục trả về TRUE nếu hai đoạn thẳng cắt
nhau và trả về FALSE nếu chúng không
cắt nhau.
SEGMENTS-INTERSECT(p1, p2, p3, p4)
1 d1 ← DIRECTION(p3, p4,p1)
2 d2 ← DIRECTION(p3, p4,p2)
3 d3 ← DIRECTION(p1, p2, p3)
4 d4 ← DIRECTION(p1, p2, p4)
5 if ((d1 > 0 and d2 < 0) or (d1 < 0 and d2 > 0)) and
((d3 > 0 and d4 < 0) or (d3 < 0 and d4 > 0))
6 then return TRUE
(xem tiếp slide tới)
Trang 12Xác định hai đoạn thẳng có cắt nhau
không (tiếp)
(tiếp)
7 elseif d1 = 0 and ON-SEGMENT(p3, p4,p1)
8 then return TRUE
9 elseif d2 = 0 and ON-SEGMENT(p3, p4,p2)
10 then return TRUE
11 elseif d3 = 0 and ON-SEGMENT(p1, p2, p3)
12 then return TRUE
13 elseif d4 = 0 and ON-SEGMENT(p1, p2, p4)
14 then return TRUE
Trang 13Xác định hai đoạn thẳng có cắt nhau
không (tiếp)
đoạn pi pj
FALSE nếu pk nằm ngoài đoạn pi pj
DIRECTION(p i , p j , p k )
1 return (p k − p i ) × (p j − p i )
ON-SEGMENT(p i , p j , p k )
1 if min(x i , x j ) ≤ x k ≤ max(x i , x j ) and min(y i , y j ) ≤ y k
≤ max(y i , y j )