1
votes

Anybody know how to determine whether two sectors of the same circle intersect?

Let's say I have a sector A, expressed by starting and ending angles A1 and A2, and a sector B, expressed by starting angle B1 and ending angle B2. All angles ranges from 0..2*PI radians (or 0..360 degrees).

How to determine whether angle A intersects with angle B?

I've tried a variation of the two rectangle intersection problem like the following:

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

This method is fine as long as no sectors crosses the 0 degrees point. But if any one sector crosses it, the calculation becomes incorrect.

The underlying problem is in creating a directional (heading-based) augmented reality application. Sector A is the object whereas Sector B is the viewport. The angles are obtained as follow:

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

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

Thanks in advance.

1

1 Answers

1
votes

What you really care about is whether the shortest difference in bearings is smaller than the collision range:

// 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...
}

Note that your width definition is a bit odd (seems to be really the half-angle), and the calculations shown for A1 etc do not actually clip into the stated [0..2*pi] range...