Calcule d'un paramètre à partir d'autre paramètres

Réponses à toutes vos questions de la 2nde à la Terminale toutes séries
Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

Calcule d'un paramètre à partir d'autre paramètres

par Neox76 » 19 Juin 2013, 11:12

Bonjour à tous.

Je ne sais pas vraiment ou devrais-je poster ce topic, c'est plutôt adapté à une parti du genre "calcules", mais je n'ai rien trouvé du genre :)

Je programme sur un jeu un 2D qui est libre de source (donc le jeu n'est pas le miens) et quelque par dans ces codes... il y'a une formule pour calculer la position d'un projectile, certains projectile ont des courbures.
J'ai créé des bots dans le serveur que j'ai programmé moi même, les bots (pour ceux qui ne le savent pas) ont une intelligence artificielle écrite par le programmeur (donc dans ce cas, par moi). Ils ne font qu'exécuter ce qui est écrit dans les codes, donc ils ne peuvent pas faire ce qui n'est pas écrit.

Mon problème : ces bots aussi utilise des armes, si la courbure est de 0 pour l'arme en question, il n'y a aucun problème car c'est une ligne droite, donc la position cible du bot sera la position du joueur (puisque c'est une ligne droite).
Mais quand il y'a une courbure... ça se complique. Si il y'a une courbure et que je donne en paramètre au bot la position du joueur le plus proche, il va tirer, mais le projectile ne va pas aller tout droit, de ce fait le bot ne touche pas le joueur !

Pour ceux qui maîtrisent un peu la programmation, il existe des objets "vec2" pour définir une position (donc un vec2 contient un float en x et un float en y).
Si la courbure est de 0, la direction du projectile sera la position du joueur. Par exemple :
Code: Tout sélectionner
vec2 Direction = pChar->m_Pos;
avec pChar qui représente le joueur le plus proche.

Pour ce qui est des courbures, les programmeurs du jeu ont déjà écrit la formule pour "faire bouger" la projectile, voici le code :
Code: Tout sélectionner
vec2 CalcPos(vec2 Pos, vec2 Velocity, float Curvature, float Speed, float Time)
{
   vec2 n;
   Time *= Speed;
   n.x = Pos.x + Velocity.x*Time;
   n.y = Pos.y + Velocity.y*Time + Curvature/10000*(Time*Time);
   return n;
}


Ce qui se traduit par :
On déclare un objet de type vec2 (position) appelé n.
On multiplie le temps donné en argument de la fonction par la vitesse
La position x de n sera "la position x de Pos qui est donné en argument de la fonction + la vélocité donné en argument de la fonction * le temps donné en argument de la fonction". (Les règles de mathématiques sont respectées dans les codes, donc les multiplications sont effectués avant les additions, tout comme les divisions.)
La position y de n sera "la position y de Pos + la vélocité * le temps + la courbure / 10 000 * le temps au carré.

Ce que j'ai besoin d'obtenir, c'est ce fameux temps. Je peux obtenir facilement la position (c'est la position du projectile), la vélocité et la vitesse, mais pas le temps. Donc il me faudrait (je ne sais absolument pas comment, c'est d'ailleurs pour ça que je viens poster ici...) un calcule, un moyen d'obtenir ce fameux temps.

Le temps qui est donné en argument de cette fonction, c'est la différence entre le moment actuel et le moment le projectile a été tiré.

Petite information : j'ai bel et bien essayé de résoudre ce problème avant de poster ici, mais c'est un peu... un peu trop compliqué :)

Merci d'avance !!



Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 19 Juin 2013, 11:39

Bonjour,
Avez-vous été voir tout ce que vous avez sur la fonction time(time_t *timer) ?
Ce qui m'étonne un peu est que la variable Time soit en float.

Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 19 Juin 2013, 12:07

Time n'est pas l'heur, c'est le moment qui est défini dans le jeu lui même, avec des "tick" (1 seconde = 50 ticks).

Un petit exemple de l'utilisation de cette fonction (ces lignes existent vraiment dans la version officielle du jeu) :
Nous sommes dans la fonction tick d'un projectile (qui est donc appelé 50 fois par seconde),
Code: Tout sélectionner
   float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed();
   float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed();
   vec2 PrevPos = GetPos(Pt);
   vec2 CurPos = GetPos(Ct);
   bool Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, &CurPos, 0);
   CCharacter *OwnerChar = GameServer()->GetPlayerChar(m_Owner);
   CCharacter *TargetChr = GameServer()->m_World.IntersectCharacter(PrevPos, CurPos, 6.0f, CurPos, OwnerChar);

