Làm thế nào một người sẽ xác định chiều dài của một con đường?


11

Tôi có một trò chơi yêu cầu mỗi người chơi di chuyển dọc theo một con đường được chỉ định. Tôi vẽ đường dẫn bằng các đường cong Bézier. Làm cách nào tôi có thể xác định tổng chiều dài thực (không phải tuyến tính) của đường dẫn và khoảng cách mà mỗi người chơi đã thực hiện? (Khoảng cách giữa điểm bắt đầu và điểm được chỉ định trên đường dẫn.)

CẬP NHẬT:

Đường dẫn được biểu diễn trong mặt phẳng Cartesian (2D).


Câu hỏi của bạn đã được trả lời gần cuối câu trả lời này
BlueRaja - Daniel Pflughoeft

Câu trả lời:


7

Như các câu trả lời trước đã nói, tính toán độ dài của đường cong Bezier thật khó ( không thể ?). Tôi muốn nói rằng 100% các trò chơi sử dụng xấp xỉ độ dài, gần như luôn luôn đủ chính xác.

Một vài tháng trước, tôi đã thực hiện nó bằng cách sử dụng phương pháp đề xuất là chia đường cong thành các phân đoạn "nhỏ" và thêm chiều dài của chúng. Có một ví dụ về việc triển khai C ++ ở đây .


11

Đo chiều dài của đường cong Bezier là khó. Nếu bạn không quan tâm đến sự thiếu chính xác một chút, một giải pháp đơn giản sẽ là xấp xỉ các đường cong Bezier bằng các đường thẳng và tính tổng độ dài của đường. Càng tạo nhiều phân khúc, xấp xỉ càng tốt.


Tôi có thể xem xét điều đó, nhưng làm cách nào để xác định tôi nên có bao nhiêu phân khúc và làm cách nào tôi có thể ánh xạ các phân đoạn để có điểm bắt đầu và điểm kết thúc trên đường đi của mình? Liệu kỹ thuật này có một tên? (vì vậy tôi tìm kiếm nó trên Google)
Valentin Radu

Một cách tiếp cận đơn giản là chỉ sử dụng phân phối tuyến tính các điểm từ B (0) đến B (1) ... giống như một cái gì đó bạn sẽ sử dụng để thực sự vẽ đường cong. Nhìn vào mã nguồn trong câu trả lời của Dan.
bummzack

Tôi đánh giá cao lời giải thích về việc bỏ phiếu xuống, chỉ để biết những gì tôi có thể cải thiện trong câu trả lời của mình ...
bummzack

7

Tham số độ dài spline bậc cao (nghĩa là lớn hơn bậc 1) phải được xấp xỉ; nó không thể được trình bày trực tiếp, do đó thực tế là không dễ để tìm ra giải pháp trực tiếp cho vấn đề này.

Một số triển khai còn tồn tại (mã sao chép-dán):

Theo các tác giả, sử dụng xấp xỉ Ch Quashev , độ chính xác tăng lên khi kích thước đường cong tăng. Nhìn vào trang 7-8 mã giả, phần còn lại là mô tả về các thuật toán khác mà chúng dựa trên cách tiếp cận của chúng mà bạn có thể bỏ qua. Một số tài liệu tham khảo trực tuyến đề cập đến phương pháp này là một phương pháp tốt.

Xem thêm những cách tiếp cận súc tích.


5

Điều này bắt đầu như một nhận xét về nhận xét về câu trả lời của @ bummzack, nhưng đã phát triển quá lâu.

làm thế nào tôi có thể xác định có bao nhiêu phân khúc

Có hai cách tiếp cận. Đầu tiên chỉ là thuật toán tiêu chuẩn để hiển thị đường cong Bézier: các điểm điều khiển tạo thành một hộp giới hạn của đường cong, vì vậy nếu tất cả các điểm kiểm soát nằm trong epsilon của đoạn đường từ điểm bắt đầu đến điểm cuối bạn xấp xỉ là một đường; mặt khác, bạn chia nhỏ bằng thuật toán de Casteljau. Epsilon được chọn theo lỗi bạn muốn trong kết quả cuối cùng. (Để hiển thị, nó thường là 0,5 pixel).

Cách tiếp cận khác là một sàng lọc sử dụng số học khoảng. Lấy độ dài của đường từ đầu đến cuối làm giới hạn dưới và tổng độ dài của các đường qua các điểm kiểm soát làm giới hạn trên. Một lần nữa, chia nhỏ theo yêu cầu của các yêu cầu lỗi cuối cùng của bạn.

Người ta thường chia nhỏ ở t = 0,5, nhưng thuật toán de Casteljau cho phép phân tách tại bất kỳ điểm nào, vì vậy nếu bạn có một khối Bézier với các điểm kiểm soát C_0 đến C_3 và C_2 gần phân đoạn đường giữa các điểm cuối hơn C_1, bạn có thể thấy rằng phân tách tại một trong 1/3 hoặc 2/3 cho giới hạn chặt hơn. Tôi đã không làm việc thông qua đại số để biện minh cho việc nào sẽ tốt hơn, nhưng bạn có thể thử nghiệm và báo cáo lại nếu muốn. Nếu không có gì khác, tôi muốn chỉ ra rằng tùy chọn là có.


3

Tính độ dài của đường cong tham số có thể được thực hiện bằng cách lấy tích phân của sqrt ((dx / dt) ² + (dy / dt) ²), trong đó dx / dt là đạo hàm của thành phần x của đường cong và dy / dt là đạo hàm của thành phần y của đường cong. Trong trường hợp của Bézier-spline, hai cái này giống nhau, vì phương trình có thể được mở rộng cho bất kỳ chiều nào.

Công thức cho một khối Bézier-spline là một công thức sau: B (t) = (1 - t³) * P0 + 3 (1 - t) ²t * P1 + 3 (1 - t) t² * P2 + t³ P3 trong đó P0 qua P3 là các điểm kiểm soát.

Theo Wolfram | Alpha, đạo hàm của công thức này là: d (B (t)) / dt = 3 (t (t (P3 - P0) + P2 (2 - 3t) + P1 (3t² - 4t + 1))

Bây giờ bạn có thể đặt lại phương trình này cho phương trình độ dài của đường cong và tính tích phân từ t = 0 đến t = 1. Thật không may, Wolfram | Alpha hết thời gian khi tôi cố gắng làm điều này. Bạn có thể làm tích hợp số, tuy nhiên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.