Phiên bản ngắn
Có một mẫu thiết kế để phân phối nhãn xe theo kiểu không chồng chéo, đặt chúng càng gần càng tốt với chiếc xe mà chúng đề cập đến? Nếu không, có bất kỳ phương pháp tôi đề nghị khả thi? Làm thế nào bạn sẽ thực hiện điều này cho mình?
Phiên bản mở rộng
Trong trò chơi tôi đang viết tôi có một tầm nhìn mắt chim về các phương tiện bay của mình. Tôi cũng có bên cạnh mỗi chiếc xe một nhãn nhỏ với dữ liệu chính về chiếc xe. Đây là một ảnh chụp màn hình thực tế:
Bây giờ, vì các phương tiện có thể bay ở các độ cao khác nhau, các biểu tượng của chúng có thể trùng nhau. Tuy nhiên, tôi muốn không bao giờ có nhãn của chúng trùng nhau (hoặc nhãn từ xe 'A' chồng lên biểu tượng của xe 'B').
Hiện tại, tôi có thể phát hiện sự va chạm giữa các sprite và tôi chỉ cần đẩy nhãn vi phạm theo hướng ngược lại với sprite chồng chéo . Điều này hoạt động trong hầu hết các tình huống, nhưng khi không phận trở nên đông đúc, nhãn có thể bị đẩy ra rất xa khỏi phương tiện của nó, ngay cả khi có một sự thay thế "thông minh hơn" khác. Ví dụ tôi nhận được:
B - label
A -----------label
C - label
nơi nào sẽ tốt hơn (= nhãn gần xe hơn) để có được:
B - label
label - A
C - label
EDIT: Cũng phải xem xét rằng bên cạnh trường hợp xe bị chồng chéo, có thể có các cấu hình khác trong đó các phương tiện có thể trùng nhau (ví dụ nghệ thuật ASCII cho thấy ba phương tiện rất gần trong đó nhãn của A
nó sẽ chồng lên biểu tượng của B
và C
).
Tôi có hai ý tưởng về cách cải thiện tình hình hiện tại, nhưng trước khi dành thời gian thực hiện chúng, tôi đã nghĩ đến việc nhờ cộng đồng tư vấn (sau tất cả có vẻ như là một "vấn đề đủ phổ biến" mà một mẫu thiết kế cho nó có thể tồn tại).
Để biết giá trị của nó, đây là hai ý tưởng tôi đã nghĩ đến:
Khe cắm của không gian nhãn
Trong kịch bản này, tôi sẽ chia tất cả màn hình thành các "khe" cho nhãn. Sau đó, mỗi chiếc xe sẽ luôn có nhãn của nó được đặt ở vị trí trống gần nhất (trống = không có các họa tiết khác tại vị trí đó.
Tìm kiếm xoắn ốc
Từ vị trí của chiếc xe trên màn hình, tôi sẽ cố gắng đặt nhãn ở các góc tăng và sau đó tại các bán kính tăng dần, cho đến khi tìm thấy một vị trí không chồng chéo. Một cái gì đó xuống dòng:
try 0°, 10px
try 10°, 10px
try 20°, 10px
...
try 350°, 10px
try 0°, 20px
try 10°, 20px
...