2010-01-26 36 views
5

Ai đó ở đâu đó phải giải quyết vấn đề này. Tôi có thể tìm thấy nhiều trang web tuyệt vời giải thích vấn đề này và cách giải quyết nó. Trong khi tôi chắc chắn rằng họ cũng được viết và có ý nghĩa với whizzes toán học, đó không phải là tôi. Và trong khi tôi có thể hiểu theo một cách mơ hồ, tôi không hiểu làm thế nào để biến toán đó thành một hàm mà tôi có thể sử dụng.Chức năng trả về một danh sách các điểm trên đường cong Bezier tại độ lớn bằng nhau

Vì vậy, tôi cầu xin bạn, nếu bạn có một chức năng có thể làm được điều này, bằng bất kỳ ngôn ngữ nào, (chắc chắn ngay cả fortran hoặc heck 6502 assembler) - hãy giúp tôi.

  • thích một phân tích để giải pháp lặp đi lặp lại

EDIT: Có nghĩa là để xác định rằng một Bezier khối Tôi đang cố gắng để làm việc với nó.

Trả lời

3

Điều bạn đang yêu cầu là nghịch đảo của hàm chiều dài hồ quang. Vì vậy, cho một đường cong B, bạn muốn có một hàm Linv (len) trả về một t giữa 0 và 1 sao cho chiều dài hồ quang của đường cong giữa 0 và t là len.

Nếu bạn có chức năng này, sự cố của bạn thực sự dễ giải quyết. Đặt B (0) là điểm đầu tiên. Để tìm điểm tiếp theo, bạn chỉ cần tính toán B (Linv (w)) trong đó w là "độ dài bằng nhau" mà bạn đề cập đến. Để có được điểm tiếp theo, chỉ cần đánh giá B (Linv (2 * w)) và cứ thế, cho đến khi Linv (n * w) trở nên lớn hơn 1.

Tôi đã phải giải quyết vấn đề này gần đây. Tôi đã đưa ra, hoặc đi qua một vài giải pháp, không ai trong số đó là thỏa đáng với tôi (nhưng có lẽ họ sẽ được cho bạn).

Bây giờ, điều này hơi phức tạp, vì vậy hãy để tôi chỉ cung cấp cho bạn liên kết tới mã nguồn trước: http://icedtea.classpath.org/~dlila/webrevs/perfWebrev/webrev/raw_files/new/src/share/classes/sun/java2d/pisces/Dasher.java. Những gì bạn muốn là trong lớp LengthIterator. Bạn không cần phải xem bất kỳ phần nào khác của tệp. Có một loạt các phương thức được định nghĩa trong một tệp khác. Để có được họ chỉ cần cắt ra tất cả mọi thứ từ/raw_files/đến cuối URL. Đây là cách bạn sử dụng nó. Khởi tạo đối tượng trên một đường cong. Sau đó, để lấy tham số của một điểm có độ dài vòng cung L từ đầu đường cong, chỉ cần gọi tiếp theo (L) (để có được điểm thực tế chỉ cần đánh giá đường cong của bạn tại tham số này, sử dụng thuật toán deCasteljau, hoặc gợi ý của zneak). Mỗi lần gọi tiếp theo của (x) tiếp theo sẽ di chuyển bạn một khoảng cách x dọc theo đường cong so với vị trí cuối cùng của bạn. tiếp theo trả về một số âm khi bạn hết đường cong.

Giải thích mã: vì vậy, tôi cần giá trị t sao cho B (0) đến B (t) có độ dài LEN (trong đó LEN được biết). Tôi chỉ đơn giản là san phẳng đường cong. Vì vậy, chỉ chia nhỏ đường cong đệ quy cho đến khi mỗi đường cong đủ gần với một đường thẳng (bạn có thể kiểm tra điều này bằng cách so sánh độ dài của đa giác điều khiển với độ dài của đường nối các điểm kết thúc). Bạn có thể tính chiều dài của đường cong phụ này là (controlPolyLength + endPointsSegmentLen)/2. Thêm tất cả các độ dài này vào bộ tích lũy, và dừng đệ quy khi giá trị bộ cộng dồn là> = LEN. Bây giờ, hãy gọi subcurve C cuối cùng và để [t0, t1] là miền của nó. Bạn biết rằng t bạn muốn là t0 < = t < t1 và bạn biết chiều dài từ B (0) đến B (t0) - gọi giá trị này là L0t0. Vì vậy, bây giờ bạn cần phải tìm một t sao cho C (0) đến C (t) có độ dài LEN-L0t0. Đây chính xác là vấn đề chúng tôi bắt đầu, nhưng trên quy mô nhỏ hơn. Chúng ta có thể sử dụng đệ quy, nhưng điều đó sẽ chậm khủng khiếp, vì vậy thay vào đó chúng ta chỉ sử dụng thực tế rằng C là một đường cong rất phẳng. Chúng ta giả sử C là một đường thẳng, và tính điểm tại t bằng cách sử dụng P = C (0) + ((LEN-L0t0)/chiều dài (C)) * (C (1) -C (0)). Điểm này không thực sự nằm trên đường cong vì nó nằm trên đường C (0) -> C (1), nhưng nó rất gần với điểm chúng ta muốn. Vì vậy, chúng tôi chỉ giải quyết Bx (t) = Px và By (t) = Py. Đây chỉ là tìm rễ khối, trong đó có một giải pháp nguồn đóng, nhưng tôi chỉ sử dụng phương pháp Newton. Bây giờ chúng ta có t chúng ta muốn, và chúng ta có thể tính toán C (t), đó là điểm thực tế.

Tôi nên đề cập đến một vài tháng trước, tôi lướt qua một bài báo có một giải pháp khác cho thấy sự gần đúng với tham số tự nhiên của đường cong. Tác giả đã đăng một liên kết tới nó tại đây: Equidistant points across Bezier curves

+0

Người đàn ông xin lỗi vì đã không bình luận về điều này HAI năm trước khi bạn đăng nó, tôi không làm nhiều về SO vì tôi không có danh tiếng (mà tôi không có đại diện. yeah, yeah) .. nhưng câu trả lời tuyệt vời và ví dụ mã tuyệt vời, bây giờ cho tôi để hoàn toàn grock phản ứng .... – Prozacgod

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