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.
//////////////////////////// // 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 oSource, object oCible, int bFacing=FALSE, float fAddFacing=0.0, float fAngleAbsolu=-1.0) { if ((oSource==OBJECT_INVALID) || (oCible==OBJECT_INVALID)) return -1000.0; if (GetArea(oSource)!=GetArea(oCible)) return -1000.0; float fResult; vector vSource, vCible; 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.0) bFacing=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.0) fAddFacing=fAngleAbsolu; //Ignore GetFacing(oSource)+fAddFacing au profit de fAngleAbsolu while (fAddFacing>360.0) fAddFacing=fAddFacing-360.0; //Si l'angle >360°, normalise l'angle pour que 0°<=Angle<=360° fResult=fResult-fAddFacing; if (fResult>180.0) fResult=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
|