Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2490 connectés 

  FORUM HardWare.fr
  Programmation

  [algo] Comment trouver la direction a partir d'un vecteur?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[algo] Comment trouver la direction a partir d'un vecteur?

n°86925
Ventilo
Ventilo? Depuis 1998!
Posté le 08-01-2002 à 04:19:56  profilanswer
 

J'ai un point à l'écran: 10,10 et jeux veux aller ver le point 400,400 qui se trouve donc à environs 551 pixel de là. Comme je suis dans un jeu, je ne veux pas que ce qui se trouve au premier point se rende au deuxième intantanément. Je me demandais comment faire pour trouver la "direction" qu'il fallait prendre "DirX, DirY" selon une certaine vitesse...
 
Je veux faire qulquechose du genre
 
pos.x = pos.x + dirx;
pos.y = pos.y + diry;
 
j'espère que vous me comprenez :D

mood
Publicité
Posté le 08-01-2002 à 04:19:56  profilanswer
 

n°86926
k666
dites non à petitmou
Posté le 08-01-2002 à 04:45:52  profilanswer
 

( y2-y1 )
--------- = la pente de ton vecteur non?
( x2-x1 )

n°86928
Ventilo
Ventilo? Depuis 1998!
Posté le 08-01-2002 à 06:09:49  profilanswer
 

Non justement, si je fait cela, je me retrouverais en moin d'un instant sur le point destination...

n°86930
Alload
Posté le 08-01-2002 à 07:07:10  profilanswer
 

Ben moi je dirais que tu fais:
 
velocity x = (400 - 10) / k;
velocity y = (400 - 10) / k;
 
Comme ça tu as un vecteur colinéaire entre les deux points, et tu peux choisir la rapidité avec laquelle il faut se rendre au deuxième point en fonction de k.

n°86932
benou
Posté le 08-01-2002 à 08:26:20  profilanswer
 

le problème c'est qu'en fesant ca la vitesse dépend de l'éloignement des 2 points.

n°86948
Carbon_14
Posté le 08-01-2002 à 09:28:42  profilanswer
 

Peut-être qu'en utilisant le fait que, pour un triangle rectangle, la racine de l'hypothénuse égale la somme des carrés des autres côtés, cela permet d'imposer une vitesse linéique sur cette hypothénuse en recalculant combien de pixel en X (et donc Y) cela fait.
 
Si les points sont proches, le bout sera atteint rapidement. Sinon, il faudra plus d'une étape (temporelle).

n°86957
LeGreg
Posté le 08-01-2002 à 10:08:30  profilanswer
 

Ventilo a écrit a écrit :

Non justement, si je fait cela, je me retrouverais en moin d'un instant sur le point destination...  




 
ben tu normalises ton vecteur
(division par la norme)
comme ca tu as une direction unitaire.
j'vois pas ou est le probleme.
 
LEGREG

n°86981
Kristoph
Posté le 08-01-2002 à 12:31:38  profilanswer
 

Mais ca depend de quelle norme tu met sur ton espace la ;)
 
Allez, pour rester dans le concret, on va utiliser la norme euclidienne clasique :
 
norm = sqrt( (y2-y1)^2 + (x2-x1)^2 )
 
Une fois que tu a ca, ton vecteur directeur de norme 1 est :
 
dirx = (x2-x1)/norm
diry = (y2-y1)/norm
 
Si tu utilise ce vecteur comme composante de deplacement, tu te deplace "a la vitesse 1". Tu n'a qu'a multiplier ca par une constante positive pour regler finnement la vitesse.

n°87139
Ventilo
Ventilo? Depuis 1998!
Posté le 08-01-2002 à 18:26:18  profilanswer
 

wow, j'ai pas étudier en physiquequatique moi  :D
 
Si je comprend bien tout ce que j'ai à faire c'est
dirx = (x2-x1)/vitesse?
diry = (y2-y1)/vitesse?

