Определение, реагирует ли lat-длинное и круг на перекрытии сферы

используйте следующий код:

String[] split = columnNames.split(", ");

сейчас
значение split [0] будет -
[ 112] split [1] будет . С
split [2] будет . Полное расписание техников RHVAC завершено [ 114]
...
...

8
задан kemiller2002 26 December 2008 в 20:04
поделиться

7 ответов

  • Yes, if the box corners contain the circle-center.
  • Yes, if any of the box corners are within radius of circle-center.
  • Yes, if the box contains the longitude of circle-center and the longitude intersection of the box-latitude closest to circle-center-latitude is within radius of circle-center.
  • Yes, if the box contains the latitude of circle-center and the point at radius distance from circle-center on shortest-intersection-bearing is "beyond" the closest box-longitude; where shortest-intersection-bearing is determined by finding the initial bearing from circle-center to a point at latitude zero and a longitude that is pi/2 "beyond" the closest box-longitude.
  • No, otherwise.

Assumptions:

  • You can find the initial-bearing of a minimum course from point A to point B.
  • You can find the distance between two points.

The first check is trivial. The second check just requires finding the four distances. The third check just requires finding the distance from circle-center to (closest-box-latitude, circle-center-longitude).

The fourth check requires finding the longitude line of the bounding box that is closest to the circle-center. Then find the center of the great circle on which that longitude line rests that is furthest from circle-center. Find the initial-bearing from circle-center to the great-circle-center. Find the point circle-radius from circle-center on that bearing. If that point is on the other side of the closest-longitude-line from circle-center, then the circle and bounding box intersect on that side.

It seems to me that there should be a flaw in this, but I haven't been able to find it.

The real problem that I can't seem to solve is to find the bounding-box that perfectly contains the circle (for circles that don't contain a pole). The bearing to the latitude min/max appears to be a function of the latitude of circle-center and circle-radius/(sphere circumference/4). Near the equator, it falls to pi/2 (east) or 3*pi/2 (west). As the center approaches the pole and the radius approaches sphere-circumference/4, the bearing approach zero (north) or pi (south).

2
ответ дан 5 December 2019 в 15:27
поделиться

Используйте Стереографическую проекцию. Все круги (конкретно широты, долготы и Ваш круг) отображаются на круги (или строки) в плоскости. Теперь это - просто вопрос о кругах и строках в планиметрии (еще лучше, все longitues являются строками до 0, и все широты являются кругами приблизительно 0),

3
ответ дан 5 December 2019 в 15:27
поделиться

Как насчет этого?

Найдите вектор v это соединяет центр прямоугольника, точки Cr, к центру круга. Найдите точку i где v пересекает прямоугольник. Если ||i-Cr|| + r > ||v|| затем они пересекаются.

Другими словами, длина сегмента в прямоугольнике плюс длина сегмента в кругу должна быть больше, чем общая длина ( v, сегмент центральной соединительной линии).

Нахождение точки i должна быть хитрая часть, особенно если она падает на край долготы, но необходимо смочь придумать что-то быстрее, чем я могу.

Править: Этот метод не может сказать, полностью ли круг в прямоугольнике. Необходимо было бы найти расстояние от его центра до всех четырех из краев прямоугольника для этого.

Править: Вышеупомянутое является неправильным. Существуют некоторые случаи, как Federico Ramponi предположил, где это не работает даже в Эвклидовой геометрии. Я отправлю другой ответ. Не примите это и не стесняйтесь проваливать. Я удалю его вскоре.

2
ответ дан 5 December 2019 в 15:27
поделиться

Это должно работать на любые точки на земле. Если Вы хотите измениться, это к другой сфере размера просто изменяет kEarchRadiusKms на любой радиус, который Вы хотите для своей сферы.

Этот метод используется для вычисления расстояния между к точкам lon и lat.

Я получил эту формулу расстояния отсюда: http://www.codeproject.com/csharp/distancebetweenlocations.asp

public static double Calc(double Lat1, double Long1, double Lat2, double Long2)
{
    double dDistance = Double.MinValue;
    double dLat1InRad = Lat1 * (Math.PI / 180.0);
    double dLong1InRad = Long1 * (Math.PI / 180.0);
    double dLat2InRad = Lat2 * (Math.PI / 180.0);
    double dLong2InRad = Long2 * (Math.PI / 180.0);

    double dLongitude = dLong2InRad - dLong1InRad;
    double dLatitude = dLat2InRad - dLat1InRad;

    // Intermediate result a.
    double a = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
               Math.Cos(dLat1InRad) * Math.Cos(dLat2InRad) *
               Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);

    // Intermediate result c (great circle distance in Radians).
    double c = 2.0 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1.0 - a));

    // Distance.
    // const Double kEarthRadiusMiles = 3956.0;
    const Double kEarthRadiusKms = 6376.5;
    dDistance = kEarthRadiusKms * c;

    return dDistance;
}

