2009-08-03 22 views
5

Tôi đã khó hiểu về việc hiển thị đường dẫn trong vài ngày qua mà không có bất kỳ giải pháp thực sự nào.Làm cách nào để hiển thị đường dẫn mịn cho một tập hợp các điểm dữ liệu?

Bằng cách hiển thị đường dẫn, tôi đã đưa ra một tập hợp các điểm dữ liệu x, y (ở khoảng cách khác nhau) để vẽ một đường đứt nét (hoặc trong trường hợp của tôi một tứ giác xoay) có độ dài cố định theo khoảng thời gian đều đặn giữa tạo ra một con đường trơn tru.

Nếu bạn có kiểm soát chuyến bay cho iPhone, tôi đang cố tạo hiệu ứng tương tự như hiển thị đường dẫn trong trò chơi đó.

Đây là vấn đề của tôi. Nếu chiều rộng của đồ họa + khoảng cách không thể xác định chính xác trong khoảng cách giữa 2 điểm dữ liệu thì tôi sẽ bị bỏ qua hoặc chồng chéo. Giải pháp duy nhất của tôi cho điều này là

1) Lấy điểm chồng chéo/gạch dưới làm điểm kết thúc của điểm đặt dữ liệu tiếp theo và sau đó vẽ từ đó đến điểm sau.

2) Luôn vẽ theo điểm cuối cuối cùng và bắt đầu làm mới từ điểm dữ liệu tiếp theo.

Cả hai giải pháp này đều lý tưởng và cả hai đều có vấn đề.

Có ai có giải pháp tốt hơn không?

Mọi trợ giúp sẽ được đánh giá cao.

Màn hình sau minh họa những gì tôi đang cố gắng để tạo ra: http://www.firemint.com/flightcontrol/screenshots-peaceful.html

Dòng chấm dày.

Cập nhật:

Xin chào tôi đã thử hiển thị qua đường cong, tôi tính đường cong khối (qua 4 điểm kiểm soát). Tuy nhiên vấn đề là một trong những nội suy. Cho 0 và 1 tôi có thể bước qua 2 điểm bất kỳ. Tuy nhiên tôi muốn bước qua toàn bộ đường dẫn (nhiều điểm kiểm soát). Vấn đề là một số điểm kiểm soát sẽ là một khoảng cách khác nhau, và do đó bước qua một bước tăng liên tục (nói 0.2) sẽ tạo ra kết quả bất thường. Tôi nhận ra để có thể đi qua toàn bộ con đường tôi cần tính toán chiều dài của toàn bộ đường cong ... câu hỏi là làm thế nào để tôi làm điều đó? ... Hoặc là có một cách khác?

Cheers Giàu

+0

bạn đã bao giờ tìm thấy giải pháp về chủ đề này chưa? –

Trả lời

0

Bạn hoàn toàn hạn chế quads kích thước cố định? Các giải pháp lý tưởng là để cắt ngắn quad cuối cùng với kích thước chính xác.

Nếu bạn bị hạn chế, bạn có thể làm một vài việc. Nếu bạn đang vẽ các đường đứt nét, bạn có thể thay đổi khoảng cách của dấu gạch ngang để đảm bảo bạn không bao giờ kết thúc với một phần quads trên các điểm cuối. Điều này có thể bị mất tập trung khi khoảng cách sẽ điều chỉnh dựa trên độ dài của phân đoạn.

chỉnh sửa:

Ah, ảnh giúp. Tôi giả sử vì đây là trên iPhone mà bạn đang nhận được một loạt các điểm mà từ đó vẽ đường giữa chúng tạo ra một đường cong chấp nhận được. Nếu đây là trường hợp sử dụng splines/đường cong nguyên thủy có lẽ là quá mức cần thiết. Tôi có lẽ sẽ tiếp cận vẽ đường như được chỉ đơn giản bằng cách vẽ quads tại tất cả các điểm dữ liệu đó là một khoảng cách nhất định từ điểm dữ liệu cuối cùng.

Các thuật toán sẽ là một cái gì đó như:

  1. Vẽ quad vào điểm dữ liệu đầu tiên (xoay một cách thích hợp)
  2. Traverse danh sách điểm đến khi bạn đang ở khoảng cách X ít nhất từ ​​điểm cuối cùng
  3. Lerp giữa điểm hiện tại và điểm truy cập cuối cùng để tìm trung tâm chính xác để đặt tứ giác tiếp theo.
  4. Vẽ quad (xoay một cách thích hợp)
  5. Đến bước 2
  6. Nếu bạn có một điểm một phần cho các quad cuối cùng vẽ nó như bình thường (điều này sẽ cung cấp cho một tốt hơn thị giác hơn cắt bỏ nó).

Đối với niềm vui, để lerp giữa hai điểm bởi một số khoảng cách D có nghĩa là ít hơn so với khoảng cách giữa hai điểm (điều này có lẽ đơn giản hơn trong trường hợp 2D nhưng tôi thích làm việc chung):

vector v = point2 - point1; 
normalize(v); 
v *= D; 
finalPoint = point1 + v; 
+0

Tôi chỉ chấp nhận các điểm dữ liệu có khoảng cách nhất định từ điểm hiện tại, vì vậy việc đối chiếu điểm của tôi sẽ có khoảng cách tối thiểu. Đó là khoảng cách tương tự như đồ họa xoay của tôi. Tuy nhiên nếu người dùng di chuyển ngón tay của họ một cách nhanh chóng khoảng cách giữa các điểm trở nên lớn (do đó nội suy). Bạn có thể vui lòng chi tiết phần Lerping nhiều hơn một chút, vì điều này nghe có vẻ tương tự như những gì tôi hiện đang làm, và điều này không tạo ra con đường trơn tru như trong ảnh chụp màn hình. – Rich

+0

Phương pháp tôi mô tả chỉ có vẻ tốt nếu bạn có các điểm dữ liệu không xa hơn 2 lần khoảng cách giữa các dấu gạch ngang. Nếu các điểm dữ liệu của bạn ở xa hơn bạn sẽ cần phải điều tra một phương pháp phù hợp đường cong (đường cong chuẩn phù hợp cho một vấn đề như thế này có xu hướng là Catmull-rom) vì đường cong của bạn sẽ bắt đầu phẳng ra. –

+0

Trong tham chiếu đến nội suy, vì thường điểm dữ liệu của bạn sẽ không chính xác ở vị trí đầu tiên mà bạn muốn vẽ quad, bạn sẽ cần phải đi đâu đó giữa hai điểm dữ liệu của bạn. Khi bạn biết hai bạn muốn ở giữa, bạn có thể áp dụng phép nội suy tuyến tính (giải phương trình của đường giữa hai điểm cho một số hằng số nội suy dựa trên khoảng cách dọc theo đường thẳng của tứ giác) hoặc nếu chúng ở xa hơn, áp dụng một nội suy xấp xỉ đường cong (như tôi đã đề cập ở trên). –

1

Bạn có thể muốn xem Bezier curves hoặc hermite curves chúng không khó để tính toán và bạn nhận được các đường cong mềm mại đẹp.

3

Có chức năng CoreGraphics gọi là "CGPathAddQuadCurveToPoint" được sử dụng để vẽ các đường trơn. An example on how to use it is on GitHub.

+0

Cảm ơn, tôi sẽ cho đi khi tôi về nhà. Nói cho tôi biết, điều có thể được thực hiện trong Open GLES? Như tôi biết rất nhiều công cụ CoreGraphics không hoạt động trong Open GLES. – Rich

+0

@Rich nó có thể được tích hợp với OpenGL đến mức mà bất kỳ công cụ nào của CoreGraphics đều có thể được tích hợp với OpenGL. Tôi không có kinh nghiệm về vấn đề này. =) –

+0

Tôi không nghĩ rằng bạn có thể hiển thị nội dung đồ họa cốt lõi ontop của một bề mặt gl es mở ??? – Rich

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