Một giải pháp phân tích cho điều này là khó khăn, nhưng chúng ta có thể sử dụng tìm kiếm nhị phân để tìm một giải pháp trong độ chính xác cần thiết.
Con tàu có thể đạt đến điểm gần nhất trên quỹ đạo trong thời gian t_min :
shipOrbitRadius = (ship.position - planet.orbitCenter).length;
shortestDistance = abs(shipOrbitRadius - planet.orbitRadius);
t_min = shortestDistance/ship.maxSpeed;
Con tàu có thể đạt tới bất kỳ điểm nào trên quỹ đạo trong thời gian nhỏ hơn hoặc bằng t_max :
(Ở đây, để đơn giản, tôi cho rằng con tàu có thể lái xe qua mặt trời. Nếu bạn muốn tránh điều này thì bạn sẽ cần phải chuyển sang đường không thẳng trong ít nhất một số trường hợp. "Vòng tròn hôn" có thể trông đẹp và quỹ đạo cơ học-y, không thay đổi thuật toán nhiều hơn một yếu tố không đổi)
if(shipOrbitRadius > planet.orbitRadius)
{
t_max = planet.orbitRadius * 2/ship.maxSpeed + t_min;
}
else
{
t_max = planet.orbitRadius * 2/ship.maxSpeed - t_min;
}
Nếu thời gian quỹ đạo của chúng ta ngắn, chúng ta có thể cải thiện giới hạn trên bằng cách chọn t_max
lần đầu tiên sau khi t_min
hành tinh tiến gần nhất đến vị trí xuất phát của con tàu. Lấy bất kỳ giá trị nào trong hai giá trị t_max
này là nhỏ hơn. Xem câu trả lời sau này cho một dẫn xuất tại sao điều này hoạt động.
Bây giờ chúng ta có thể sử dụng tìm kiếm nhị phân giữa các cực trị này, t_min và t_max . Chúng tôi sẽ tìm kiếm một giá trị t có lỗi gần bằng 0:
error = (planet.positionAtTime(t) - ship.position).squareMagnitude/(ship.maxSpeed*ship.maxSpeed) - t*t;
(Sử dụng cấu trúc này, lỗi @ t_min> = 0 và lỗi @ t_max <= 0, do đó phải có ít nhất một lần chặn với lỗi = 0 cho giá trị t ở giữa)
trong đó, để hoàn thiện, chức năng vị trí giống như ...
Vector2 Planet.positionAtTime(float t)
{
angle = atan2(startPosition - orbitCenter) + t * orbitalSpeedInRadians;
return new Vector2(cos(angle), sin(angle)) * orbitRadius + orbitCenter;
}
Lưu ý rằng nếu chu kỳ quỹ đạo của hành tinh rất ngắn so với tốc độ của tàu, chức năng lỗi này có thể thay đổi các dấu hiệu nhiều lần trong khoảng từ t_min đến t_max. Chỉ cần theo dõi cặp + ve sớm nhất mà bạn gặp phải và tiếp tục tìm kiếm giữa chúng cho đến khi lỗi đủ gần bằng 0 ("đủ gần" nhạy cảm với các đơn vị và bối cảnh chơi trò chơi của bạn. hoạt động tốt - đảm bảo việc chặn chính xác trong khung)
Khi bạn có một lỗi giảm thiểu lỗi tốt, bạn có thể chỉ con tàu vào hành tinh.poseitionAtTime (t) và đi hết tốc lực, tự tin rằng hành tinh sẽ đạt đến điểm đó cùng lúc với bạn.
Bạn luôn có thể tìm thấy giải pháp trong các lần lặp Log_2 ((2 * orbitRadius / ship.maxSpeed) / errorThrưỡng). Vì vậy, ví dụ, nếu tàu của tôi có thể đi qua quỹ đạo trong 60 khung hình và tôi muốn đánh chặn chính xác trong một khung hình, tôi sẽ cần khoảng 6 lần lặp.