Có một số cách để hoàn thành những gì bạn thấy, tùy thuộc vào cách bạn muốn ứng xử đó hoạt động. Tôi sẽ giải thích một số phương pháp đơn giản để sửa đổi đường cong Bezier thông qua điểm trên thao tác đường cong.
Điều đầu tiên cần làm là tìm ra giá trị tham số (t) trong đó người dùng nhấp vào đường cong. Điều này nói chung sẽ là một xấp xỉ. Nếu bạn đang thực hiện hiển thị pixel hoặc pixel phụ của Bezier, thì chỉ cần ghi lại cho mỗi pixel giá trị t và sử dụng điều đó. Nếu bạn đang phân tích thành các phân đoạn đường, hãy xem phân đoạn đường nào gần nhất, tìm giá trị t của hai điểm cuối và lerp giá trị t theo khoảng cách dọc theo đường.
Khi bạn có giá trị t, bạn có thể cắm nó vào phương trình đường cong Bezier. Bạn sẽ kết thúc với một cái gì đó có dạng:
P = k0*P0 + k1*P1 + k2*P2 + k3*P3
trong đó P là điểm trên đường cong, P0, P1, P2, P3 và là những điểm kiểm soát đầu vào, và k0, k1, k2, k3 và là hằng số cho một t đã cho. Tôi sẽ gọi các đóng góp của các giá trị k ', hoặc cụ thể hơn là sự đóng góp của các điểm kiểm soát tới điểm trên đường cong P (t). Một thuộc tính tốt đẹp cần nhớ là k0 + k1 + k2 + k3 = 1.
Vì vậy, giả sử bạn có vectơ V = P '- P, trong đó P' là vị trí mới và P là vị trí ban đầu. Chúng ta cần phải di chuyển một số điểm kiểm soát để có được P 'nơi nó cần phải đi, nhưng chúng ta có một số linh hoạt về những điểm kiểm soát mà chúng ta muốn di chuyển. Bất kỳ điểm nào có đóng góp khác 0 đều có thể được sử dụng hoặc kết hợp một số.
Giả sử người dùng nhấp vào đường cong tại t = 0. Trong trường hợp này, chỉ k0 là khác 0, do đó,
P0 := P0 + V
sẽ cho kết quả chính xác. Điều này cũng có thể được viết như
P0 := P0 + k0 * V
Trong trường hợp chung, nơi tất cả các đóng góp là khác không, bạn có thể áp dụng việc chuyển đổi tương tự cho mỗi điểm, mà sẽ có tác dụng rất trơn tru, lan-out biến dạng.
Một tùy chọn khác là chỉ cần di chuyển điểm điều khiển với mức đóng góp tối đa toàn bộ khoảng cách. Tôi nghĩ rằng phương trình để sử dụng sẽ là một cái gì đó giống như
Pmax := Pmax + 1/kmax * V
nhưng một trong hai cách thức mà nó nắm để nhìn vào những đóng góp tại một giá trị t nhất định, và di chuyển các điểm điều khiển để các điểm mới nằm ở vị trí mong muốn.
Cách tiếp cận này khá chung chung, và hoạt động cho NURBS và hầu hết các splines khác, thậm chí là bề mặt. Có một phương pháp khá phổ biến mà sử dụng Greville Abscissae, mà ghim càng nhiều điểm càng tốt, nhưng theo kinh nghiệm của tôi quá dễ dàng để có được dao động.
Tôi nên đề cập rằng với beziers gần nhất bạn có thể nhận được để phù hợp với các điểm kiểm soát là tạo ra một chuỗi các đường cong 3 điểm. điểm cuối của mỗi đường cong được thiết lập bằng điểm bắt đầu của đường cong tiếp theo. Sau đó, hai điểm giữa hai bên của hai điểm nối của đường cong nên được đặt thành gương xung quanh điểm nối, buộc phải nối liền giữa chúng. Các đường cong vẫn sẽ không bao giờ đi qua các midpoints, tuy nhiên. –