Salut,
Alors, oui je sais le titre du sujet ne doit pas vous dire grand chose. (D'ailleurs un titre ça ne parle pas ^^)
Explication. Je souhaiterais faire partir un objet d'un point "A" définis par des coordonnées GPS. L'objet devrait se déplacer en ligne droite dans une direction donné (aléatoire). Toutes les X minutes, je souhaiterais connaitre la position GPS de l'objet.
Le soucis, c'est que je ne sais pas comment mis prendre.
Définir une position GPS de départ, pas de soucis. Choisir un angle sur 360° non plus. Par contre, comment "simuler" son déplacement dans la direction choisi sur une Map (par exemple google maps) ?
Je pense, peut-être à tort, qu'il est plus simple d'abord de lui trouver un point d'arrivé. Et d'ensuite calculer, en fonction de sa vitesse, ou il ce trouvait à temps de minutes après avoir commencé son déplacement. Et pour finir placer le point sur une carte pour en trouver les coordonnées GPS.
Avez-vous une idée ? Google Maps ou autre ont-ils des fonctions pré-faites pour ce genre de chose ?
P.S : Peut-être que je ne poste pas au bon endroit, mais je ne savais pas ou poser cette question.
Merci.
Alors, si je reformule tel que je comprends:
Tu as un point de départ, qui sont des coordonnées d'un plan euclidien (x,y)
Tu as une direction (cardinale) de déplacement
Tu as une vitesse initiale de déplacement
Tu as une équation de décélération, puisque la vitesse diminue avec le temps
Tu as un temps de déplacement
Tu veux les coordonnées de destination
Tu veux les coordonnée courante a n'importe quel temps du déplacement
Disons que, pour l'exemple:
Tes coordonnées initiales sont (0,0)
Tu te déplaces plein NE, soit 45 degrés
Ta vitesse initiale de déplacement est de 10 unités de plan par minute(10 u/m)
La décélérations est 0.5 u/m par minute (donc accélération de -0.5u/m/m
On va dire que le temps de déplacement est la max qu'on peu avoir (on pourrait décider 10 min, ou autre, a la place)
Déjà on peut calculer le temps maximum de déplacement. En effet vu que la vitesse diminue, elle va tomber a 0 a un moment, et le mec ne bougera plus.
Vitesse initial de 10 u/m, chaque minute on perd 0.5 u/m
=> v(t) = 10 - (0.5 * t)
=> 10 - 0.5 * t = 0
=> t = 20 min pour atteindre une vitesse de 0 u/m.
Ensuite on peut calculer la distance x parcourue pendant ce temps la.
dx/dt = v (définition de la vitesse)
=> dx/dt = (-0.5 * t) + 10
=> x = (1/2 * -0.5 * t * t) + (10 * t)
=> x(20 min) = (1/2 * -0.5 * 20 * 20) + (10 * 20)
=> x(20 min) = 100 unité de plan seront parcourues en 20 min (avec donc une vitesse initiale de 10u/s, et une accélération de -0.5u/m/m)
Reste a faire de la trigo pour trouver les nouvelles coordonnées:
On part de (x1,y1) on va vers (x2,y2), dans notre cas on a (x1,y1) = (0,0) et un déplacement de 45 degrés
x2 = cos( 90-angle ) * x + x1
=> x2 = 0.707*100+0 = 70.7
y2 = sin( 90-angle ) * x + y2
=> y2 = 0.707*100+0 = 70.7
=> les nouvelles coordonnées sont (70.7,70.7).
Si l'angle de déplacement est de 120 degrés (Est-Sud-Est), les nouvelles coordonnées seront (86.6,-50)
En javascript:
// Returns the max motion time taking into account acceleration (a) and initial speed (V)
function maxMotionTime(a, V) {
return -V/a;
}
// Returns distance from time (t), acceleration (a) and initial speed (V)
function distance(t, a, V) {
return 1/2*a*t*t+V*t;
}
// Returns new coordinates object from distance (d), starting coordinates (coord) and angle from North (angle).
// Adjusts to the desired number of decimals
function newCoordinates(d, coord, angle, decimal) {
angle = 90 - angle;
return {
x: Math.round( (Math.cos(angle*Math.PI/180)*d+coord.x) * Math.pow(10, decimal) ) / Math.pow(10, decimal),
y: Math.round( (Math.sin(angle*Math.PI/180)*d+coord.y) * Math.pow(10, decimal) ) / Math.pow(10, decimal)
}
}
// Test les valeurs utilisées dans l'exemple
console.log( maxMotionTime(-0.5, 10) );
console.log( distance(20, -0.5, 10) );
console.log( newCoordinates(100, {x:0, y:0}, 45, 4) );
console.log( newCoordinates(100, {x:0, y:0}, 120, 4) );
console.log( newCoordinates(100, {x:0, y:0}, 210, 4) );
console.log( newCoordinates(100, {x:0, y:0}, 315, 4) );
Déja question: ton monde est-il sphérique, ou est-ce un plan ? ... Ce sera plus simple s'il est uniquement en deux dimensions (espace euclidien).
Et de toute facon il te faut une vitessse, que tu connaisses l'arrivée ou pas.
Merci pour ta réponse. C'est un plan 2D et le but est uniquement de connaitre des positions GPS d'un objet. Le monde est le monde "réel". L'objet par dans une direction avec une vitesse qui décélère petit à petit jusqu'à l'arrêt.
En y réfléchissant encore, je me rend compte que le soucis de la distance parcouru peut être dissocié de l'angle. Il me suffit de définir la distance que peu parcourir l'objet à partir d'une vitesse de départ. En connaissant la distance, il me suffirais de placer le tout sur la carte.
Disons que l'objet parcours 5km. Je pars d'un point "A" et place un point "B" à 5km du premier. Je déplace le point "B" suivant l'angle définis.
A partir de ce moment, je connais la position GPS d'arrivé. Je procède de la même façon en appliquant le temps. Si mon objet à parcourus, pour simplifier, 1km toutes les 1 minute je peu facilement connaitre sa position.
Est-ce que mon raisonnement est bon ?
Avez-vous un idée de comment réaliser cela avec une appli en JS ?
Slt,
Merci énormément pour ton aide et ton exemple. Ce n'était pas clair mais, effectivement, le temps de déplacement doit être fonction de la décélération. C'est la vitesse de départ qui conditionne la durée du déplacement.
Niveau math, je visualisais plus ou moins comment le réaliser mais il faillait me rafraîchir la mémoire surtout pour la trigo(^^). Pour la façon de trouver les nouvelles coordonnées... alors là je n'aurais pas trouver tout seul !
J'ai testé et ajusté pour que le script puisse afficher correctement les coordonnées.
Encore un grand merci, car avec cette base je vais pouvoir faire mes ajustements et adapter le tout à mes besoins.
Je passe en résolu.
Je ne sais pas si c'est de ca que tu parles mais effectivement je me suis foiré sur les nouvelles coordonnées. La nouvelle fonction (mise a jour dans le précédent post devrait etre:
function newCoordinates(d, coord, angle, decimal) {
angle = 90 - angle;
return {
x: Math.round( (Math.cos(angle*Math.PI/180)*d+coord.x) * Math.pow(10, decimal) ) / Math.pow(10, decimal),
y: Math.round( (Math.sin(angle*Math.PI/180)*d+coord.y) * Math.pow(10, decimal) ) / Math.pow(10, decimal)
}
}
L'angle doit etre recalculé, et j'avais inversé sin et cos :/
Re,
J'ai effectué des essais avec des valeurs plus petites pour pouvoir faire des vérifications plus facilement.
Il me semble y avoir un soucis avec la fonction distance() et je ne trouve pas de solution mathématique. Je verrais bien ça avec une boucle mais...
J'ai pris pour vitesse 2. Pour atteindre 0 il faut 4 minutes. La fonction distance() me retourne qu'en 4 minutes la distance serait de 4. Hors, en 4 minutes la distance devrait être de 5.
De 0 à la 1ere minute = distance parcouru 2.
De la 1ere minute à la 2eme minute = distance parcouru 1,5.
De la 2eme minute à la 3eme minute = distance parcouru 1.
De la 3eme minute à la 4eme minute = distance parcouru 0.5.
Donc 2 + 1.5 + 1 + 0.5 = 5
Je sèche.
La fonction "colle plus a la réalité".
Si tes besoins sont différent tu peux faire une boucle effectivement.
Re,
A bas oui c'est logique... C'est moi qui me suis focalisé sur une décélération par pallier. C'est pour ça que je ne comprenais pas d'avoir un résultat pas "juste".
Du coup, je me retrouve avec 2 possibilités (par pallier ou linéaire) qui peuvent convenir à mes besoins. Mais je penche pour la linéaire plus "logique".
Encore merci pour ton aide. ;-)