Thuật toán khớp đường cong bằng các đường Bézier

  • Bước 1: Với tập hợp điểm points={(x1,y1),(x2,y2),,(xn,yn)}, sinh ra một đường cong Bezier C với các thông số t1^,t2^,ε lần lượt là tiếp tuyến bên trái, tiếp tuyến bên phải, và độ sai lệch cho phép

  • Bước 2: Tính giá trị error là sai số của đường cong C khi khớp với tập điểm points.

    • Nếu error<ε, ngừng thuật toán, C chính là đường cong cần tìm

    • Nếu không, ta chia tập điểm points thành 2 phần tại điểm có khoảng cách xa nhất so với C, tạm gọi là điểm M(xM,yM) rồi áp dụng gọi đệ quy cho 2 tập điểm mới: [(x1,y1)(xM,yM)] và [(xM,yM)(xn,yn)] để tiếp tục tìm đường cong C1,C2 để khớp với 2 tập điểm mới.

  1. Để tiện cho việc tính toán, ta dùng công thức tính đường cong với tham số t:

    Q(t)=i=0nViBin(t),t[0,1]

  2. Đối với đường cong Bezier bậc 3 với control points P1,P2,P3,P4 thì tiếp tuyến của đường cong tại các điểm đầu mút P1và P4 nằm trên đường thẳng chứa đoạn P1P2và đường thẳng chứa đoạn P3P4. Điều này được thể hiện qua công thức:

    dQdt=Q(t)=ni=0n1(Vi+1Vi)Bin1(t)

    Như vậy, ta có thể biểu diễn P2=α1t1^+P1 và P3=α2t2^+P4 với t1^,t2^ lần lượt các các vector tiếp tuyến tại P1 và P4

  3. Như vậy việc khớp đường cong với một tập điểm thực chất là ta đi kiếm giá trị phù hợp của α1,α2. Chi tiết để tính toán đã được mô tả khá kỹ trong paper từ trang 618 đến trang 620 nên mình không viết lại nữa. Implementation của phần này nằm trong function generateBezier, bạn có thể tham khảo trong phần source code.

  4. Việc còn lại là cần tính khoảng cách từ 1 điểm P đến đường cong C, với phương trình tham số Q(t):

    Mình mượn lại hình vẽ trong bài báo. Như vậy để tính khoảng cách từ P đến Q(t)nghĩa là chúng ta cần tính dist=||PQ(t)||. Như vậy, việc khớp đường cong nghĩa là ta cần cực tiểu hóa khoảng cách của tất cả các điểm trong tập points đến Q(t)i=1n||PiQ(ti)||, với ti là giá trị tham số t tương ứng với điểm Pi. Để đơn giản hóa, ta tìm cực tiểu của tổng bình phương khoảng cách của tất các các điểm trong tập points đến đường cong: S=i=1n[PiQ(ti)]2.

  5. Vậy làm sao tính giá trị tham số ti cho một điểm Pi? Đầu tiên, ta tạm thời xấp xỉ các giá trị ti cho từng điểm Pi, bằng cách đo khoảng khách của một đoạn Pi1Pi trên tổng khoảng cách các đoạn từ P1đến Pn (tham khảo function chordLengthParam). Sau đó ta cố gắng tính ti chính xác hơn theo phương phắp lặp Newton-Ralphson, nhờ vào nhận xét rằng vector khoảng cách từ Pivà tiếp tuyến tại ti là vuông góc, ta có [Q(ti)Pi](Q(ti))=0. Công thức để cạp nhật ti sau mỗi lần lặp tìm nghiệm: titif(t)f(t).

Subscribe to SkyGLab

Scroll to Top