Salut a tous,
voila le probleme, j'essaye de resoudre depuis ce matin un petit truc mais non sans peine.
Le resultat theorique :
Deplacer le curseur au dessus d'une paintpox et un elements graphique (image par exemple) essaye de rattraper le curseur de la souris.
Le resultat pratique :
une catastrophe. ça fait n'importe quoi, quand je n'ai pas l'erreur de calcul en virgule flottante.
en gros ce que je fait :
calcul de la distance entre position de l'element et le curseur de souris ... (trygonometrie)
grace a la formule AC² = AB² + BC²
d'ou le code :
AC := sqrt( sqr(AB) + sqr(BC) );
ça c'est parfait ça fonctionne.
ensuite, pour connaitre la direction je recupere l'angle de cette trajectoire avec la formule :
cos(Â) = AB/AC
d'ou le code :
A := ArcCos( AB/AC );
ici ... ça marche mais parfois j'ai le probleme de calcul en virgule flottante ... mmm ... surtout quand j'ai une erreur dans les formule que j'applique ensuite.
Quand je bouge la souris, je recupere deja les coordonnées du curseur, je travail sur une paintbox qui prend toute la zone de fiche donc X ou Y ou ça c'est pareil (au depart c'etait dans un timer d'ou le code) :
MPX := Mouse.CursorPos.X - ClientOrigin.X;
MPY := Mouse.CursorPos.Y - ClientOrigin.Y;
ensuite je calcul la distance entre ces coordonées et celle du centre de mon elements a faire bouger :
WHYP := sqrt( sqr( MPX - ELM.X ) + sqr( MPY - ELM.Y ) );
ça c'est nickel, j'ai toujours la bonne taille ... (hummm)
puis l'angle de trajectoire MP > ELM et recherche le signe (+ ou -) grace a une petite fonction que j'ai fait qui renvois +1 si c'est positif, 0 si zero et -1 si negatif (GetSign), pour corriger la position avec l'inversion de l'axe des Y, si l'origine de l'ecran etait en bas a gauche ça me faciliterais la tache ^^ :
ATJ := ArcCos( (MPX-ELM.X) / WHYP ) * (GetSign( MPY-ELM.Y ));
tout cela fonctionne a peu prés bien ... en theorie la formule et bonne.
mais viennent les problemes a partir d'ici...
ATJ passe a 180° quand il vas 359.9 a 0.0, en gros ma formule renvois 360° = 180°
et donc ... mon point se retrouve a l'opposé de sa position quand il passe a 360° ...
le probleme est que je ne reussis pas a trouver d'ou viens ce probleme ...
j'ai essayer quelque bricolage mais rien ne vas ... ma seule solution serait d'utiliser un tableau de valeurs et de corriger la 360eme.
mais cette solutions me semble bricolo bricolo. surtout que j'aurais 2 entrée a zero ... a moins de jouer avec l'interval tableau mais la encore ... ç'est pas le mieux.
ensuite viens le probleme d'application du mouvement pour que l'element graphique rattrape le curseur.
mais la encore, probleme, il fait n'importe quoi.
En gros ce que je fait c'est :
Diminuer la valeur de WHYP et calculer la nouvelle position de ELM grace a cela :
WHYP := WHYP - 0.1;
ELM.X := round( MPX + (WHYP * Cos( DegToRad( ATJ )) ));
ELM.Y := round( MPY + (WHYP * Sin(DegToRad( ATJ)) ));
( on ne feras pas attention a l'optimisation, le but etant que ça marche meme si ça rame )
et donc la encore, le probleme est que le deplacement fait n'importe quoi, soit il suis correctement mais dés que je bouge la souris WHYP augmente d'un coups et donc l'elements se retouve a des millions de pixels plus loins ... meme avec des controls pour eviter les calculs inutiles ... mais en gros WHYP devrais toujours etre decrementer pour rattraper la position du curseur.
snif ouin.
je pense avoir oublier quelque chose ou alors, je n'utilise pas la bonne methode.
bref, si quelqu'un peu m'aider a trouver la solutions ... franchement je rame.
je ne comprend pas pourquoi alors que je decremente le rayon (WHYP) il me fait n'imp dés que je bouge la souris (quand il ne fait pas n'imp dés le depart)
bref ... si quelqu'un a une piste ou meme un tuto ou autre je suis preneur ... car je rentre relativement bredouille de wikipedia.
et n'ai rien trouver de similaire sur le site... j'ai eplucher plusieurs site sur la geometrie, calcul des angles, des distances mais nada...
merci d'avance, si vous avez du temps a consacrer a ce probleme, qui est plus un probleme de methode et formules qu'un probleme réel de code.
Meme si vous mettez en grand ligne les principes a suivre (algorythmie) j'arriverais a adapter...
Le pire est que j'ai deja vus dans flash un exemple similaire avec une coccinnelle, pas moyen de le retrouver, surrement dispo que dans Flash 6 ou 5 ... si quelqu'un a le FLA ça m'interresse aussi (pas le SWF hein! le FLA! sinon ça sert a rien ^^).
bonne journée a tous.
Croc (click me)