Làm cách nào để kiểm tra xem đường kẻ do người chơi vẽ có đi theo đường dẫn không?


8

Tôi muốn vẽ một con đường vô hình mà người dùng phải đi theo. Tôi đã lưu trữ đường dẫn đó dưới dạng các điểm. Khi người chơi vẽ một đường, làm thế nào tôi có thể kiểm tra nếu nó đi theo đường dẫn tôi đã lưu trữ?

Đây là một ví dụ để truy tìm chữ A.

ví dụ dấu vết

if((traitSprite.getX()<=Invisible.X  && traitSprite.getX()>=Invisible.X )){...}

( traitSpritelà một sprite.)


Làm thế nào bạn lưu trữ đường dẫn mà đường vẽ của người chơi nên đi theo? Có phải đó là những gì sprite?
Anko

không, là những điểm mà tôi đã nhập bằng tay. đó là một ý tưởng tồi, nhưng tôi nghĩ rằng việc sử dụng "Vector2" sẽ là một giải pháp hiệu quả nhưng tôi không thực sự biết cách sử dụng nó.
Android

Câu trả lời:


12

Đây là một giải pháp dựa trên vector. Tôi đã không thử nó, nhưng nó có vẻ tốt về mặt khái niệm.

Học thuyết

Tôi tập hợp bạn đã lưu trữ hình dạng như các phân đoạn dòng. Đây là chữ A được đại diện với ba phân đoạn dòng.

phân đoạn dòng đại diện cho một chữ cái

Tôi đã giả định rằng các đường dẫn trong bản vẽ của người dùng được lưu trữ dưới dạng danh sách các điểm.

Chúng tôi có thể "thổi phồng" các phân đoạn dòng đó để cho phép lề lỗi khi kiểm tra mức độ gần : liệu đường dẫn được vẽ của người dùng có gần lề lỗi chính xác không.

phân khúc dòng "thổi phồng" đường dẫn do người dùng vẽ ở đầu thư có lề lỗi

Tuy nhiên, điều đó thôi là chưa đủ. Chúng tôi cũng phải kiểm tra phạm vi bảo hiểm : liệu bản vẽ của người dùng có "che" một phần lớn hình dạng hay không. Những bản vẽ này là xấu, bởi vì mặc dù chúng nằm trong lề lỗi, chúng vẫn thiếu một phần của bức thư:

bản vẽ xấu

Nếu chúng tôi kiểm tra cả hai điều đó, chúng tôi có thể ước chừng nếu bản vẽ của người chơi tốt.

Thực hiện

Kiểm tra độ gần chỉ có nghĩa là cho từng điểm đường dẫn người dùng, tìm khoảng cách giữa điểm đó và mỗi dòng tạo thành chữ cái, lấy mức thấp nhất và kiểm tra nó nhỏ hơn lề lỗi.

Kiểm tra phạm vi bảo hiểm phức tạp hơn, nhưng bạn có thể có được xấp xỉ rất tốt với toán học vectơ nếu với mỗi phân đoạn dòng, bạn tìm thấy đường dẫn do người dùng vẽ (màu xanh lá cây) gần nhất và chiếu các phần của nó (màu xanh đậm) lên đoạn đó (màu đen), sau đó kiểm tra xem các vectơ chiếu (màu xanh) che phủ tốt như thế nào:

kiểm tra phạm vi bằng phép chiếu vector

Để chiếu một vectơ alên một vectơ khác b, hãy làm

projection = dotProduct(a, b) / lengthSquared(b) * b

trong đó dotProducttính toán tích của hai vectơ và lengthSquarednó nghe như thế nào. Về cơ bản, điều này tìm thấy giá trị vô hướng của hướnga đi bao nhiêu bvà nhân với bđó để có được một vectơ theo cùng một hướng. ( Hướng dẫn phát hiện va chạm của Phần mềm Metanet A có một hình dung đẹp về điều này trong Phụ lục A § phép chiếu .)

Hướng của vectơ chiếu có thể không thực sự quan trọng. Nếu bạn chỉ tổng hợp độ dài của các vectơ được chiếu và so sánh chúng với tổng chiều dài của đoạn đường, điều đó sẽ cho bạn biết phần nào của nó được bao phủ. (Trừ những trường hợp kỳ lạ, hãy xem § Hạn chế bên dưới).

Trong hình trên, đường dẫn sẽ chiếm khoảng một nửa đoạn. Bạn có thể chọn bất kỳ giá trị dung sai nào bạn muốn.

Hạn chế

Chữ cong

Phân đoạn dòng là lý tưởng phụ: Nhiều chữ cái bị cong! Làm thế nào để bạn đại diện cho một 'P' hoặc 'O'?

Bạn có thể sử dụng nhiều phân đoạn dòng (có thể có lề lỗi lớn hơn).

chữ P xấp xỉ với các đoạn thẳng chữ O gần đúng với các đoạn thẳng

Bạn cũng có thể bắt đầu sử dụng các đường cong Bézier thay vì đường cho một sự phù hợp chặt chẽ hơn, nhưng lưu ý rằng việc tìm kiếm các điểm gần nhất trên Béziernhiều phức tạp-cũng như nhiều hoạt động đo lường khác.

Không phù hợp

Biên độ dung sai quá mức cho khoảng cách từ các dòng và phạm vi bảo hiểm của bức thư có thể có những hậu quả không lường trước được.

Ví dụ: người chơi có thể đã cố vẽ chữ 'H' ở đây.

một chữ H nhận nhầm là A

Vòng lặp và chồng chéo

vòng lặp và chồng chéo trong thư (có thể) được công nhận

Các vòng lặp hoặc chồng lấp trong đường dẫn do người chơi vẽ có thể dẫn đến một số phần của bản vẽ được tính hai lần khi chiếu chúng lên đoạn đường gần nhất.

Điều này có thể được giải quyết bằng cách xử lý fancier trên các vectơ được chiếu, có thể lưu trữ chính xác vị trí của vectơ chiếu (lưu hướng của hình chiếu và điểm gần nhất trên đoạn thẳng đến điểm trên đường do người chơi vẽ) , sau đó từ chối những cái mới chồng lên nó.

Nếu người chơi vẽ một đường dẫn duy nhất và nó được xử lý bắt đầu từ cuối được đánh dấu bằng vòng tròn màu xanh, các phần màu xanh lá cây của đường dẫn đó sẽ được chấp nhận và các đường màu đỏ bị từ chối, vì phép chiếu của chúng sẽ trùng với một số phần được xử lý trước đó.

từ chối các vòng lặp và chồng chéo

Việc thực hiện có nhiều sự tinh tế về kỹ thuật có lẽ sẽ thuộc về một câu hỏi khác.

Người chơi phiêu lưu không thể đoán trước

Một người chơi có thể vẽ một cái gì đó kỳ lạ vẫn còn vượt qua .

trolololol

Mặc dù bạn có thể gọi đó là một tính năng! :)


cảm ơn bạn, bạn đề nghị gì để không vẽ bên ngoài bức thư?
Android

@Android "lề lỗi" màu cam là dành cho điều đó. Bạn có thể từ chối các dòng đi ra ngoài chúng: ví dụ như thế này .
Anko

Điều tôi muốn là tạo chữ cái dưới dạng SpriteBatch, sau đó khu vực duy nhất tôi có thể vẽ là lô sprite đó, có thể có dạng A hoặc B, X .... điều này có khả thi không? nếu đó là cách tôi có thể tạo một kết cấu như SpriteBatch? Và cảm ơn bạn trước.
Android

2

tl; dr Tôi đề nghị làm cho bàn chải của người chơi vẽ một mặt phẳng 2d có thể nhìn thấy (hoặc vô hình). Khác biệt hình ảnh được vẽ của người dùng với nguồn gốc (hình bóng mong muốn hoặc mô hình 2d). Nếu bạn muốn tăng độ chính xác thì hãy làm cho các đường hướng dẫn và cọ hẹp hơn, để có nhiều chỗ hơn cho lỗi, làm cho bàn chải và thiết kế dày hơn.

Mặt khác, bạn có thể đo khoảng cách của mỗi (x, y) người dùng nhấp / chạm vào từ spline bằng cách tính điểm đến khoảng cách phân đoạn. Sau đó, bạn có thể tính trung bình khoảng cách để soạn một thước đo độ chính xác và hiệu quả. Nó sẽ đòi hỏi nhiều công việc hơn để có được một biện pháp hoàn thành có ý nghĩa và nhận ra hiệu quả của người dùng.


Cân nhắc: Tôi đề nghị không làm như vậy (kiểm tra trực tiếp nếu một dòng đi theo một đường dẫn). Đây có thể là một ý tưởng tồi. Có vẻ như bạn muốn người dùng lấp đầy một hình bóng. Đường dẫn chính là một spline (khung xương) đại diện cho hình bóng.

Nếu bạn chỉ đơn giản làm cho bàn chải của người chơi áp dụng một khối pixel đơn sắc sắc nét cho mặt phẳng 2d, bạn có thể chạy một quá trình trong nền để kiểm tra xem có bao nhiêu pixel bên trong hình bóng và bao nhiêu pixel bên ngoài. Điều này có thể dễ dàng dẫn đến% thành công, trong đó bao nhiêu% mẫu được điền là một thống kê quan tâm và một số khác là bao nhiêu% nằm ngoài biên của mô hình. Nếu bạn kiểm tra khoảng cách phân khúc phụ, thì chính xác công việc của người dùng là không rõ ràng.


1

Giải pháp tốt nhất không sử dụng đồ họa chút nào, hãy làm nó với toán học!

Bạn có thể dễ dàng hiểu được mọi điểm (người dùng đã vẽ) cách xa phân khúc /programming/849211/shortest-distance-b between-a- point-and-a-line- sibution

Rằng bạn có thể tính toán sai số trung bình, vì vậy hãy đo xem người dùng đúng bao nhiêu.


cảm ơn bạn, nhưng những chữ cái như "C" "O" thì sao? ... không có khoảng cách cố định giữa các điểm ..
Android

Bạn có thể tạo "C" và "O" từ 6-8 phân đoạn dòng, giống như các phân đoạn khác, nhưng toán học sẽ hơi khác nhau, về mặt
đo lường
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.