2010-11-10 35 views
18

Tôi đang cố tạo đường cong bezier "song song". Trong nỗ lực của tôi, tôi đã nhận được gần nhưng không có xì gà. Tôi đang cố gắng giữ một khoảng trống 1px rắn giữa 2 đường cong (đỏ, xanh dương).Làm thế nào để bù đắp một đường cong bezier khối?

current attempt

Mục tiêu chính của tôi là sử dụng một lợi thế cạnh offseting algorythm để mở rộng/thu nhỏ một con đường svg.


Giải pháp

Đối với bất kỳ ai khác đang tìm kiếm một giải pháp, tôi đã tạo ra một phiên bản AS3.

http://seant23.wordpress.com/2010/11/12/offset-bezier-curves/

+0

phỏng đoán thuần túy, không bao giờ tự làm điều này, nhưng bạn có thể sao chép đường cong sau khi nó được hiển thị dưới dạng "hình ảnh" hay không và chỉ vẽ lại màu mới ở độ lệch ưa thích? – warren

+0

@warren Nó sẽ không giữ 1px bù đắp –

+0

nếu bạn vẽ một đường cong từ, nói, '0,0 đến 2,2 đến 0,2', sau đó sao chép đường cong vào một hình ảnh và vẽ lại tập trung vào' 4,4 '(thay vì' 2,2'), điều đó sẽ không bù đắp 1px? – warren

Trả lời

9

Từ wikipedia: (http://en.wikipedia.org/wiki/B%C3%A9zier_curve)

Đường cong tại một cố định bù đắp từ một đường cong Bézier nhất định, thường được gọi là một đường cong bù đắp (nằm "song song" với đường cong ban đầu, giống như bù đắp giữa đường ray trong một đường ray), không thể được chính xác hình thành bởi một đường cong Bézier (ngoại trừ trong một số trường hợp tầm thường). Tuy nhiên, có những phương pháp heuristic thường cung cấp một xấp xỉ đầy đủ cho các mục đích thực tế.

Bạn cũng có thể xem giấy nêu ở đây: Outline of cubic bezier curve stroke

6

Nó không thể nói chung để đại diện cho bù đắp của một đường cong Bezier khối như một đường cong Bezier khối (đặc biệt, đây là vấn đề khi bạn có chỏm hoặc bán kính độ cong gần với khoảng cách offset). Tuy nhiên, bạn có thể ước tính mức bù cho bất kỳ mức độ chính xác nào.

Hãy thử điều này:

  • offset các Beziers trong câu hỏi (những gì bạn đã có vẻ khá phong nha)
  • Đo sự khác biệt giữa mỗi đường cong ban đầu và tương ứng với đường cong bù đắp. Tôi muốn thử một cái gì đó giống như 10 mẫu và xem nếu nó hoạt động tốt.
  • Đối với bất kỳ khoản chênh lệch nào nằm ngoài dung sai, hãy chia nhỏ (sử dụng thuật toán deCastlejau cho Beziers) và lặp lại.

Tôi chưa thực hiện bù đắp (vì hạt nhân tôi sử dụng đã có), nhưng điều này có vẻ như một cái gì đó để thử.

3

Tôi hy vọng bạn tìm thấy giấy toán học của tôi có ích enter image description here

Bezier bậc bù với phân có chọn lọc http://microbians.com/?page=math

+0

Bạn cũng có một đường cong khối, hoặc tổng quát bậc cao hơn, hay giải pháp của bạn chỉ hoạt động cho các đường cong bậc hai? (nếu có, đó là viết lên có sẵn? =) –

+0

Xin lỗi tôi không có nó cho khối ... nhưng tôi nhận ra rằng bạn có thể sử dụng một phép tính hai bậc hai của một khối và sau đó bù đắp mỗi, như tangents sẽ không thay đổi ở mức cực đại của mỗi lần bù. – microbians

4

gì bạn yêu cầu được gọi là một parallel or offset curve trong toán học. Bài viết Wikipedia (được trích dẫn ở trên bởi những người khác) trên các đường cong Bezier không liên kết được với bài viết phù hợp cho "đường cong bù đắp", nhưng tôi đã cố định một vài giây trước đây. Trong thế giới đồ họa véc tơ, cùng khái niệm đó được gọi là vuốt ve đường dẫn.

Nói chung, đối với đường cong khối/Bezier đường cong bù là đa thức bậc 10!Nguồn: Kilgard, p. 28

Nếu tất cả những gì bạn muốn làm là rasterize đường cong bù đắp như vậy, thay vì tính toán biểu mẫu phân tích của họ, bạn có thể xem ví dụ về nguồn ghostscript. Bạn cũng có thể xem this patent application để xem cách NV_path_rendering thực hiện điều đó.

Nếu bạn muốn covert/gần đúng đường cong bù đắp, sau đó giấy TUG trên MetaFog để bao phủ METAFONT với phông chữ PostScript là một đọc tốt. Hệ thống METAFONT, mà trước đó PostScript cho phép các phông chữ được mô tả bằng thao tác vuốt (phức tạp hơn), nhưng các phông chữ PostScript Type 1 chỉ cho phép điền được sử dụng (không giống như các bản vẽ PostScript nói chung) vì lý do tốc độ.

Một thuật toán khác để ước tính khoảng cách dưới dạng (chỉ hai) Beziers (một ở mỗi bên), với mã trong PostScript, được đưa ra trong phần 7 của this paper by Gernot Hoffmann. (Mẹo dành cho ai đó trên diễn đàn OpenGL để tìm kiếm nó.)

Thực tế, có rất nhiều thuật toán như vậy. Tôi đã tìm thấy 1997 survey các thuật toán khác nhau để ước lượng đường cong bù đắp. Họ cho rằng các đường cong tiền thân là Beziers hoặc NURBS.

Các vấn đề liên quan