Вам нужно два случайно сгенерированных числа.
Думать об этом, используя прямоугольные ( декартовы ) (x, y) координаты, несколько неестественно для проблемного пространства.Учитывая радиус, несколько трудно подумать о том, как напрямую вычислить (Δx, Δy) дельту, которая попадает в круг, определяемый центром и радиусом.
Лучше использовать полярные координаты для анализа проблемы - в которой размеры (r1, Θ).Вычислить одно случайное расстояние, ограниченное радиусом.Вычислить случайный угол от 0 до 360 градусов.Затем преобразуйте (r, Θ) в декартову (Δx, Δy) , где декартовы величины просто смещены от центра вашего круга, используя простые соотношения тригонометрии.
Δx = r * cos(Θ)
Δy = r * sin(Θ)
Тогда ваша новая точка будет просто
xnew = x + Δx
ynew = y + Δy
Это работает для малых r, и в этом случае геометрия Земли может быть аппроксимирована геометрией Евклида (плоская плоскость).
Когда r становится больше, кривизна Земли означает, что евклидово приближение не соответствует реальности ситуации.В этом случае вам нужно будет использовать формулы для геодезического расстояния , которые учитывают трехмерную кривизну Земли.Это начинает иметь смысл, скажем, на расстояниях свыше 100 км.Конечно, это зависит от степени точности, которая вам нужна, но я предполагаю, что у вас есть немного места для маневра.
В 3d-геометрии вам снова нужно вычислить 2 величины - угол и расстояние.Расстояние снова ограничено вашим радиусом r, за исключением того, что в этом случае расстояние измеряется на поверхности земли и называется «расстоянием большого круга».Произвольно сгенерируйте число, меньшее или равное вашему r, для первой величины.
Соотношение геометрии большого круга
d = R Δσ
... утверждает, что d, расстояние большого круга, пропорционально радиусу сферы и центральному углу, представленному двумя точкамина поверхности сферы.«центральный угол» относится к углу, описываемому тремя точками с центром сферы в вершине и двумя другими точками на поверхности сферы.
В вашей задаче это d должно быть случайной величиной, связанной с вашим исходным 'r'.Расчет ad тогда дает вам центральный угол, другими словами Δσ, так как R для Земли известна (около 6371,01 км).
Это дает вам абсолютное (случайное) расстояние по большому кругу от вашего первоначального широты / долготы.Теперь вам нужно направление, количественно определенное углом, описывающее направление перемещения N / S / E / W от вашей исходной точки.Опять же, используйте случайное число 0-360 градусов, где ноль представляет собой восток, если хотите.
Изменение широты можно рассчитать как d sin(Θ)
, изменение долготы - d cos(Θ)
.Это дает расстояние по большому кругу в тех же измерениях, что и r (предположительно, в километрах), но вы хотите использовать широту / долготу, поэтому вам придется конвертировать.Получить от широтного расстояния до градусов легко: это около 111,32 км на градус независимо от широты .Преобразование из продольного расстояния в продольные градусы является более сложным, потому что продольные линии ближе друг к другу ближе к полюсам.Поэтому вам нужно использовать еще несколько сложных формул , чтобы вычислить изменение долготы, соответствующее выбранному d (большое расстояние) и углу.Помните, что вам, возможно, придется прыгнуть через барьер +/- 180 °.(Разработчики боевого самолета F22 Raptor забыли об этом, и их самолеты почти разбились при попытке пересечь 180-й меридиан .)
Из-за ошибки, которая может накапливаться в последовательных приближениях, вы будетехочу убедиться, что новая точка соответствует вашим ограничениям.Используйте формулу
Δσ = arccos( cos(Δlat) - cos(lat1)*cos(lat2)*(1 - cos(Δlong) ) .
, где Δlat - изменение широты и т. Д.
Этодает Δσ, центральный угол между новой и старой точками широты и долготы.Убедитесь, что центральный угол, который вы здесь вычислили, совпадает с центральным углом, который вы случайно выбрали ранее.Другими словами, убедитесь, что вычисленное d (расстояние по большому кругу) между вычисленными точками совпадает с расстоянием по большому кругу, которое вы выбрали случайным образом.Если вычисленное значение d отличается от выбранного значения d, вы можете использовать числовую аппроксимацию для повышения точности, слегка изменяя широту или долготу до тех пор, пока она не будет соответствовать вашему критерию.