1 Đường thẳng ngang giao với điểm đầu đường thẳng dọc Đường thẳng dọc giao với điểm đầu đường thẳng ngang
2 Đường thẳng ngang giao với đầu đường thẳng dọc Đường thẳng dọc giao với đoạn giữa đường thẳng ngang
3 Đường thẳng ngang giao với đầu đường thẳng dọc Đường thẳng dọc giao với cuối đường thẳng ngang
4 Đường thẳng ngang giao với đoạn giữa đường thẳng dọc Đường thẳng dọc giao với đầu đường thẳng ngang
5 Đường thẳng ngang giao với đoạn giữa đường thẳng dọc Đường thẳng dọc giao với đoạn giữa đường thẳng ngang
6 Đường thẳng ngang giao với đoạn giữa đường thẳng dọc Đường thẳng dọc giao với điểm cuối đường thẳng ngang
7 Đường thẳng ngang giao với điểm cuối đường thẳng dọc Đường thẳng dọc giao với đầu đường thẳng ngang
8 Đường thẳng ngang giao với điểm cuối đường thẳng dọc Đường thẳng dọc giao với đoạn giữa đường thẳng ngang
9 Đường thẳng ngang giao với điểm cuối đường thẳng dọc Đường thẳng dọc giao với điểm cuối đường thẳng ngang
0 Đường thẳng ngang và dọc không có điểm giao nhau
Kết quả của quá trình trích xuất đường thẳng không phải là đường thẳng lí tưởng mà là một hình chữ nhật. Từ định nghĩa các kiểu giao nhau, ta thấy các đường thẳng ngang và dọc được chia làm ba phần: đoạn đầu (beginning), đoạn giữa
(middle) và đoạn cuối (end) như hình 3.4. Trong đó tolerance được định nghĩa bằng độ dầy (chiều cao) của đường thẳng ngang.
Để xác định từng kiểu giao nhau, chúng ta sử dụng hai tập hợp công thức: tập (A) và tập (B). Trong đó tập (A) chứa các công thức định vị vị trí những phần đường thẳng ngang bị cắt bởi các đường thẳng dọc; và tập (B) chứa các công thức định vị vị trí những phần đường thẳng dọc bị cắt bởi các đường thẳng ngang. Chi tiết hai tập A, B được mô tả như sau (HL: đường thẳng ngang, VL: đường thẳng dọc):
Tập (A):
Beginning:
(HL.begin.x − HL.width) ≤ (VL.begin.x + VL.end.x) / 2 &&
(VL.begin.x + VL.end.x) / 2 ≤ (HL.begin.x + HL.width) (3-1.a)
Middle:
(HL.begin.x + HL.width) < (VL.begin.x + VL.end.x) / 2 &&
(VL.begin.x + VL.end.x) / 2 < (HL.end.x − HL.width) (3-1.b)
End:
(HL.end.x − HL.width) ≤ (VL.begin.x + VL.end.x) / 2 &&
(VL.begin.x + VL.end.x) / 2 ≤ (HL.end.x + HL.width) (3-1.c)
Ngược lại:
(HL.begin.x − HL.width) > (VL.begin.x + VL.end.x) / 2 ||
(VL.begin.x + VL.end.x) / 2 > (HL.end.x + HL.width) (3-1.d)
Tập (B):
Beginning:
(VL.begin.y − VL.width) ≤ (HL.begin.y + HL.end.y) / 2 &&
(HL.begin.y + HL.end.y) / 2 ≤ (VL.begin.y + VL.width) (3-2.a)
Middle:
(VL.begin.y + VL.width) < (HL.begin.y + HL.end.y) / 2 &&
(HL.begin.y + HL.end.y) / 2 < (VL.end.y − VL.width) (3-2.b)
End:
(VL.end.y − VL.width) ≤ (HL.begin.y + HL.end.y) / 2 &&
(HL.begin.y + HL.end.y) / 2 ≤ (VL.end.y + VL.width) (3-2.c)
Ngược lại:
(VL.begin.y − HL.width) > (HL.begin.y + HL.end.y) / 2 ||
(HL.begin.y + HL.end.y) / 2 > (VL.end.y + VL.width) (3-2.d)
Vị trí từng kiểu giao nhau giữa hai đường thẳng được xác định bởi bảng sau:
Bảng 3.2: Công thức xác định từng loại giao điểm.