Определить, пересекаются ли два сектора данного круга? - PullRequest
1 голос
/ 25 августа 2010

Кто-нибудь знает, как определить, пересекаются ли два сектора одного круга?

Допустим, у меня есть сектор A, выраженный начальными и конечными углами A1 и A2, и сектор B, выраженный начальным угломB1 и конечный угол B2.Все углы колеблются от 0, 2 * Пи радианы (или 0, 360 градусов).

Как определить, пересекается ли угол A с углом B?

Я пробовал вариант задачи с пересечением двух прямоугольников , например:

if(a1 <= b2 && a2 >= b1) {
    // the sectors intersect
} else {
    // the sectores doesn't intersect
}

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

Основная проблема заключается в создании направленного (на основе заголовка) приложения дополненной реальности.Сектор A является объектом, тогда как сектор B является окном просмотра.Углы получаются следующим образом:

A0 = bearing of the object
A1 = A0 - objectWidthInRadians
A2 = A0 + objectWidthInRadians

B0 = heading of the user (device)
B1 = B0 - viewportWidthInRadians
B2 = B0 + viewportWidthInRadians

Заранее спасибо.

1 Ответ

1 голос
/ 25 августа 2010

Что вас действительно волнует, так это то, что кратчайшая разница в подшипниках меньше диапазона столкновения:

// absolute difference in bearings gives the path staying within the 0..2*pi range
float oneWay = abs(A0 - B0);

// .. but this may not be the shortest, so try the other way around too
float otherWay = 2 * pi - oneWay;

if ( min(oneWay, otherWay) < (objectWidthInRadians + viewPortWidthInRadians) )
{
    // object is visible...
}

Обратите внимание, что ваше определение width немного странно (кажется, что оно действительно под углом), и вычисления, показанные для A1 и т. Д., Фактически не ограничиваются указанным диапазоном [0..2*pi] ...

...