2010-08-25 9 views
1

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

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

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

Я попытался вариацию two rectangle intersection problem как следующее:

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

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

// 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] диапазон ...

+0

Привет, Я попробовал ваш код, но не похоже на работу для этих тестовых значений (все значения в градусах) подшипник A0 = 337,5 заголовок B0 = 97.37 objectWidth = 72.86 vie wportWidth = 60 Диапазон подшипников (A) равен [337.5..37.5], тогда как диапазон заголовка (B) равен [97.37..170.23]. Очевидно, что диапазон заголовков (B) не перекрывается с подшипником (A), но вы отвечаете выше, передает его. oneWay = 245.13, otherWay = 114.87, objectWidth + viewPortWidth = 132.86 – adib

+0

@adib Диапазоны, которые вы показываете здесь, вычисляются в одностороннем порядке, т.е. '[заголовок, заголовок + ширина]', тогда как код, показанный в вопросе, является двусторонним, '[ширина заголовка, заголовок + ширина]'. (Это то, к чему относится моя заметка о полууголе.) В одностороннем случае вам нужно вдвое уменьшить сумму, используемую для проверки столкновений. – walkytalky

+0

спасибо за объяснение (я думал, что ваш ответ для соглашения [заголовок, заголовок + ширина], поэтому я изменил свой код). Грубые проверки показывают, что ваша формула работает. Спасибо за ваш ответ. – adib