Làm thế nào để phát hiện sự va chạm giữa sprite và hình dạng do người dùng tạo ra?


9

Làm thế nào để phát hiện sự va chạm giữa sprite và hình dạng do người dùng tạo ra.

Ví dụ. Có một số đối tượng trên màn hình. Người dùng lấy ngón tay của họ và vẽ một hình tròn xung quanh một đối tượng (Quy tắc lựa chọn là vẽ vòng tròn xung quanh sprite, nhưng hình dạng bức tranh có thể khác nhau). Tôi cần phát hiện đối tượng nào được chọn, giống như:

(hình ảnh demo): ban đầu được đăng là http://i52.tinypic.com/28h0t1g.png


Bạn có thể giải thích tại sao màu xanh được chọn và không phải màu đỏ trong ví dụ cuối cùng của bạn? Bạn cũng có thể làm rõ liệu dòng có thực sự chạm vào sprite không? Ví dụ thứ ba không chạm vào ô màu đỏ nhưng nó được nêu là đã chọn. Ví dụ thứ 5 rất giống nhưng không được chọn. Sự khác biệt bạn đang tìm kiếm giữa # 3 và # 5 là gì?
Romen

Câu trả lời:


2

Nếu hình dạng được vẽ chủ yếu với các phân đoạn dòng từ người dùng (hoặc đường cong Bezier với các điểm kiểm soát), bạn có thể thực hiện một thuật toán được sử dụng khá rộng rãi được gọi là Định lý tách trục . Nói một cách đơn giản: nếu có một trục (vector đơn vị biểu thị một hướng) mà trên đó các hình không trùng nhau (các giá trị được chiếu của chúng không dẫn đến sự khác biệt dương), các đối tượng không bị chồng chéo. Tôi đã sử dụng điều này trong quá khứ và nó đã hoạt động như một bùa mê.



0
  • Tạo một bộ đệm có cùng kích thước với màn hình (hoặc bề mặt có hình dạng của Bạn). Tại mỗi vị trí, nó chứa boolean cho dù có sprite; sau đó, kiểm tra tất cả "pixel" hình dạng người dùng xem vị trí của họ có phải là sprite không (bằng cách kiểm tra giá trị của boolean đó). Ngoài ra, bạn có thể tạo thêm các họa tiết ở đó bằng cách lưu trữ ID của chúng thay vì boolean; nhưng đây là trường hợp của 1 sprite.
  • Nếu hình dạng do người dùng tạo có thể được biểu diễn bằng chuỗi các dòng, thì Bạn có thể kiểm tra xem mỗi dòng như vậy có vượt qua sprite không. Vì sprite có hình chữ nhật và hình dạng người dùng là một đường chỉ cần tìm "giao tuyến hình chữ nhật đường thẳng" ... (tách thuật toán trục si một cách để làm điều đó)

Phương pháp tiếp cận phụ thuộc vào cấu trúc dữ liệu bạn chọn, cho dù chúng là bitmap hay vectơ.

Cách tiếp cận đầu tiên có thể xử lý các hình dạng phức tạp tùy ý, đơn giản để thực hiện nhưng sử dụng nhiều bộ nhớ hơn. Trên thực tế, bạn có thể giảm chi phí bộ nhớ bằng cách sử dụng nén và tăng tốc độ bằng cách sử dụng các cấu trúc dữ liệu chữ tượng hình (octrees) ...

Cách tiếp cận thứ hai, không đơn giản để thực hiện nhưng sử dụng nhiều sức mạnh xử lý hơn.

Trong mỗi trường hợp đo nếu nó quan trọng. Tôi sẽ cố gắng làm cái đầu tiên vì nó đơn giản hơn để thực hiện. Chúc may mắ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.