|
Nainwak's World Combattez des nains de jardins !
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
dJu77 Nain(e) au biberon
Inscrit le: 26 Mai 2004 Messages: 4
|
Posté le: Jeu 03 Juin, 2004 11:39 Sujet du message: Problème de calcul des distances : une SOLUTION.... |
|
|
'lut à tous,
Dites, un pote m'a dit que vous cherchiez peut-être une solution au problème de calcul de distance (les diagonales qui affichent une distance de 3 au lieu de 2 par exemple).
J'y ai réfléchi et j'ai pondu un alogrithme...
La clé du truc, c'est la fonction récursive (fonction qui s'appelle elle-même).
Je ne sais pas si c'est ce que vous cherchez, je ne sais pas si c'est viable question performance, mais c'est une solution qui donne un résultat correct, en quelques lignes de code...
=> Au cas où ca vous intéresse...
voici le résultat
*****************
calculateDistance(int iXCurrent, int iYCurrent, int iXDestination, int iYDestination)
o.calculateDistance(11,4,10,3)=1
o.calculateDistance(11,4,9,2)=2
o.calculateDistance(11,4,8,1)=3
o.calculateDistance(11,4,12,5)=1
o.calculateDistance(11,4,13,6)=2
o.calculateDistance(11,4,11,5)=1
o.calculateDistance(11,4,10,4)=1
o.calculateDistance(11,4,9,5)=2
Et voici le code source (language Java)
***************************************
package testmain;
public class MyMain
{
public static void main(String[] args)
{
MyMain o = new MyMain();
System.err.println("o.calculateDistance(11,4,10,3)="+o.calculateDistance(11,4,10,3));
System.err.println("o.calculateDistance(11,4,9,2)="+o.calculateDistance(11,4,9,2));
System.err.println("o.calculateDistance(11,4,8,1)="+o.calculateDistance(11,4,8,1));
System.err.println("o.calculateDistance(11,4,12,5)="+o.calculateDistance(11,4,12,5));
System.err.println("o.calculateDistance(11,4,13,6)="+o.calculateDistance(11,4,13,6));
System.err.println("o.calculateDistance(11,4,11,5)="+o.calculateDistance(11,4,11,5));
System.err.println("o.calculateDistance(11,4,10,4)="+o.calculateDistance(11,4,10,4));
System.err.println("o.calculateDistance(11,4,9,5)="+o.calculateDistance(11,4,9,5));
}
public int calculateDistance(int iXCurrent, int iYCurrent, int iXDestination, int iYDestination)
{
int iXDiff = iXCurrent - iXDestination;
int iYDiff = iYCurrent - iYDestination;
int iXNbToAdd, iYNbToAdd;
if(iXDiff == 0 && iYDiff == 0)
{
return 0;
}
if(iXDiff == 0)
{
iXNbToAdd = 0;
}
else if(Math.abs(iXDiff) == iXDiff)
{
iXNbToAdd = -1;
}
else
{
iXNbToAdd = 1;
}
if(iYDiff == 0)
{
iYNbToAdd = 0;
}
else if(Math.abs(iYDiff) == iYDiff)
{
iYNbToAdd = -1;
}
else
{
iYNbToAdd = 1;
}
return 1 + calculateDistance(iXCurrent + iXNbToAdd, iYCurrent + iYNbToAdd, iXDestination, iYDestination);
}
}
Ca m'étonne que personne y ait pensé avant.
Ca m'a pris 20 minutes pour y penser, 20 minutes pour le faire et 20 minutes pour le tester...
=> Je suppose que, si ce problème traine, c'est que :
a. la solution existe mais pose des problèmes de perf...
b. personne n'a encore eu le temps ou l'envie de chercher...
Dans le cas a, mon post n'y changera pas grand chose, désolé.
Dans le cas b, ceci peut toujours servir
A+,
dJu. |
|
Revenir en haut de page |
|
|
[GND]Arwall Généralement désarmant
Inscrit le: 22 Mai 2002 Messages: 6702
|
Posté le: Jeu 03 Juin, 2004 11:59 Sujet du message: |
|
|
Non c'est qu'a part les joueurs pointilleux ca gene absolument rien dans le jeu ...
|
|
Revenir en haut de page |
|
|
Haiken L'idole des naines, le Zorro des pubs
Inscrit le: 06 Mai 2002 Messages: 2495
|
Posté le: Jeu 03 Juin, 2004 12:09 Sujet du message: |
|
|
ta fonction c'est max (abs(iXCurrent-iXDestination), abs(iYCurrent-iYDestination)) en fait ?
il n'y a pas de problème de calcul de distances.
c'est juste qu'il y a deux distances :
- la distance de déplacement
- la distance de vision (= portée des armes)
c'est comme sur la carte michelin ,il y a la distance à vol d'oiseau et en passant par la route |
|
Revenir en haut de page |
|
|
Skipp modère plus blanc que blanc...
Inscrit le: 24 Mai 2002 Messages: 4592 Localisation: [~]-World
|
Posté le: Jeu 03 Juin, 2004 12:10 Sujet du message: |
|
|
Haiken a écrit: | c'est comme sur la carte michelin ,il y a la distance à vol d'oiseau et en passant par la route |
Et la distance quand tu te paumes parce que c'est mal indiqué |
|
Revenir en haut de page |
|
|
Taozou Nain-stallé(e)
Inscrit le: 09 Jan 2004 Messages: 283
|
Posté le: Jeu 03 Juin, 2004 12:25 Sujet du message: |
|
|
Ok... mais quand il n'y a que 2 en diagonale, on devrait pouvoir tirer au Desert Eagle (par exemple), le pb est que dans la détect le nain est à 3... Donc pas d'option attaquer
C pas question d'être pointilleux.
C juste... dommage. |
|
Revenir en haut de page |
|
|
dJu77 Nain(e) au biberon
Inscrit le: 26 Mai 2004 Messages: 4
|
Posté le: Jeu 03 Juin, 2004 12:41 Sujet du message: |
|
|
Haiken a écrit: | ta fonction c'est max (abs(iXCurrent-iXDestination), abs(iYCurrent-iYDestination)) en fait ? |
Heu.... Ptet bien oui...
J'ai pas vérifié, mais je pense bien....
Désolé...
Et, pour ce qui est de :
Haiken a écrit: | c'est juste qu'il y a deux distances :
- la distance de déplacement
- la distance de vision (= portée des armes)
|
Je ne savais pas que c'était fait exprès... |
|
Revenir en haut de page |
|
|
hubs Nain-stallé(e)
Inscrit le: 21 Fév 2003 Messages: 257
|
Posté le: Jeu 03 Juin, 2004 12:43 Sujet du message: |
|
|
Tiens je pensais que ca aurait ete corrige dans la nouvelle mouture |
|
Revenir en haut de page |
|
|
kriska Nain-stallé(e)
Inscrit le: 31 Aoû 2003 Messages: 294
|
Posté le: Jeu 03 Juin, 2004 13:04 Sujet du message: |
|
|
pourquoi corriger quelque chose de logique et déja éxpliqué dans un ancien post (que je n'ai hélas pas pu trouver)...
en arrondissant avec pythagore on voit bien que la distance de deux cases en diagonales est équivalent à rac( 8 ) ~= 3
ce qui est tout à fait logique!
no problem 8)
-edit-
Merci Haiken (réponse plus bas)
c'est bien de ce post dont je parlais!!!
Dernière édition par kriska le Jeu 03 Juin, 2004 13:15; édité 1 fois |
|
Revenir en haut de page |
|
|
Haiken L'idole des naines, le Zorro des pubs
Inscrit le: 06 Mai 2002 Messages: 2495
|
Posté le: Jeu 03 Juin, 2004 13:05 Sujet du message: |
|
|
Taozou a écrit: | Ok... mais quand il n'y a que 2 en diagonale, on devrait pouvoir tirer au Desert Eagle (par exemple), le pb est que dans la détect le nain est à 3... Donc pas d'option attaquer
C pas question d'être pointilleux.
C juste... dommage. |
2 cases de déplacement en diagonale, ça fait 2 fois racine(2) soit environ 2,88 ==> arrondi à 3
C'est donc normal que tu ne puisses tirer...
Ou alors c'est que j'ai pas compris le problème
Edit : arf grillé par kiska
Edit : le post dont kriska fait mention : http://vieuxforum.nainwak.com/viewtopic.php?t=2131 |
|
Revenir en haut de page |
|
|
|
|
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum
|
|