[Script] Angle entre objets

Répondre
Partager Rechercher
Une petite fonction déterminer un angle formé entre 2 objets en tenant compte de l'orientation de l'objet source.

Voir les commentaires du script pour plus de détails.

Code PHP:

////////////////////////////
//  Angle entre 2 objets  //
////////////////////////////
// Renvoi l'angle formé entre 2 objets.
// ENTREE : oSource : L'objet qui regarde oCible
//          oCible  : L'objet qui est regardé par oSource
//          bFacing : Si TRUE : tenir compte de l'orientation de oSource dans le résultat (GetFacing(oSource))
//          fAddFacing : si bFacing=TRUE, ajoute un angle de valeur fAddFacing à GetFacing(oSource) (avec : 0.0 <= fAddFacing < 360.0)
//          fAngleAbsolu : Angle absolu : bFacing=TRUE automatiquement, GetFacing(oSource)+fAddFacing ignorés.
//                                        Cela revient à indiquer que GetFacing(oSource)+fAddFacing = fAngleAbsolu
//      
// RETOUR : Angle entre les objets
//
// Remarque : Renvoi -1000.0 en cas d'erreur : oSource et/ou oCible=OBJECT_INVALID, oSource et oCible ne sont pas dans la même zone.
//            Si bFacing=TRUE,  renvoi un angle<0 si à droite de oSource, >0 si à gauche, 0 si devant, +/-180 si derrière
//            Si bFacing=FALSE, renvoi l'angle entre oSource et oCible par rapport à l'Est
//
//                                  (NORD=90)                                                (NORD=90)
// (A)=oSource qui regarde (x)        __|__                                                    _____
// (B)=oCible                     *     |     *                                            *           *
// (x)=GetFacing(oSource)      *        |        *                                      *  (x)   Angle    *
//     + fAddFacing          *     (x)  |          *  ...(B)                          *      \<------.      *  ..>(B)
// ou = fAngleAbsolu        *        \  |         ..*/    |                          *        \       \    ..*/
//  Angle = Resultat       *          \ |     .../   *    |Angle                    *          \       |../   *
//                        *            \| .../        *   |                        *            \  .../        *
//            (OUEST=180) *            (A)------------+-->|(EST=0)     (OUEST=180) *            (A)            +--> (EST=0)
//                        *                           *                            *                           *
//                         *      bFacing=FALSE      *                              *       bFacing=TRUE      *
//                          *   fAngleAbsolu=-1.0   *                                *           ou          *     Dans cet exemple l'angle renvoyé est <0 car (B) est à droite de (A)
//                           *                     *                                  *   fAngleAbsolu>=0.0 *      Exemples de valeurs renvoyées si bFacing=TRUE :
//                             *                 *                                      *                 *           Proche de   0  si (B) devant (A) ((B) situé sur l'axe (Ax))
//                                *   _____   *                                            *   _____   *                        -180 si (B) derrière (A) ((B) situé à l'opposé de l'axe (Ax))
//                                                                                                                              - 90 si (B) à droite de (A) ((AB) forme un angle de 90° avec (Ax))
//                                  (SUD=270)                                                (SUD=270)                          + 90 si (B) à gauche de (A) ((AB) forme un angle de 90° avec (Ax))
//                 Renvoi la valeur d'angle entre (A) et (B)              Renvoi l'angle entre la direction (x) que regarde (A)
//                             par rapport à l'Est                                       et la position de (B)
float AngleEntreObjets(object oSourceobject oCibleint bFacing=FALSEfloat fAddFacing=0.0float fAngleAbsolu=-1.0)
{
  if ((
oSource==OBJECT_INVALID) || (oCible==OBJECT_INVALID)) return -1000.0;
  if (
GetArea(oSource)!=GetArea(oCible)) return -1000.0;
  
float fResult;
  
vector vSourcevCible;
  
vSource=GetPosition(oSource); //Position de la source sur la map
  
vCible =GetPosition(oCible);  //Position de la cible  sur la map
  
fResult=VectorToAngle(vCible-vSource); //Angle entre 2 objets par rapport a l'Est
  
if (fAngleAbsolu>=0.0bFacing=TRUE//Ne pas tenir compte de bFacing et fAddFacing, mais de l'angle absolu
  
if (bFacing//Tenir compte de GetFacing(oSource)+fAddFacing ou de fAngleAbsolu ?
   
{//OUI
    
fAddFacing=GetFacing(oSource)+fAddFacing;
 if (
fAngleAbsolu>=0.0fAddFacing=fAngleAbsolu//Ignore GetFacing(oSource)+fAddFacing au profit de fAngleAbsolu
 
while (fAddFacing>360.0fAddFacing=fAddFacing-360.0//Si l'angle >360°, normalise l'angle pour que 0°<=Angle<=360°
 
fResult=fResult-fAddFacing;
    if (
fResult>180.0fResult=fResult-360.0//Renvoi un angle<0 si a droite de oSource, >0 si a gauche, 0 si devant, +/-180 si derriere
   
}
  return 
fResult;
}
//Fin Angle entre 2 objets 
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés