Đâ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.
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.
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ư:
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:
Để chiếu một vectơ a
lên một vectơ khác b
, hãy làm
projection = dotProduct(a, b) / lengthSquared(b) * b
trong đó dotProduct
tính toán tích của hai vectơ và lengthSquared
nó 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 b
và 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).
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ézier là nhiề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.
Vòng lặp và chồng chéo
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 đó.
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 .
Mặc dù bạn có thể gọi đó là một tính năng! :)