2010-02-23 19 views
6

Bạn sẽ hiểu ý tôi là gì nếu bạn sử dụng các chương trình chỉnh sửa đồ họa như Gimp hoặc Photoshop. Để chỉnh sửa đường cong trên các chương trình đó (có thể là Bezier Curve), chúng ta có thể nhấp vào đường cong, kéo chuột và đường cong được thay đổi tương ứng. Tôi nghi ngờ tất cả những thứ đằng sau cơ chế này liên quan đến vectơ, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào đề cập đến cách thực hiện nó. Ai có thể cho tôi biết làm thế nào tôi có thể làm điều đó? Cảm ơn nhiều.Kéo một đường cong bezier để chỉnh sửa nó

[sửa] Ý tôi là chọn chính đường cong để thay đổi (chỉnh sửa) (nhấp vào đường cong và kéo đường cong để chỉnh sửa). Theo cách thông thường, chúng ta chọn các điểm điều khiển để thay đổi đường cong. Tôi biết thay đổi đường cong, tôi cần chỉnh sửa các điểm kiểm soát, nhưng làm cách nào để diễn giải sự thay đổi trên đường cong thành thay đổi thành thay đổi đối với các điểm kiểm soát?

Trả lời

0

Kéo chỉ đơn giản là thay đổi các điểm kiểm soát của đường cong Bezier và đường cong được tính toán lại tương ứng. Xem Wikipedia để có giải thích tốt về cách chúng hoạt động.

0

Hãy làm rõ những gì bạn muốn làm? Bạn có muốn chỉnh sửa đường cong bezier trong một ứng dụng? Bạn có quan tâm đến toán học tổng quát đằng sau nó?

Thông thường bạn thao tác các điểm điều khiển được sử dụng để tạo đường cong bezier.

1

EDIT - Trả lời câu hỏi chỉnh sửa của bạn

Để có thể chọn các đường cong tự để di chuyển các điểm kiểm soát, tôi xin đề nghị rằng các đường cong Bezier là chắc chắn không phải là con đường phía trước - bạn sẽ phải để giải phương trình ngược lại để tìm đúng vị trí điểm kiểm soát. Bạn cũng sẽ thấy rằng trong một số trường hợp nó thực sự không thể di chuyển các điểm kiểm soát để làm cho đường cong đi nơi bạn muốn.

Nếu bạn đang sử dụng B-Splines, bạn có thể chỉ cần chèn điểm kiểm soát mới tại điểm trên đường cong gần nhất với nơi người dùng đã nhấp và sau đó di chuyển điểm điều khiển mới. Vì vậy, hiệu quả, bạn muốn thêm một điểm kiểm soát mới.

Văn bản gốc

Giả sử bạn đã có một thực hiện của một đường cong Bezier đó, đưa ra một tập hợp các điểm kiểm soát (thường là ba cho Bezier nhưng có thể như nhiều như bạn muốn) có thể tạo ra một tập hợp các điểm được kết hợp với các dòng trên thiết bị hiển thị (thông thường bạn sử dụng phương trình tham số 0 >= u <= 1), thì điều này rất dễ dàng.

Điểm kiểm soát của bạn xác định nơi đường cong đi, vì vậy bạn chỉ cần thực hiện phản hồi lựa chọn và kéo/thả trên các điểm kiểm soát đó.

Nếu bạn đang tìm kiếm kết hợp điểm chính xác, tuy nhiên, đường cong bezier không lý tưởng vì chúng chỉ đi qua điểm kiểm soát đầu tiên và cuối cùng. Và càng có nhiều điểm bạn thêm vào đường cong, chúng càng trở nên kém chính xác.

B-Splines sẽ tốt hơn và các biến thể trong số này là những gì bạn thực sự thấy trong photoshop et al.

+0

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. –

0

OK, vì vậy hãy giả sử rằng bạn phải sử dụng đường cong Bezier vì bạn đang sử dụng thư viện hiển thị có chúng dưới dạng nguyên thủy.Nếu bạn hoàn toàn kết hôn với ý tưởng sử dụng các điểm kiểm soát trên đường cong, bạn có thể chỉ nội suy các điểm kiểm soát bằng cách sử dụng phương pháp được nêu tại đây: How to find control points for a BezierSegment given Start, End, and 2 Intersection Pts in C# - AKA Cubic Bezier 4-point Interpolation

Nói cách khác, cho mỗi bộ 4 điểm trên đường cong, bạn sẽ chạy thuật toán trên và nhận được 4 điểm kiểm soát cần thiết để vẽ Bezier khối.

3

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.

0

Xem github.com/bootchk/freehandTool cho mô hình đối tượng

Người dùng kéo. Dự án kéo vào điểm điều khiển hoặc cánh tay gần nhất giữa các điểm điều khiển. Giải thích việc kéo như xoay và dịch (biến đổi) của các điểm kiểm soát gần nhất cho biết.Lưu ý số nhiều: gần nhất có thể là các điểm điều khiển trùng hợp (kết thúc) của hai đoạn, hoặc các điểm điều khiển cánh tay của phân đoạn bezier.