(les trois dernières lignes sont inutiles pour vous, c'est juste pour vous montrer comment ils sont utilisées)

Ici, les fonctions appelent GetPos avec Pt et Ct en argument (qui sont les temps).
Et voici la fonction GetPos :
Code: Tout sélectionner
vec2 CProjectile::GetPos(float Time)
{
   float Curvature = 0;
   float Speed = 0;

   switch(m_Type)
   {
      case WEAPON_GRENADE:
         Curvature = GameServer()->Tuning()->m_GrenadeCurvature;
         Speed = GameServer()->Tuning()->m_GrenadeSpeed;
         break;

      case WEAPON_SHOTGUN:
         Curvature = GameServer()->Tuning()->m_ShotgunCurvature;
         Speed = GameServer()->Tuning()->m_ShotgunSpeed;
         break;

      case WEAPON_GUN:
         Curvature = GameServer()->Tuning()->m_GunCurvature;
         Speed = GameServer()->Tuning()->m_GunSpeed;
         break;
   }

   return CalcPos(m_Pos, m_Direction, Curvature, Speed, Time);
}


Cette fonction appel la fonction CalcPos dont je vous ai déjà parlé. (celle dont je cherche à calculer le temps à partie des paramètres déjà existants)

Petite info : Pt signifie PreviousTime, qui signifie Temps précédent, Ct signifie CurrentTime, qui signifie Temps actuel.
Server()->TickSpeed() return toujours 50 (donc vous pouvez remplacer ça par 50).
Server()->Tick() c'est le nombre de ticks écoulé depuis le lancement du serveur
m_StartTick est constant, c'est le tick obtenu par Server()->Tick() à la création du projectile

Donc par exemple, Server()->Tick() / Server()->TickSpeed() donne le nombre de secondes écoulées depuis le lancement du serveur.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 19 Juin 2013, 12:49

Time, c'est une durée, une date (ie un instant), une constante, une variable ordinaire, une variable aléatoire ou quoi d'autre ?
Quand vous dites que vous voulez
Ce que j'ai besoin d'obtenir, c'est ce fameux temps.
, c'est récupérer sa valeur au retour de la fonction, si c'est ça votre question, il suffit de mettre & devant le nom la variable dans le prototype, c'est à dire que cette variable ne sera pas passée par sa valeur, mais par son adresse. Donc l’exécution de la fonction modifiera sa valeur. Est-ce bien souhaitable ?

Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 19 Juin 2013, 13:41

Dlzlogic a écrit:Time, c'est une durée, une date (ie un instant), une constante, une variable ordinaire, une variable aléatoire ou quoi d'autre ?
Quand vous dites que vous voulez , c'est récupérer sa valeur au retour de la fonction, si c'est ça votre question, il suffit de mettre & devant le nom la variable dans le prototype, c'est à dire que cette variable ne sera pas passée par sa valeur, mais par son adresse. Donc l’exécution de la fonction modifiera sa valeur. Est-ce bien souhaitable ?


Time, est une constante (car il n'est pas modifié à partir du moment ou on le donne en argument).

Ce que j'ai besoins, c'est un moyen (qui est assez compliqué d'ailleurs) en utilisant les paramètres à ma disposition, de calculer Time.
Un truc du style : Time = x + a * b / c; (un calcule de ce style), c'est enfaite le temps nécessaire au projectile pour atteindre sa cible qu'il me faut.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 19 Juin 2013, 13:48

Donc, étant donné
n.x = Pos.x + Velocity.x*Time;
n.y = Pos.y + Velocity.y*Time + Curvature/10000*(Time*Time);

trouver la valeur Time=f(Pos, Velocity, Curvature)
C'est ça ?

Neox76
Membre Naturel
Messages: 21
Enregistré le: 03 Juin 2013, 17:31

par Neox76 » 19 Juin 2013, 14:03

Dlzlogic a écrit:trouver la valeur Time=f(Pos, Velocity, Curvature)


Je ne comprends pas vraiment, que représente f exactement ?

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 19 Juin 2013, 14:28

Un truc du style : Time = x + a * b / c; (un calcule de ce style), c'est enfaite le temps nécessaire au projectile pour atteindre sa cible qu'il me faut.
Alors Time = f(a,b,c,x)
Avec votre fonction, on peut écrire T²=(Y-X)/C (au facteur 10000 près.)
Mais, dans votre fonction, vous avez Time qui est passé en paramètre, donc vous le connaissez.
Donc, je ne comprends toujours pas ce que vous voulez.
Si c'est "calculer Time avant l'appel de la fonction CalcPos pour atteindre votre cible", alors c'est impossible, puisque le dy est égal au dx + quelque-chose.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 19 Juin 2013, 19:19

slt,

Comment sais-tu qu'il y a collision?
qu'est-ce qui varie comme paramètre entre le lancement et la collision?
m_Direction, Curvature, Speed sont constante?
la vie est une fête :)

 

Retourner vers ✎✎ Lycée

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 59 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite