1

Ce problème peut parraitre simple (il l'est peut-être d'ailleurs), mais je veux éviter tant que possible les algo barbare. Sans aide, j'aurais implémenté quelque chose de gros et lent, qui aurait certainement marché, mais si il existe une solution plus subtile elle est évidement préferable.

Lisez le texte en même temps que vous regardez ce shémas, l'explication devrait alors parraitre claire smile


L'objet A (Obj. A) se déplace dans un espace très vaste, mais il ne peut aller que dans 8 directions. Il peut également tirer dans une de ces 8 directions.

Les problèmes sont les suivants :

- Comment savoir que l'objet C (Obj. C) est atteignable directement sans aucun déplacement (il est dans un couloir assez étroit de largeur L pixels, donc en tirant en haut à gauche on peut le toucher) ?

- À l'inverse, comment savoir que l'objet B (Obj. B) n'est pas directement touchable, et que la solution la plus judicieuse serait de se déplacer un peu vers la droite, jusqu'à ce qu'on puisse l'avoir en tirant vers le haut (bien que la solution "se déplacer vers le haut puis tirer en haut à droite" soit également parfaitement valide) ?

Voilà smile

[edit] : J'oubliais de préciser un truc : On connait bien sûr les positions X et Y de l'objet A, et les positions X et Y d'un autre objet (un seul), le but étant de l'atteindre lui, et lui seul.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

2

Sans bcp reflechir,; je dirais que tu peux calculer la distance de ton objet C ou B aux différentes droites de déplacement (les 4). Si tu trouve une distance < L/2, tu peux tirer.

Sinon, tu regardes la distance la plus petite, tu te déplaces perpendiculairement, dans la direction de ton objet, jusqu'à ce que tu puisses tirer.
Cours et tutos Asm: http://membres.lycos.fr/sirryl

3

Pas bête, mais calculer la distance point / droite sans faire de division je sais pas comment on fait.

J'ai trouvé une méthode qui marche plus ou moins ([url=http://perso.wanadoo.fr/variable/Images/Screenshots/Ti/Detection8.gif ]cf screenshot[/url]) :
// x et y sont les coordonnées de l'objet qui doit tirer
// a et b sont les coordonnées de l'objet à tester
// L est la largeur des 4 bandes


c = ((x > a) ? x - a : a - x);
d = ((y > b) ? y - b : b - y);
e = ((c > d) ? c - d : d - c);

m = (x > a) ^ (y > b);

if (c < L) ... // L'objet est sur la droite verticale
else if (d < L) ... // L'objet est sur la droite horizontale
else if (m && e < L) ... // L'objet est sur la droite oblique 1
else if (!m && e < L) .. // L'objet est sur la droite oblique 2


[Edit] : Explication du screenshot :
Une zone de 40*40 pixels autours de l'objet central est scannée, et seuls sont affichés les pixels qui sont sur une des 4 droites (je fais varier leur épaisseur et j'en désactive quelques unes au cours du prog pour monter qu'elles sont indépendantes)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

Vertyos
a écrit : Pas bête, mais calculer la distance point / droite sans faire de division je sais pas comment on fait.

Donc tu fais une division. Je ne vois pas le problème.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

Un petit produit scalaire peut faire l'affaire non ?
Ça te ferait 1 addition et 2 multiplications.
Mais tu fais comment là sinon ?

6

Kevin Kofler
a écrit : Donc tu fais une division. Je ne vois pas le problème.

Moi si : je programme un jeu. Et pas un Ti-Chess.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

Mais tous les calculs ne se font pas avec de seules additions et multiplications! Il faudra se plier au fait qu'une division peut être nécessaire.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

Bah autant les éviter tant que c'est possible smile

9

Mais si ca ne l'est pas... tous les jeux ne sont pas programmés qu'en multiplication ou en addition. A mon avis, prend cette methode, et reflechit après, par ce que ca vaut le coup: elle est pas difficile à implémentée. Mais tu peux te servir sans doute des spécificités de tes directions: haut et gauche, pas de pb, mais faut voir après pour les diagonales. Fais un petit calc (j'en ferais un ce soir un peu plus tard)
Cours et tutos Asm: http://membres.lycos.fr/sirryl

10

Je viens d'implémenter ma méthode dans le jeu, ça marche impec smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

11

J'ai regardé ta methode, mais elle ne 'a pas l'air d'être très rigoureuse, mais sur 2 points seulement:
1. je remplacerais L par L/2 dans les deux premiers cas.
2. je remplacerais L par L/(rac(2)) dans les deux autres.

Sinon c'est bon! (du moins on dirait! smile)
pour L/rac(2), on peut utiliser 1/rac(2) = 181/256 (0.01cheeky, ou 45/64 (0.56cheeky
Cours et tutos Asm: http://membres.lycos.fr/sirryl

12

perso:
je prend pour origine du repère la cible noté R1.
pour savoir si l'objet est au dessus, je regarde les coordonnées du missile dans R1
si x positif, alors au dessus, sinon au dessous
pour droite gauche, si y positif droite, sinon gauche.

bon maintenant on sait dans quel quart il est.
pour savoir dans quel seizieme il est rien de plus simpe.. une simple comparaison suffit.
Exemple:
(Xm,Ym) coordonnée du missile dans R1
si Xm>Ym, dans le seizieme le plus a l'extreme (gauche ou droite).

bon maintenant rien de plus simple pour le deplacement..
on sais dans quel quart il est... donc..
si Xm>Ym deux possibilité
>>translation de vecteur x jusqua ce que Xm=Ym (donc de Xm-Ym pxl) pour l'avoir avec la diagonale
>> tanslation de X jusqua ce que Ym=0.

pour savoir le plus rapide c'est simple: if (Xm>(Ym+Ym)).

Donc pas besoin de division je pense.

Bon j'espere que j'ai repondu a la question, j'ai pas eu le tmps de tout lire dslsad
@+
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

13

Paxal > Oui, L/2 j'en ai tenu compte, par contre pour L/sqrt j'ai laissé tomber, vu que je n'ai pas besoin d'une grande précision, donc c'est L/2 aussi smile

TiMad > Grosso modo tu compare les différents cas, comme moi ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

14

En gros, avec 4 if et une simple addition t'as ta solution (je pense ..)
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

15

Un peu plus qu'une addition je pense smile
Enfin le principe est là smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

16

??
bein non.. pourquoi plus qu'une addition??
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

17

Bah je vois pas comment faire avec une seule operation en tout...
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

18

Bon en bref:
Avec 3 if, j'ai sa position du point (dans quel 8iem il est, et non 16ieme dans le poste n-4).

pour le deplacement le plus rapide pour etre dans la ligne de dire, il me faut un autre if => 4 if
pour le deplacement, il me faut plus qu'une soustraction.
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

19

ah ok smile
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)