Thuật toán của Philip J. Schneider, công bố lần đầu trong cuốn Graphics Gems I (1990), là một giải pháp thích nghi (adaptive) giúp biến một tập hợp các điểm số hóa rời rạc Pi thành một chuỗi các đoạn đường cong Bézier bậc ba mượt mà.
Điểm đặc biệt của thuật toán này là việc đảm bảo tính liên tục hình học G1, cho phép đường cong linh hoạt hơn so với liên tục tham số C1 truyền thống.
1. Cơ sở Toán học: Đường cong Bézier bậc ba
Một đoạn Bézier bậc ba được định nghĩa bởi 4 điểm điều khiển V0,V1,V2,V3. Công thức tổng quát là:
Q(t)=i=0∑3ViBi3(t),t∈[0,1]
Trong đó Bi3(t) là các đa thức Bernstein bậc ba:
B03(t)=(1−t)3
B13(t)=3t(1−t)2
B23(t)=3t2(1−t)
B33(t)=t3
Ứng với một giá trị t cụ thể trong đoạn [0,1] sẽ là một điểm trên đường cong.
2. Tính liên tục: C1 và G1 Continuity
Trong thiết kế đường cong piecewise (nối từ nhiều đoạn), việc làm thế nào để các khớp nối trông "mượt mà" là cực kỳ quan trọng. Schneider nhấn mạnh việc sử dụng G1 thay vì C1.
2.1. Liên tục tham số (C1 - Parametric Continuity)
Một khớp nối giữa hai đoạn đường cong được gọi là C1 nếu đạo hàm bậc nhất của chúng tại điểm nối là hoàn toàn bằng nhau về cả hướng và độ lớn.
Điều kiện:Q1′(1)=Q2′(0).
Ý nghĩa hình học: Nếu bạn coi đường cong là quỹ đạo của một hạt đang di chuyển, C1 yêu cầu hạt đó phải đi qua khớp nối với vận tốc không đổi (không tăng tốc hay giảm tốc đột ngột).
Hạn chế: Trong khớp đường cong (curve fitting), điều này quá cứng nhắc. Nó bắt buộc các điểm điều khiển V1,V2 phải cách điểm mút một khoảng cố định bằng nhau ở cả hai phía.
2.2. Liên tục hình học (G1 - Geometric Continuity)
Một khớp nối là G1 nếu các vector đạo hàm bậc nhất tại điểm nối có cùng hướng nhưng có thể khác nhau về độ lớn.
Điều kiện:Q1′(1)=k⋅Q2′(0) với k>0.
Ý nghĩa hình học: Các vector tiếp tuyến chỉ cần nằm trên cùng một đường thẳng (collinear). Hạt di chuyển có thể tăng hoặc giảm tốc khi đi qua khớp nối, miễn là nó không thay đổi hướng đột ngột.
Lợi ích trong thuật toán Schneider:G1 giải phóng các tham số α1,α2 (độ dài vector tiếp tuyến). Việc cho phép α thay đổi độc lập giúp đường cong có thêm "tự do" để áp sát vào các điểm dữ liệu thực tế mà vẫn đảm bảo vẻ ngoài mượt mà.
3. Các bước chính của thuật toán
Mục tiêu bài toán:
Cho tập điểm P0,P1,…,Pn, mục tiêu là tìm một hoặc một số các đường cong nối liền nhau sao cho các đường cong này khớp (bestfit) với tập điểm đã cho.
Bước 1: Tham số hóa ban đầu (Chord-Length Parameterization)
Để khớp đường cong, ta cần biết mỗi điểm dữ liệu Pi tương ứng với giá trị t nào trên đoạn [0,1]. Vì chưa có đường cong, ta ước tính ti dựa trên khoảng cách giữa các điểm (độ dài dây cung hay ở đây là Chord-Length). Nghĩa là chiều dài từ điểm P0 đến Pi, được tính bằng tổng khoảng cách các đoạn thẳng P0P1,P1P2,…,Pi−1Pi và chuẩn hóa bằng cách chia cho tổng chiều dài các đoạn thẳng. Cụ thể, theo bài báo:
u0=0ui=ui−1+∣Pi−Pi−1∣
Sau đó chuẩn hóa ti=ui/un−1 để t∈[0,1].
Bước 2: Ràng buộc Tiếp tuyến và Alpha
Để đảm bảo tính mượt mà tại các khớp nối, hai điểm điều khiển bên trong (V1,V2) phải nằm trên hướng tiếp tuyến đơn vị t^1 và t^2 tại hai đầu mút (V0,V3):
V1=V0+α1t^1
V2=V3+α2t^2
Bài toán lúc này trở thành: Tìm α1,α2 để cực tiểu hóa sai số bình phương.
Bước 3: Giải Alpha bằng Phương pháp Bình phương tối thiểu (Least Squares)
Ta cần tối thiểu hóa hàm mục tiêu S:
S=i=1∑n∣Pi−Q(ti)∣2
Nghĩa là ở bước này, chúng ta phải tìm α1,α2 để hàm S đạt cực tiểu. Tại điểm cực tiểu, đạo hàm riêng theo α1,α2 phải bằng 0.
∂α1∂S=0,∂α2∂S=0
Đây thực chất có thể hình dung như việc di dời các điểm control points của đường cong trên trục là các vector t1^,t2^ sao cho tổng khoảng cách các điểm Pi đến đường cong là nhỏ nhất.
Để giải được α, trước tiên ta thay thế ràng buộc tiếp tuyến vào phương trình Bézier: V1=V0+α1t^1 V2=V3+α2t^2
Ý nghĩa hình học : (Pi−f(ti)) là vector nối từ "đường cong hằng số" (đường cong khi α=0) đến điểm dữ liệu thực tế. X1,X2 là tổng các hình chiếu của các vector sai số này lên hướng của tiếp tuyến đầu mút, trọng số bởi đa thức Bernstein.
Bước 4: Tinh chỉnh Tham số (Newton-Raphson Iteration)
Sau khi có đường cong tạm thời, các giá trị ti ban đầu (tính theo dây cung) thường không phải là vị trí tối ưu nhất. Ta cần tìm ti mới sao cho điểm Q(ti) là hình chiếu vuông góc của Pi lên đường cong.
Ta giải phương trình vuông góc: f(t)=[Q(t)−Pi]⋅Q′(t)=0. Sử dụng phương pháp Newton-Raphson: