Có hai cách để giải quyết câu hỏi này mà tôi có thể thấy. Đầu tiên, nếu bạn chỉ đơn giản muốn tìm cách lèo lái, thì bạn chỉ cần thực hiện tìm đường ( tôi thấy điều này khá hữu ích ). Đó sẽ là kết thúc của điều đó (và là câu trả lời thực tế chính xác cho câu hỏi này), nhưng tôi nghĩ bạn tò mò hơn về một giải pháp toán học cho vấn đề của bạn.
Để giải quyết điều đó, chúng ta hãy xem xét một vấn đề tương đương. Chụp một lát 2D cảnh của bạn "phía trước" phi công máy bay của bạn bình thường với vectơ ban đầu. Những gì bạn sẽ nhận được là một điểm đại diện cho vectơ ban đầu của bạn và một loạt các hình elip là hình chiếu 2D của hình nón tắc của bạn. Bây giờ những gì bạn muốn làm là tìm Điểm gần nhất với điểm ban đầu của bạn (hãy gọi nó P
) nằm ở bên ngoài của các hình elip không chồng chéo. Hóa ra đây là một vấn đề khá khó giải quyết. Có 3 bước:
- Chỉ ra các điểm giao nhau của tất cả các hình elip của bạn
- Tìm bất kỳ lỗ hổng nào trong sự kết hợp của tất cả các hình elip của bạn
- Chỉ ra điểm gần nhất
P
trên tất cả các hình elip của bạn bên ngoài liên kết (có thể nằm trong một lỗ)
Được rồi, tất cả điều này đòi hỏi hệ số nhân Lagrange và kiểm tra góc và một số công cụ thực sự phức tạp khác để giải quyết. Hãy xem xét các lựa chọn khác. Thay vào đó, nếu chúng ta biến đổi vấn đề của mình thành không gian góc cạnh, chúng ta sẽ thấy rằng những gì chúng ta thực sự muốn làm là tìm khoảng cách tối thiểu giữa một điểm và nhiều vòng tròn chiếu lên bề mặt của một hình cầu. Trong hình học vi phân, điều này thường được gọi là hình cầu 2 và rất hữu ích ở đây. Vì vậy, trước tiên, chúng ta cần tìm khoảng cách giữa hai điểm trên bề mặt của hình cầu, chúng ta sẽ sử dụng số liệu 2 hình cầu để tìm. May mắn thay, điều đó khá dễ dàng : ds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2)
, nơi chúng tôi giữ R
không đổi khi bán kính của hình cầu 2 của chúng tôi chiếu vào 3 không gian. Xuất phát từ vật lý, tôi coi th
là góc từ dương z
và ph
là góc từ dương x
vớis
là khoảng cách.
Làm gì thực hiện được điều này? Nó cho phép chúng tôi loại bỏ việc sử dụng các số nhân Lagrange để giảm thiểu khoảng cách và cho phép chúng tôi làm việc theo tọa độ "gốc" (vì chúng tôi xác định các hình nón của chúng tôi theo góc độ của tắc). Vì vậy, bây giờ chúng ta cần tìm bán kính của hình chiếu hình nón. Bây giờ chúng ta hãy lấy một hình nón và gọi góc xác định nó a
. Bán kính của hình chiếu sau đó đơn giản R*a
. Điều đó đã đủ dễ dàng - chúng ta cần biết số lượng nào khác về hình nón? Chúng ta cần biết tâm của hình chiếu, được xác định bởi vectơ nhìn từ diễn viên. Đầu tiên chúng ta chuyển đổi x
, y
và z
thành các tọa độ hình cầu nơi chúng ta biết chúng ta đang ở khoảng cách xa R
và giải quyết th
và ph
, điều chúng ta có thể làm bằng cách chỉ cần cắm vào các công thức chuyển đổi của mình:th = acos(z/R)
và ph = atan2(y/x)
(sử dụng atan2
ở đây để giải thích cho sự mơ hồ góc phần tư của arctangent). Quá trình này giống nhau để tìm vị trí của vectơ ban đầu của bạn trong tọa độ hình cầu.
Vì vậy, vấn đề đã được đơn giản hóa. Tuy nhiên, vấn đề vẫn còn khá khó giải quyết, nhưng bây giờ bạn chỉ cần lo lắng về các vòng tròn và điểm thay vì hình elip và các điểm hoặc góc và vectơ. Phần còn lại của quá trình là khá thủ tục. Về cơ bản, bạn cần tìm một vùng giới hạn được hình thành bởi các vòng tròn của mình, nơi có nhiều giải pháp. Tôi sẽ trình bày một phương pháp có thể không phải là tốt nhất, nhưng sẽ hiệu quả.
Trước tiên tôi sẽ so sánh tổng bán kính của tất cả các cặp đường tròn và khoảng cách giữa các tâm và sau đó nếu tổng của chúng lớn hơn khoảng cách trung tâm, hãy đặt chúng bằng nhau và giải th
vàph
để tìm các nút giao. Bạn biết rằng mỗi cặp giao điểm mô tả "các góc cấm" cho vòng tròn đang đề cập, mà bạn sẽ lưu trữ dưới dạng một mảng các góc điểm giao nhau (từ tâm vòng tròn) cho mỗi vòng tròn giao nhau với vòng tròn này - quan trọng là bạn phải " hợp nhất "bất kỳ phạm vi nào trùng lặp khi bạn thêm chúng vào mảng để phần tiếp theo hoạt động chính xác. Sau đó, bạn tìm điểm gần nhất trên cạnh của vòng tròn đến điểm ban đầu (đơn giản như vẽ một đường thẳng qua điểm chính giữa của vòng tròn và điểm ban đầu, sau đó tìm vị trí trên đường thẳng tại bán kính của vòng tròn cách xa trung tâm). Sau đó lặp qua mảng được lưu trữ của bạn và kiểm tra xem góc đó có nằm trong phạm vi của từng góc cấm không. Nếu vậy, sau đó chọn cạnh gần nhất. Đó là điểm gần nhất với bên ngoài được mô tả bên trong vòng tròn này. Lặp lại quy trình cho tất cả các vòng tròn (một số tối ưu hóa có thể được thực hiện trong quy trình lựa chọn - bạn thực sự không cần phải tính toán điều này cho mỗi vòng tròn). Bây giờ so sánh tất cả các khoảng cách ngắn nhất của bạn, tìm nhỏ nhất và đó là câu trả lời của bạn, được mô tả trong các gócth
và ph
. Hãy nhớ rằng khoảng cách được mô tả với số liệu 2 hình cầu trong khi thực hiện phép tính này. Vì bạn không quan tâm đến hình cầu mà tất cả điều này được bật, chỉ có các góc, bạn có thể đặt R=1
và thực hiện các phép tính này trên hình cầu đơn vị.
Đây là cách đơn giản nhất tôi có thể nghĩ để làm điều này. Tôi không chắc đó là cách đơn giản nhất tuyệt đối, nhưng nó sẽ hoạt động khá tốt. Thực tế cho một trò chơi, tuy nhiên, bạn chỉ muốn thực hiện tìm đường.