n°87144
LeGreg
Posté le 08-01-2002 à 18:35:11  profilanswer
 

Ventilo a écrit a écrit :

wow, j'ai pas étudier en physiquequatique moi  :D



 
mais non pas de mecanique quantique la dedans ;)
en mecanique quantique, il n'y a ni vitesse ni
trajectoire puisqu'un objet occupe simultanement
tout l'espace :D.
 

Ventilo a écrit a écrit :

Si je comprend bien tout ce que j'ai à faire c'est
dirx = (x2-x1)/vitesse?
diry = (y2-y1)/vitesse?  




 
deja definis ce que tu appelles vitesse :
si ce sont des pixels par frames
alors tu divises ton vecteur direction (x2-x1, y2-y1)
par ta distance en pixels sqrt( (y2-y1)^2 + (x2-x1)^2 )
puis tu le multiplies par ta vitesse en pixels par frame v.
le resultat = (vx, vy)
Et ainsi a chaque frame tu ajoutes
x = x + vx;
y = y + vy;
 
Voila c'est-y plus clair?
 
LEGREG

mood
Publicité
Posté le 08-01-2002 à 18:35:11  profilanswer
 

n°87259
Ventilo
Ventilo? Depuis 1998!
Posté le 09-01-2002 à 06:07:24  profilanswer
 

En fait je veux déplacer mon object en fonction du temps, temps que j'ai en millisecondes depuis le lancement de mon programe.
 
 
En fait ce qu'il me faudrait c'est un bon site avec des explication sur des lois de la physique, tout en restant accessible pour quelqu'un qui na pas fait des études poussé en math (pas encore :))

n°87316
Kristoph
Posté le 09-01-2002 à 11:07:30  profilanswer
 

A la cinematique :)
 
Je ne connais pas de site qui en parle, mais je peu te faire un peu de theorie pour te permetre de faire ton truc. On va se limiter a un probleme d'ordre 1 : Pas de gravitée et autres forces qui interviennent.
 
Un vecteur c'est un deplacement, ca tu l'a deja compris :
 
v définit par : ( x, y )
 
Dans le cas qui nous interresse, on va parler de vecteur unitaires seulement. Un vecteur unitaire c'est un vecteur de norme/taille 1
 
La norme d'un vecteur v c'est : |v| = sqrt ( x^2 + y^2 )
 
Donc si tu a une direction par un vecteur v (x, y), tu obtient le vecteur unitaire correspondant par :  
 
v2 = v/|v| = (x/|v|, y/|v|)
 
Donc, on a la direction de deplacement maintenant. Pour les unitees, on va parler en pixels/s : p/s
 
Un vecteur unitaire, ca a une vitesse de 1 p/s, si tu veux une vitesse a, ton vecteur vitesse devient :
 
v3 = a.v2 = (a.x/|v|, a.y/|v| ) = ( vx, vy)
 
Donc v3 contient à la fois ta vitesse et ta direction en p/s. Supposons qu'un point M se deplace avec pour vecteur vitesse v3, on a :
 
A l'instant 0 :
 
M(t=0) = M0 (x0, y0) : C'est ton point de depart
 
A l'instant t en secondes :
 
M(t) = M0 + t.v3 = (x0 + t.xv, y0 + t.yv )
 
Voila, cette formule doit suffire a resoudre tout ton probleme. Maintenant, attend les cours de physique de Terminale S pour voir ca plus en detail :)
 
Et fait gaffe aux unitees quand meme. Si ton temps est en milliseconde, ta vitesse doit etre an pixels/ms sinon ca va pas coller.

n°87358
Roco
Posté le 09-01-2002 à 13:00:28  profilanswer
 

Il suffit de regarder le sens de la flèche de ton vecteur, celle-ci indique la direction de ce dernier.
 
Vraiment désolé :pt1cable:

n°87636
Ventilo
Ventilo? Depuis 1998!
Posté le 09-01-2002 à 23:16:15  profilanswer
 

