предупреждение: это может быть сложно, если окружности / "прямоугольники" охватывают большие части сферы, например ::100100
«прямоугольник»: минимальная длина = -90 градусов, максимальная длина = + 90 градусов, минимальная длина = + 70 градусов, максимальная длина = + 80 градусов
круг: центр = широта = + 85 градусов, длинный = + 160 градусов, радиус = 20 градусов (например, если точка A находится на окружности, а точка C - центр окружности, а точка O - центр сферы, то угол AOC = 40 градусов ).
Они пересекаются, но математика может иметь несколько случаев для проверки пересечения / сдерживания. Следующие точки лежат на окружности, описанной выше: P1 = (+ 65 градусов широты, + 160 градусов в длину), P2 = (+ 75 градусов широты, -20 градусов в длину). P1 находится вне «прямоугольника», а P2 находится внутри «прямоугольника», поэтому круг / «прямоугольник» пересекаются как минимум в 2 точках.
Хорошо, вот мой примерный план решения:
Пусть C = центр круга с радиусом R (выражается как сферический угол, как указано выше). C имеет широту LATC и долготу LONGC. Поскольку слово «прямоугольник» здесь вводит в заблуждение (линии постоянной широты не являются отрезками больших кругов), я буду использовать термин «ограничивающий прямоугольник».
функция InsideCircle(P)
возвращает + 1,0 или -1: +1, если точка P находится внутри окружности, 0, если точка P находится на окружности, и -1, если точка P находится вне круга: вычисление расстояния D по большому кругу (выраженного в виде сферического угла) между C и любой точкой P скажет вам, находится ли P внутри круга: InsideCircle(P) = sign(R-D)
(Как упомянул пользователь @Die в Sente, отлично на этом форуме в других местах были заданы круговые расстояния)
Определить PANG(x)
= основной угол x = MOD (x + 180 градусов, 360 градусов) -180 градусов. PANG(x)
всегда между -180 градусов и + 180 градусов включительно (+ 180 градусов должно соответствовать -180 градусов).
Чтобы определить ограничивающий прямоугольник, вам нужно знать 4 числа, но есть небольшая проблема с долготой. LAT1 и LAT2 представляют ограничивающие широты (предполагая, что LAT1
- LAT1 <= LATP и LATP <= LAT2 (эта часть очевидна) </li>
- abs (PANG (LONGP-LONGM))
Круг пересекает ограничивающую рамку, если ЛЮБОЙ из следующих точек P в PTEST = union (PCORNER, PLAT, PLONG), как описано ниже, не все возвращают одинаковый результат для InsideCircle()
:
- PCORNER = 4 угла ограничительной рамки
- точки PLAT на сторонах ограничительной рамки (их нет или 2), которые имеют ту же широту, что и центр круга, , если LATC находится между LAT1 и LAT2, и в этом случае эти точки имеют широта LATC и долгота LONG1 и LONG2.
- точки PLONG на сторонах ограничительной рамки (их нет или 2, или 4!), Которые имеют ту же долготу, что и центр круга. Эти точки имеют ЛИБО долгота = LONGC ИЛИ долгота PANG (LONGC-180). Если abs (PANG (LONGC-LONGM))
Эти точки PLAT и PLONG, как указано выше, являются точками на ограничительной рамке, которые являются «самыми близкими» к кругу (если углы не являются; я использую «самые близкие» в кавычках, в смысле широты / долготы и не расстояние между большими кругами) и охватывать случаи, когда центр круга лежит на одной стороне границы ограничивающего прямоугольника, но точки на окружности «пробираются» через границу ограничивающего прямоугольника.
Если все точки P в PTEST возвращают InsideCircle(P)
== +1 (все внутри круга), то круг полностью содержит ограничивающий прямоугольник.
Если все точки P в PTEST возвращают InsideCircle(P)
== -1 (все за пределами круга), тогда круг полностью находится внутри ограничительной рамки.
В противном случае существует как минимум одна точка пересечения между кругом и ограничительной рамкой. Обратите внимание, что это не вычисляет, где находятся эти точки, хотя, если вы берете любые 2 точки P1 и P2 в PTEST, где InsideCircle (P1) = -InsideCircle (P2), то вы можете найти точку пересечения (неэффективно) путем деления пополам. (Если InsideCircle (P) возвращает 0, то у вас есть точка пересечения, хотя равенство в математике с плавающей точкой, как правило, нельзя доверять.)
Возможно, есть более эффективный способ сделать это, но вышеприведенное должно сработать.