5.1.3.1. í tưởng
Trong thuật toỏn Band Width, ta hỡnh dung cú một dải băng di chuyển từ đầu mỳt đường cong dọc theo đường cong sao cho đường cong nằm trong di băng đú cho đến khi cú điểm thuộc đường cong chạm vào biờn của dải băng, điểm này sẽ được giữ lại. Quỏ trỡnh này được thực hiện với phần cũn lại của đường cong bắt đầu từ điểm vừa tỡm được cho đến khi hết đường cong. Cụ thể như sau:
Hỡnh 5.2. Đơn giản húa đường cong với thuật toỏn Band Width
Bắt đầu bằng việc xỏc định điểm đầu tiờn trờn đường cong và coi đú như là một điểm chốt (P1). Điểm thứ ba (P3) được coi là điểm động. Điểm giữa điểm chốt và điểm động (P2) là điểm trung gian. Ban đầu khoảng cỏch từ điểm trung gian đến đoạn thẳng nối điểm chốt và điểm động được tớnh toỏn và kiếm tra. Nếu khoảng cỏch tớnh được này nhỏ hơn một ngưỡng θ cho trước thỡ điểm trung gian cú thể bỏ đi, tiến trỡnh tiếp tục với điểm chốt là điểm chốt cũ, điểm trung gian là điểm động cũ và điểm động là điểm kế tiếp sau điểm động cũ. Trong trường hợp ngược lại, khoảng cỏch tớnh được lớn hơn ngưỡng θ cho trước thỡ điểm trung gian sẽ được giữ lại, tiến trỡnh tiếp tục với điểm chốt là điển trung gian, điểm trung gian là điểm động cũ và điểm động là điểm kế tiếp sau điểm động cũ. Tiến trỡnh được lặp cho đến hết đường cong (Hỡnh 5.2 minh họa thuật toỏn Band-Width).
Thuật toỏn Band-Width:
• Bước 1: Xỏc định điểm đầu tiờn trờn đường cong và coi đú như là một điểm chốt (P1). Điểm thứ ba (P3) được coi là điểm động. Điểm giữa điểm chốt và điểm động (P2) là điểm trung gian.
• Bước 2: Tớnh khoảng cỏch từ điểm trung gian đến đoạn thẳng nối hai điểm chốt và điểm động.
• Bước 3: Kiểm tra khoảng cỏch tỡm được nếu nhỏ hơn một ngưỡng θ cho trước thỡ điểm trung gian cú thể bỏ đi. Trong trường hợp ngược lại điểm chốt chuyển đến điểm trung gian.
• Bước 4: Chu trỡnh được lặp lại thỡ điểm trung gian được chuyển đến điểm động và điểm kế tiếp sau điểm động được chỉ định làm điểm động mới..
Nhận xột: Thuật toỏn này tăng tốc độ trong trường hợp đường ống chứa nhiều điểm, điều đú cú nghĩa là độ lệch giữa cỏc điểm trong đường thẳng là nhỏ, hay độ dày nột của đường được vộctơ hoỏ là mảnh.
di P 3 P2 P4 d k P5 P 1
5.1.3.2. Chương trỡnh
//Hàm tớnh đường cao từ đỉnh đến đoạn thẳng nối hai điểm dau, cuoi float Tinhduongcao(POINT dau, POINT cuoi, POINT dinh)
{
floot h;
tớnh đường cao returm h ;
}
//Hàm đệ quy nhằm đỏnh dấu loại bỏ cỏc điểm trong đường cong void BWSimple(POINT *pLINE, int chot, int tg, BOOL *chiso,
float θ, int n) {
if(Tinhduongcao(pLINE[chot], pLINE[tg+1], pLINE[tg]) ≤ θ) chiso[tg] = 0;
else
chot = tg; tg = tg + 1 if(tg < n - 1)
BWSimple (pLINE, chot, tg, chiso, θ, n) ; }
//Hàm rỳt gọn số lượng điểm BandWidth int BandWidth(POINT *pLINE, int n, floot θ) {
int i, j;
BOOL chiso [MAX_PT]; for (i = 0; i < n; i++)
chiso[i]= TRUE; //Tất cả cỏc điểm được giữ lại BWSimple(pLINE, 0, 1, chiso, θ, n);
for(i= j= 0; i < n; i++) if(chiso [i]== TRUE)
return j; }