views:

84

answers:

1

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  A: 

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

walkytalky
Hi,I've tried your code but doesn't seem to work for these test values (all values are in degrees) bearing A0=337.5 heading B0=97.37 objectWidth=72.86 viewportWidth=60The bearing (A) range is [337.5..37.5] whereas the heading (B) range is [97.37..170.23]. Clearly the heading range (B) doesn't overlap with the bearing (A) but you answer above passes it. oneWay=245.13, otherWay=114.87, objectWidth+viewPortWidth=132.86
adib
@adib The ranges you show here are calculated one-way, ie `[heading, heading+width]`, whereas the code shown in the question is two-way, `[heading-width, heading+width]`. (This is what my note about the half-angle relates to.) In the one-way case you'll need to halve the sum of widths used to test collisions.
walkytalky
@walkytalky - thanks for the explanation (I thought your answer is for the [heading,heading+width] convention, so I changed my code). Rough testing indicate that your formula seems to work. Thanks for your answer too.
adib