GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: chneubeul le 27 Janvier 2010, 15:39:38

Titre: [Résolu] Convertir une distance (X1, Y1, Z1) (X2,Y2,Z2) en métre
Posté par: chneubeul le 27 Janvier 2010, 15:39:38
Salut, :) Alors voila j'aimerais savoir comment convertir les valeurs X, Y Z, donc par exemple la distance en X1 et X2, sa je sais faire ^^ et le mettre en mètre sa je connais pas :)

Donc pour ce qui veulent savoir la distance c'est V((X1-X2)²+(Y1-Y2)²). Le V est racine carré ^^ et le ² ben carré ^^ Vous allez me dire pourquoi une racine au carré mais sa sera utile pour simplifier les calcules sans faire d'identités ^^ Donc cette forule est avec X, Y, Z mais suffit de rajouter le Z et de suivre l'exemple, donc c'est pareil quoi :)

Donc j'ai fais des tests, avec deux positions que j'ai pris, j'ai fais un peu pret 1m dans le jeux et dans mon calcul j'ai trouver 0.97, donc sa se rapproche, donc j'en conclu, que la distance X, Y, Z est en mètre :)

Donc voici pour ce qui veulent le calculer en pawno :)
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
GetPlayerPos(p1,x1,y1,z1);
GetPlayerPos(p2,x2,y2,z2);
floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));

Biensur le code est simplifier a vous d'en faire ce que vous voulez :) c'est pour sa que j'ai laisser le calcul comme sa ^^

Merci à vous =D
A+, Sam  :cheers
Titre: Re : [Résolu] Convertir une distance (X1, Y1, Z1) (X2,Y2,Z2) en métre
Posté par: S!m le 29 Janvier 2010, 03:35:21
Salut,

simple petite remarque:

dans le trois quart des cas, la distance entre deux points n'est pas vraiment la donnée recherchée, il s'agit plutôt de savoir si ces point sont à porté l'un de l'autre.
En faisant de simples opérations mathématique on arrive à simplifier grandement le calcul:

Citer
racine_carrée(X² + Y² + Z²) = distance
X² + Y² + Z² = distance²

en code:
IsPlayerInReachOfPlayer(p1, p2, Float:distance)//fonction hypothétique
{
new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
GetPlayerPos(p1,x1,y1,z1);
GetPlayerPos(p2,x2,y2,z2);
return (floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2)) <= distance);
}
cette fonction fait ce que l'on attend d'elle, mais il est possible de rendre le code plus simple et plus rapide
NB. les fonctions floatpower, floatsub etc... ne sont pas vraiment avantageuses côté vitesse dans ce genre de cas
IsPlayerInReachOfPlayer(p1, p2, Float:distance)//fonction hypothétique
{
    new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
    GetPlayerPos(p1,x1,y1,z1);
    GetPlayerPos(p2,x2,y2,z2);
    x1 -= x2;//permet d'éviter de calculer 2 fois
    y1 -= y2;
    z1 -= z2;
    return ((x1 * x1 + y1 * y1 + z1 * z1) <= (distance * distance));//on évite les fonctions et surtout la racine carrée
}

Sinon, dans le cas où l'on as deux points:

//native PointToPoint(Float:X1, Float:Y1, Float:Z1, Float:X2, Float:Y2, Float:Z2, Float:Distance);
#define PointToPoint(%0,%1,%2,%3,%4,%5,%6) (((%0 - %3) * (%0 - %3) + (%1 - %4) * (%1 - %4) + (%2 - %5) * (%2 - %5)) <= (%6 * %6))

ps. le native ce n'est que pour montrer la forme de la fonction

et pour les moments où la distance est nécessaire, il est préférable d'utiliser une fonction de cette forme:

PlayerRangeToPoint(playerid, Float:X, Float:Y, Float:Z)
{
    new Float:pX, Float:pY, Float:pZ;
    GetPlayerPos(playerid, pX, pY, pZ);
    X -= pX;
    Y -= pY;
    Z -= pZ;
    return floatsqroot(X * X + Y * Y + Z * Z);
}

voilà, j'espère que ça servira

++Sim++
Titre: Re : [Résolu] Convertir une distance (X1, Y1, Z1) (X2,Y2,Z2) en métre
Posté par: chneubeul le 29 Janvier 2010, 22:18:12
Soir', oui sa m'a éclairais un peu mais le truc c'est que moi j'veut faire c'est un timer qui va tourner en boucle et va enregister la position du joueur et 100ms plus tard il recalcule la position et ajoute la difference en metre dans une variable et sa l'affiche au joueur pour qu'il sais la distance parcourue :)

Donc voila j'ai eu l'idée de faire

new Float:cal1 = floatsqroot((x2-x1)*(x2-x1));
new Float:cal2 = floatsqroot((y2-y1)*(y2-y1));
new Float:cal3 = floatsqroot((z2-z1)*(z2-z1));
new Float:kilo = cal1 + cal2 + cal3;


Aprés test :

La variable m'affiche : 1318926965 ^^

Sam,
 :cheers