Quelqu'un sait comment déterminer si deux secteurs d'un même cercle se croisent? Disons que j'ai un secteur A, exprimé par les angles de début et de fin A1 et A2, et un secteur B, exprimé par l'angle initial B1 et l'angle final B2. Tous les angles vont de 0..2 * PI radians (ou 0..360 degrés). Comment déterminer si l'angle A croise l'angle B?Déterminer si deux secteurs d'un cercle donné se croisent?
J'ai essayé une variante du two rectangle intersection problem comme ce qui suit:
if(a1 <= b2 && a2 >= b1) {
// the sectors intersect
} else {
// the sectores doesn't intersect
}
Cette méthode est bien aussi longtemps que aucun secteur traverse le point 0 degrés. Mais si un secteur le traverse, le calcul devient incorrect.
Le problème sous-jacent consiste à créer une application de réalité augmentée directionnelle (basée sur le cap). Le secteur A est l'objet alors que le secteur B est la fenêtre. Les angles sont obtenus comme suit:
A0 = bearing of the object
A1 = A0 - objectWidthInRadians
A2 = A0 + objectWidthInRadians
B0 = heading of the user (device)
B1 = B0 - viewportWidthInRadians
B2 = B0 + viewportWidthInRadians
Merci d'avance.
Salut, J'ai essayé votre code, mais ne semble pas fonctionner pour ces valeurs de test (toutes les valeurs sont exprimées en degrés) roulement A0 = 337.5 rubrique B0 = 97.37 objectWidth = 72.86 vie wportWidth = 60 La plage de relèvement (A) est [337.5..37.5] alors que la plage de cap (B) est [97.37..170.23]. Il est clair que la plage de cap (B) ne chevauche pas le palier (A) mais que vous répondez ci-dessus. oneWay = 245.13, otherWay = 114.87, objectWidth + viewPortWidth = 132.86 – adib
@adib Les plages affichées ici sont calculées unidirectionnelles, c'est-à-dire '[titre, en-tête + largeur]', tandis que le code indiqué dans la question est bidirectionnel, «[heading-width, heading + width]». (C'est ce à quoi correspond ma note sur le demi-angle.) Dans le cas d'un aller simple, vous devrez diviser par deux la somme des largeurs utilisées pour tester les collisions. – walkytalky
merci pour l'explication (je pensais que votre réponse est pour la convention [heading, heading + width], donc j'ai changé mon code). Des tests bruts indiquent que votre formule semble fonctionner. Merci pour votre réponse aussi. – adib