La je suis tout content parce que j'ai enfin été capable de trouver la bonne direction a prendre grace èa vos indication :)
 
mais la je suis baisé, quand je trouve DirX,DirY ca me donne un float (c++) bien sur, mais comme je suis en 2D je peut pas aafficher un object à 10,0777,10,0777  :fou:  
 
Il me faut donc une fonction pour arondire mon chiffre, je crois pas qu'il y est une fonction pour ca de base dans la STD?

n°87637
Kristoph
Posté le 09-01-2002 à 23:18:19  profilanswer
 

Essaye int(xpos) ou (int) xpos suivant ce que tu prefère juste pour voir ;)
 
Si tu veux arrondir de facon plus controlee, dans math.h il y a des trucs comme floor ou ceil mais il ca retourne un float quand meme

n°87640
Ventilo
Ventilo? Depuis 1998!
Posté le 09-01-2002 à 23:28:04  profilanswer
 

OUIIIIII, la fonction ceilf a tout arrengé :) ca marche :)

n°87692
Ventilo
Ventilo? Depuis 1998!
Posté le 10-01-2002 à 05:00:46  profilanswer
 

Bon jai un petit problem, quand la direction est en haut a gauche du point et que la vitesse est à 1, la direction tombe à 0,
 
voici mon code: (Ver étant l'arrivé, corps étant le départ)
 
f_vecteur v_dir;
f_vecteur v_temp;
f_vecteur v_vel;
float norm;
 
vm_vectsom(Ver->origine,corps->origine,&v_temp); //additione les deux vecteurs
 
norm = sqrt(vm_exposant(v_temp.x,2) + vm_exposant(v_temp.y,2)); //trouve la norm
 
vm_vectsous(Ver->origine,corps->origine,&v_dir); //soustrait les deux vecteur et donne la direction
 
vm_vectdivi(v_dir,norm,&v_dir); //divise la direction par la norm
 
vm_vectmulti(v_dir,corps->vitesse,&v_dir); //multiplie la direction par la vitesse
 
corps->origine.x = corps->origine.x + ceilf(v_dir.x); //bouge le corps
 
corps->origine.y = corps->origine.y + ceilf(v_dir.y); //bouge le corps
 
fait chier, jaivais quelquechose qui marchait plus ou moin bien, quand le point arrivé étais loin de point départ, la vitesse étais différente de si il étais proche, donc la vitesse dépendait de la distance :( c'est mon algo qui marche pas??

 

[edtdd]--Message édité par Ventilo--[/edtdd]

n°87926
Ventilo
Ventilo? Depuis 1998!
Posté le 10-01-2002 à 17:41:11  profilanswer
 

:bounce:

n°87968
LeGreg
Posté le 10-01-2002 à 18:22:53  profilanswer
 

Ventilo a écrit a écrit :

 
vm_vectsom(Ver->origine,corps->origine,&v_temp); //additione les deux vecteurs




pourquoi fais-tu ca?
 
il faut soustraire les coordonnes des deux points
pour avoir celle de ton vecteur direction
et diviser par la norme de ton vecteur direction  
 
LEGREG

n°87983
Ventilo
Ventilo? Depuis 1998!
Posté le 10-01-2002 à 18:40:29  profilanswer
 

legreg a écrit a écrit :

 
pourquoi fais-tu ca?
 
il faut soustraire les coordonnes des deux points
pour avoir celle de ton vecteur direction
et diviser par la norme de ton vecteur direction  
 
LEGREG  




 
je fait ca pour trouver la norm...

n°88123
Kristoph
Posté le 10-01-2002 à 23:31:09  profilanswer
 

Non, legreg a raison, ce que tu voulais faire c'est bien la difference. pour etre precis tu devrait faire Destination - Depart.
 
En fait pour etre precis, Destination + Depart n'a aucun sens utilisable. Ca ne sert a rien, jamais :)
 
C'est ce vecteur dont tu calcule la norme puis c'est de ce vecteur que tu obtient la direction de deplacement. C'etait peut-etre mal explique je suis desole dans ce cas.
 
Il va peut etre falloir que je fasse un vrai tutorial et que je le mette en ligne un jour :)

n°88131
Ventilo
Ventilo? Depuis 1998!
Posté le 10-01-2002 à 23:45:28  profilanswer
 

Kristoph a écrit a écrit :

 
Il va peut etre falloir que je fasse un vrai tutorial et que je le mette en ligne un jour :)  




 
ca serait bien  :D

n°88182
LeGreg
Posté le 11-01-2002 à 02:35:17  profilanswer
 

Ventilo a écrit a écrit :

 
je fait ca pour trouver la norm...  




 
bon je resume p1 le point de depart
p2 le point d'arrivee.
 
distance = vect_sous(p1, p2);
normedist = sqrt(distance.x * distance.x + distance.y * distance.y); // note: ne jamais faire exposant pour un carre
si normedist != 0 alors
direction = distance/normedist;
 
ca va mieux?
 
LEGREG

n°88195
Ventilo
Ventilo? Depuis 1998!
Posté le 11-01-2002 à 05:27:05  profilanswer
 

legreg a écrit a écrit :

 
 
bon je resume p1 le point de depart
p2 le point d'arrivee.
 
distance = vect_sous(p1, p2);
normedist = sqrt(distance.x * distance.x + distance.y * distance.y); // note: ne jamais faire exposant pour un carre
si normedist != 0 alors
direction = distance/normedist;
 
ca va mieux?
 
LEGREG  




 
beacoup mieux!!! MERCI  :love:
 
Enfait ce que je faisais c'est que je trouvais la distance en pixel, pas en vecteur... bah :)<
 
faut dire que les seul math qui resemble à ca que jai fait cétais de trouver la distance entre deux points sur un plan cartésien, ou de trouver le point milieu d'une droite  :sol:

 

[edtdd]--Message édité par Ventilo--[/edtdd]

n°88196
Ventilo
Ventilo? Depuis 1998!
Posté le 11-01-2002 à 05:47:18  profilanswer
 

Bon je laisse tomber, j'ai finalement été capable de trouver la bonne direction, mais comme je suis en 2D je ne peux pas m'en servire  :cry:  
 
Les point en 2D ne peuvent être que des entiers, et la direction/vitesse ne peut être représenté adaquatement qu'en double/float  :sweat:  
 
Je suis pas encore assé avancer, je remerci ceux qui mon aider, mais je retourne dans ma programation GUI windows  
 
 :hello:

n°88294
Kristoph
Posté le 11-01-2002 à 10:59:54  profilanswer
 

Mais il ne faut pas abandoner pour si peux :)
 
Comme tu l'a dit, les vecteurs ( surtout les unitaires :) ) doivent etre representes en float/double. Et bien tu fais TOUT tes calculs en float/double meme pour les coordonnees de tes points et juste avant l'affichage, tu fais
 
int xint = (int) xfloat;
int yint = (int) yfloat;
 
Et voila, tu n'utilise xint et yint que pour afficher sur l'ecran, apres tu les oublies ces valeurs.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [algo] Comment trouver la direction a partir d'un vecteur?

 

Sujets relatifs
[c++] vecteur de pointeurs vers deux types différents...ou peut on trouver un compilateur cobol
[java] convertir un vecteur en un tableau a 2 dim[algo] tri de composants sur une fiche Delphi
[VB] Interpretation hasardeuse des dates à partir d'une requete SQL ?[Linux et c] lancement d'une appli a partir de mon programme
Construire sa doc .chm à partir d'un code C++[VB] Test sous ACCESS a partir de VB
Un site ou je pourrais trouver des BONS tutorials sur la physique??[algo] les pb de koulip31 nr°4 !!!
Plus de sujets relatifs à : [algo] Comment trouver la direction a partir d'un vecteur?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR