2012-02-28 37 views
9

Nhìn vào Convert a quadratic bezier to a cubic?, cuối cùng tôi có thể hiểu tại sao giáo viên lập trình luôn nói với tôi rằng toán học là rất quan trọng. Đáng buồn thay, tôi không nghe.Chuyển đổi đường cong bậc hai thành đường cong khối

Bất kỳ ai có thể cung cấp bê tông cụ thể hơn - ví dụ: công thức máy tính-ngôn ngữ-y để chuyển đổi đường cong bậc hai thành hình khối không? Hiểu rằng có một số lỗi làm tròn có thể, điều đó là tốt.

Cho một đường cong quad đại diện bởi các biến:

StartX, StartY 
ControlX, ControlY 
EndX, EndY 

Và mong startx, StartY và EndX, Endy để vẫn như cũ, nhưng đến nay có Control1X, Control1Y và Control2X, Control2Y của một đường cong khối.

Có ...

Control1X = StartX + (.66 * (ControlX - StartX)) 
Control2X = EndX + (.66 * (ControlX - EndX)) 

Với các chức năng cần thiết cùng sử dụng để tính Control1Y và Control2Y?

+0

Xem thêm http://stackoverflow.com/questions/3162645/convert-a-quadratic-bezier-to-a-cubic. – lhf

Trả lời

7

Mã của bạn là đúng, ngoại trừ việc bạn nên sử dụng 2.0/3.0 thay vì 0.66.

0

Bạn tránh các lỗi làm tròn nhất bằng cách sử dụng

Control1 = (Start + 2 * Control)/3 
Control2 = (End + 2 * Control)/3 

Lưu ý rằng đoạn thẳng cũng có thể chuyển đổi thành đường cong Bezier khối sử dụng:

Control1 = Start 
Control2 = End 

Điều này có thể có ích khi chuyển đổi một con đường phức tạp trộn nhiều loại hình các đường cong (tuyến tính, bậc hai, khối)

Ngoài ra còn có một biến đổi cơ bản để chuyển đổi các cung tròn elliptic thành khối (với một số lỗi không đáng kể nhỏ s): bạn chỉ cần chia ít nhất hình cung trên elliptic quadrans (cắt hình elip đầu tiên trên hai trục của các biểu tượng, hoặc trên trục trực giao tùy ý đi qua tâm nếu hình elip là hình tròn, sau đó biểu diễn mỗi cung; khi ellipse là một cricle, hai tiêu điểm bị nhầm lẫn trên cùng một điểm, trung tâm của vòng tròn). Nhiều đối tượng kết xuất SVG làm điều đó bằng cách thêm một phân tách bổ sung trên octants (để bạn cũng có được vị trí chính xác không chỉ cho các điểm mà hai trục chính đi qua, mà còn cho hai trục chéo được bissecting (khi ellipse là một vòng tròn) mỗi góc phần tư (khi hình elip không phải là một hình tròn, đồng hóa nó như một vòng tròn phẳng với một biến đổi tuyến tính dọc theo trục nhỏ chỉ, bạn làm cùng một tính toán), bởi vì octants cũng khá chính xác vị trí (cos (pi/4) = sin (pi/4) = sqrt (2)/2 ~ 0,71, và vì sự chia tách bổ sung này sẽ cho phép hiển thị chính xác tangents trên các điểm vượt qua đường chéo tại 45 độ của vòng tròn): một hình elip đầy đủ sẽ được chuyển thành 8 cung tròn khối (8 điểm trên hình elip và 16 điểm điều khiển): bạn hầu như không nhận thấy sự khác biệt giữa các cung tròn hình elip và cung tròn khối (bạn có thể tạo một thuật toán sử dụng t ông cùng "lỗi phẳng" tính khi chia Bezier thành một danh sách các đoạn tuyến tính, sau đó được rút ra bằng cách sử dụng bản đồ Bresenham nhanh cổ điển cho các đoạn đường thẳng).


như chuyển đổi các đường dẫn tùy ý rất hữu ích khi bạn muốn để lấy được các đường cong khác từ con đường, đặc biệt là đường cong của "bộ đệm" ở một khoảng cách nhất định, đặc biệt là khi các đường dẫn phải được chuyển đổi sang "đột quỵ" với một xác định "chiều rộng đột quỵ": bạn cần tính hai đường cong "bên trong" và "bên ngoài" rồi tập trung vào cách chuyển đổi các miters/buts/hình vuông/góc tròn và sau đó cắt các phần tử dài ở khoảng cách thuận tiện (khớp với " giới hạn miter "yếu tố lần" chiều rộng nét ").

More kết xuất đồ họa tiên tiến cũng sẽ sử dụng miters đại diện bởi vòng tròn tiếp tuyến khi có một góc giữa hai vòng cung thay vì hai đoạn (điều này rất hữu ích cho việc vẽ bản đồ địa lý dễ thương) ...

Chuyển đổi một con đường tùy ý trộn phân đoạn, elliptic và bezier arcs chỉ là khối là một bước cần thiết để tính hình ảnh chính xác mà không có khuyết tật quá mức có thể nhìn thấy khi phóng to. Điều này là cần thiết khi bộ đệm "đột quỵ" của bạn phải có một số hiệu ứng (chẳng hạn như dấu gạch ngang máy tính), và sau đó nâng cao kết quả với các điểm ảnh bán trong suốt hoặc subpixels để làm mịn các nét vẽ (làm mịn dễ dàng để computez chỉ khi mọi thứ đã được làm phẳng thành các đoạn thẳng, và alsos có thể đơn giản hơn để phát triển nếu nó chỉ quản lý các đường dẫn chứa chỉ khối ic beziers: nó có thể dễ dàng được song song nếu cần thiết và tăng tốc bằng phần cứng).

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