Если расстояние между какой-либо вершиной прямоугольника является меньше, чем расстояние радиуса круга затем прямоугольное перекрытие и круг. Если расстояние между центром круга и всеми вершинами больше, чем радиус круга и все те расстояния короче, чем ширина и высота прямоугольника затем, круг должен быть в прямоугольнике.

Не стесняйтесь исправлять мой код, если можно найти проблему с ним, поскольку я уверен там некоторое условие, о котором я не думал.

Также я не уверен, работает ли это на прямоугольник, который охватывает концы полушарий, поскольку уравнение расстояния могло бы потерпеть неудачу.

public string Test(double cLat,
    double cLon,
    double cRadius,
    double rlat1,
    double rlon1,
    double rlat2,
    double rlon2,
    double rlat3,
    double rlon3,
    double rlat4,
    double rlon4)
{
    double d1 = Calc(cLat, cLon, rlat1, rlon1);
    double d2 = Calc(cLat, cLon, rlat2, rlon2);
    double d3 = Calc(cLat, cLon, rlat3, rlon3);
    double d4 = Calc(cLat, cLon, rlat4, rlon4);

    if (d1 <= cRadius ||
        d2 <= cRadius ||
        d3 <= cRadius ||
        d4 <= cRadius)
    {

        return "Circle and Rectangle intersect...";
    }

    double width = Calc(rlat1, rlon1, rlat2, rlon2);
    double height = Calc(rlat1, rlon1, rlat4, rlon4);

    if (d1 >= cRadius &&
        d2 >= cRadius &&
        d3 >= cRadius &&
        d4 >= cRadius &&
        width >= d1 &&
        width >= d2 &&
        width >= d3 &&
        width >= d4 &&
        height >= d1 &&
        height >= d2 &&
        height >= d3 &&
        height >= d4)
    {
        return "Circle is Inside of Rectangle!";
    }



    return "NO!";
}
1
ответ дан 5 December 2019 в 15:27
поделиться

предупреждение: это может быть хитро, если круги / "прямоугольники" охватывают значительные части сферы, например:

"прямоугольник": минута долго =-90deg, макс. долго = +90deg, минута lat = +70deg, макс. lat = +80deg

круг: центрируйтесь = lat = +85deg, долго = +160deg, радиус = 20 градусов (например, если точка A находится на круге, и точка C является центром круга, и точка O является центром сферы, то поверните AOC = 40 градусов).

Они пересекаются, но математика, вероятно, будет иметь несколько случаев для проверки пересечения/включения. Следующие моменты лежат на круге, описанном выше: P1 = (+ 65 градусов lat, +160deg долго), P2 = (+ 75 градусов lat,-20deg долго). 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+180deg, 360 градусов)-180deg. PANG(x) всегда между-180deg и +180deg, включительно (+180deg должен отобразиться на-180deg).

  • Для определения ограничительной рамки необходимо знать 4 числа, но существует небольшая проблема с долготой. LAT1 и LAT2 представляют широты ограничения (принимающий LAT1 <LAT2); там нет никакой неоднозначности. LONG1 и LONG2 представляют долготы ограничения интервала долготы, но это становится хитрым, и легче переписать этот интервал как центр и ширину с LONGM = центр того интервала и LONGW = ширина. ОБРАТИТЕ ВНИМАНИЕ, что всегда существует 2 возможности для интервалов долготы. Необходимо указать, какой из этих случаев это, включаете ли Вы или, исключая меридиан на 180 градусов, например, самый короткий интервал от-179deg до +177deg имеет LONGM = +179deg и LONGW = 4 градуса, но другой интервал от-179deg до +177deg имеет LONGM =-1deg и LONGW = 356 градусов. Если Вы наивно попытаетесь сделать "регулярные" сравнения с интервалом [-179 177], то Вы закончите тем, что использовали больший интервал, и это, вероятно, не, что Вы хотите. Как в стороне, укажите, что P, с широтой LATP и долгота LONGP, в ограничительной рамке, если оба из следующего верны:

    • LAT1 <= LATP и LATP <= LAT2 (что часть очевидна),
    • брюшной пресс (ОСТРАЯ БОЛЬ (LONGP-LONGM)) <LONGW/2

Круг пересекает ограничительную рамку, если ЛЮБОЙ из следующих моментов P в PTEST = объединение (PCORNER, УЧАСТОК ЗЕМЛИ, PLONG), как описано ниже, все не возвращают тот же результат для InsideCircle():

  • PCORNER = 4 угла ограничительной рамки
  • УЧАСТОК ЗЕМЛИ точек на сторонах ограничительной рамки (существуют или ни один или 2), которые совместно используют ту же широту как центр круга, если LATC между LAT1 и LAT2, в этом случае эти точки имеют широту LATC и долгота LONG1 и LONG2.
  • точки PLONG на сторонах ограничительной рамки (существуют или ни один или 2 или 4!), которые совместно используют ту же долготу как центр круга. Эти точки имеют ИЛИ долготу = LONGC ИЛИ ОСТРУЮ БОЛЬ долготы (LONGC-180). Если брюшной пресс (ОСТРАЯ БОЛЬ (LONGC-LONGM)) <LONGW/2 затем LONGC является допустимой долготой. Если брюшной пресс (ОСТРАЯ БОЛЬ (LONGC-180-LONGM)) <LONGW/2 затем ПРИЧИНЯЮТ (LONGC-180) острую боль, допустимая долгота. Или или оба или ни одна из этих долгот могут быть в интервале долготы ограничительной рамки. Выберите точки PLONG с допустимыми долготами и широты LAT1 и LAT2.

Этот УЧАСТОК ЗЕМЛИ точек и PLONG, как упомянуто выше являются точками на ограничительной рамке, которые являются "самыми близкими" к кругу (если углы не; я использую "самый близкий" в кавычках, в смысле lat/long расстояния и не большого кругового расстояния), и покройте случаи, где центр круга находится на одной стороне границы ограничительной рамки, но указывает на круговом "подхалиме через" границу ограничительной рамки.

Если все точки P в возврате PTEST InsideCircle(P) == +1 (вся внутренняя часть круг) затем круг содержит ограничительную рамку в целом.

Если все точки P в возврате PTEST InsideCircle(P) ==-1 (вся внешняя сторона круг) затем круг содержится полностью в ограничительной рамке.

Иначе существует по крайней мере одна точка пересечения между кругом и ограничительной рамкой. Обратите внимание, что это не вычисляет, где те точки, хотя при взятии каких-либо 2 точек P1 и P2 в PTEST, где InsideCircle (P1) =-InsideCircle(P2), затем Вы могли найти точку пересечения (неэффективно) делением пополам. (Если InsideCircle (P) возвращается 0 затем, у Вас есть точка пересечения, хотя равенству в математике с плавающей точкой нельзя обычно доверять.)

Существует, вероятно, более эффективный способ сделать это, но вышеупомянутое должно работать.

3
ответ дан 5 December 2019 в 15:27
поделиться
-1
ответ дан 5 December 2019 в 15:27
поделиться

Еще одна попытка в этом...

Я думаю, что решение состоит в том, чтобы протестировать ряд точек, как Jason S предположил, но я не соглашаюсь с его выбором точек, которые я думаю, является математически неправильным.

Необходимо найти точки на сторонах lat/long поля, где расстояние до центра круга является локальным минимумом или максимумом. Добавьте те точки к набору углов, и затем алгоритм выше должен быть корректным.

Т.е., позволяя долготе быть x размером и широтой быть y размером, позвольте каждой стороне поля быть параметрической кривой P (t) = P0 + t (P1-P0) для o <= t <= 1.0, где P0 и P1 являются двумя смежными углами.

Позвольте f (P) = f (P.x, P.y) быть расстоянием от центра круга.

Затем f (P0 + t (P1-P0)) функция расстояния t: g (t). Найдите все точки, где производная функции расстояния является нулем: g' (t) == 0. (Отбрасывание решений, возросших домен 0 <= t <= 1.0, конечно)

К сожалению, это должно найти нуль трансцендентального выражения, таким образом, нет никакого закрытого решения для формы. Этот тип уравнения может только решенный повторением Ньютона-Raphson.

Хорошо, я понимаю, что Вы хотели код, не математику. Но математика - все, что я имею.

1
ответ дан 5 December 2019 в 15:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: