JeuWeb - Crée ton jeu par navigateur

Version complète : Problème de calcule de distance
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Pages : 1 2
Hello tout le monde,

Sa fait un moment que je suis pas venu, la faute aux études.
Mais c'est les vacances et la vallée des larmes est de nouveau sur les rails !

Je viens avec un problème de calcule de distance entre 2 cases X/Y, un problème tout bête que je pensais résolut en utilisant cette formule:

hypot( X1-X2, Y1-Y2) = distance

En effet, cela fonctionne, sauf pour les cases en diagonales, qui me donnent des nombres à virgules.
Quelqu'un connait une solution ?

Merci d'avance de votre aide.
Code PHP :
<?php 
$distance
=intval(sqrt(pow($dest['x']-$depart['x'],2)+pow($dest['y']-$depart['y'],2)));
C'est des maths Wink
Calcul de la distance entre deux points dans un repère orthonormé!
J'ai déjà tenté cette formule, malheureusement elle me fait le même bug Smile

Merci quand même.
Ca dépend aussi du type de déplacements que tu considères.

Si ton personnage peut se déplacer dans 8 directions (incluant les diagonales), tu peux utiliser la formule donnée par atra27 :
distance = racine( (x2-x1)^2 + (y2-y1)^2 )

Si ton personnage ne peut se déplacer que dans 4 directions, tu peux utiliser une formule encore plus simple :
distance = abs(x2-x1) + abs(y2-y1)

Si ça ne répond pas à ta question, il faudrait la clarifier. Quel est le vrai problème dont tu parles ? Tu veux transformer un nombre à virgule en nombre entier ? Tu veux la partie entière supérieure ? La partie entière inférieure ? Tu as un exemple de ce que tu as et de ce que tu veux ?
Normal que tu aie des nombres a virgule en diagonale.
Si tu prend des carrés de coté 1, alors en horizontal vertical tu aura des multiples de 1! (logique)
Mais en diagonale, par exemple si tu prend un angle de 45° (le cas le plus simple), la distance pour 1 case de décalage est racine de 1 (chiffre a virgule donc!)

Mon seul conseil est d'arrondir ton résultat. J'utilise intval dans l'exemple mais a toi de voir quelle fonction tu souhaite utiliser...
(10-07-2010, 05:29 PM)Foxglove a écrit : [ -> ]Ca dépend aussi du type de déplacements que tu considères.

Si ton personnage peut se déplacer dans 8 directions (incluant les diagonales), tu peux utiliser la formule donnée par atra27 :
distance = racine( (x2-x1)^2 + (y2-y1)^2 )

Si ton personnage ne peut se déplacer que dans 4 directions, tu peux utiliser une formule encore plus simple :
distance = abs(x2-x1) + abs(y2-y1)

+1 avec une précision : dans un repère orthonormé (comme un échiquier quoi)

ta carte est comment ? si hexagonale, c'est autrement par exemple (même si je ne connais pas la formule par coeur)

de même précise la notion de "distance", parce que si tu entends distance = nombre minimum de mouvement pour arriver à tel endroit, il faut que tu donnes les règles de :

repère (échiquier, hexagonal, etc...)
déplacement (genre la diagonale est elle plus longue que l horizontale)
Voici un schéma du problème, les 4 en rouge sont bien sur les biug quand j'utilise cette formule:

Code PHP :
<?php 
$distance
=intval(sqrt(pow($dest['x']-$depart['x'],2)+pow($dest['y']-$depart['y'],2)));

En virant le intval on ce rend compte que sur cette case, la valeur est de 4,2 (et le reste).

Je sais pas trop par quel bout prendre ce problème, si quelqu'un connait connait la solution Smile

Merci d'avance.
Le résultat est tout à fait logique, cette case est plus loin que celle qui vaut 3 en plein milieu.

Comme dit plus haut, explique comment tu souhaite définir tes distances, parce que visiblement tu t'y prends mal.

Quels sont les mouvements permis ?
Citation :Quels sont les mouvements permis ?

Tous, tout simplement.

normalement, la case avec le 4 est un 3 puisque la diagonale la plus directe est a 3 case de 0.
Ok, c'est simple alors :

$distance=max($dest['x']-$depart['x'], $dest['y']-$depart['y']);

EDIT, c'est plutôt :

$distance=max(abs($dest['x']-$depart['x']), abs($dest['y']-$depart['y']));
Pages : 1 2