cela fait déjà quelques mois que je me demande comment calculer l'angle entre un vecteur et un point dans un espace 2d (voir image).
Le vecteur est donc la direction dans laquelle se dirige un objet (ici une voiture), et je cherche à connaître l'angle que doit avoir la voiture pour rejoindre un point quelconque.
Je souhaite appliquer cela à de petits jeux 2D, j'ai donc trouvé comment diriger un objet dans une direction suivant les axes x et y (peut-être que cela peut vous aider à trouver la formule mathématique que je cherche) :
Juste pour un peu de 'rigueur', tu parles d'angle entre un vecteur et un point... ce qui n'a pas vraiment de sens.
Mais si on se réfère à ton dessin, tu as un point A (l'automobile), un point O (l'Objectif) et ce que tu cherches, c'est l'angle entre le vecteur D (Direction) et le vecteur AO ; et un angle entre 2 vecteurs, ça a un sens.
Tu n'as pas besoin de l'angle mais de leur cosinus et sinus. Et ça, c'est encore plus simple à calculer (pas besoin d'arc sinus et arc cosinus ou de conversion pi/180).
Ici il y a deux vecteurs, mettons que je les note u et v (par exemple u est le vecteur D, v est le vecteur AO, pour reprendre la notation de tbc92). On a :
\[ \cos(u,v) = \frac{u \cdot v}{ \|u\| \|v\| } \]
Le produit scalaire \( u \cdot v \) est facile à calculer avec les coordonnées (c'est x.x' + y.y').
et là encore, le produit vectoriel se calcule à l'aide des coordonnées (un poil plus compliqué).
Bon, KirbXCoucou l'avait déjà dit, mais j'interviens surtout pour insister : on n'a pas besoin de l'angle, juste du cosinus et du sinus, donc des deux expressions à droite du signe égal.
J'ai travaillé sur la question depuis ce matin, avec ce que vous m'avez dit, et j'ai enfin réussi!
Je suis passé par trois fonctions différentes, car les 2 premières avaient un problème, elles donnaient à chaque fois un angle positif, et ne pouvaient jamais donner d'angle négatif, ce qui est normal puisqu'on calculait les longueurs avec des sqrt et des carré, donc c'était positif...
Voici donc les différentes fonctions. C'est en JavaScript, mais je n'utilise que des fonctions mathématiques, donc si vous avez les bases en algo, vous devriez comprendre facilement :
function angle(A,C) {
var B = [C[0],A[1]];
// on détermine le point B du triangle rectangle ABC (en supposant qu'il a la même abscisse que A et la même ordonnée que C : c'est déjà une erreur)
var AB = Math.sqrt(Math.pow((A[0]-B[0]),2)+Math.pow((A[1]-B[1]),2));
var BC = Math.sqrt(Math.pow((B[0]-C[0]),2)+Math.pow((B[1]-C[1]),2));
// calcul des distances AB et BC, qui sont ici forcément positives...
var rad = Math.atan2(BC,AB);
var deg = rad*(180/Math.PI);
return deg;
}
Vous voyez donc déjà la grosse erreur de déterminer B, on suppose qu'on a toujours une direction horizontale pour AB, ce qui n'est pas toujours le cas...
function angle(A,B,C) {
// 3 paramètres : A, B et C, c'est déjà mieux
var AB = [
B[0]-A[0],
B[1]-A[1]
];
// définition du vecteur AB
var AC = [
C[0]-A[0],
C[1]-A[1]
];
// définition du vecteur AC
var prod_scal = AB[0]*AC[0]+AB[1]*AC[1];
// calcul du produit scalaire
var AB_L = Math.sqrt(Math.pow(AB[0],2)+Math.pow(AB[1],2));
// norme du vecteur AB
var AC_L = Math.sqrt(Math.pow(AC[0],2)+Math.pow(AC[1],2));
// norme du vecteur AC
// encore une fois, les normes ne peuvent pas être négatives, donc on se retrouve avec le même problème...
var rad = Math.acos(prod_scal/(AB_L*AC_L));
var deg = rad*(180/Math.PI);
return deg;
}
Donc même problème, la valeur de dégrés ne peut pas être négative.
function angle(A,B,C) {
var AB = [
B[0]-A[0],
B[1]-A[1]
];
var AC = [
C[0]-A[0],
C[1]-A[1]
];
var rad = Math.atan2(AC[1],AC[0])-Math.atan2(AB[1],AB[0]);
// solution du cours donné par KirbXCoucou : angle of 2 relative to 1= atan2(v2.y,v2.x) - atan2(v1.y,v1.x)
var deg = rad*(180/Math.PI);
return deg;
}
On a enfin, grâce à la formule qui se trouve dans le cours donné par KirbXCoucou, une valeur positive ou négative de degrés.
Merci à tous pour votre participation, vous m'avez tous été très utiles!
Je t'avoue que je trouve ça bizarre que tu puisses avoir des valeurs négatives de degrés, et je trouve ça plus normal d'avoir que des valeurs positives. Enfin, c'est pas possible d'avoir un angle de degré négatif :/
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. » D. Mendeleïev
Oui un angle négatif ça n'existe pas, mais il me fallait quand même des degrés négatifs si je voulais que le voiture aille vers le bas, sinon on avait une symétrie et la voiture ne pouvait se diriger que vers le haut... Je sais pas si tu vas bien comprendre ce que j'ai dit ^^'
Mais c'est comme si notre voiture suivait le trajet d'une sinusoïde, et qu'on appliquait une valeur absolue sur notre sinusoïde, donc la voiture ne fait que rebondir sur l'axe des abscisses, sans jamais pouvoir le dépasser pour passer dessous.. C'est à peu près ça..
Il est normal ici d'avoir des angles entre -180° et +180°, ou entre 0° et 360°. Ce sont des angles de vecteurs, pas des angles de droite. Et c'est bien ce que donnent les formules basées sur le produit scalaire et le produit vectoriel.
Dwaaren : donc tu n'as pas suivi mon conseil d'utiliser juste le cosinus et le sinus ? C'est utile s'il y a beaucoup de calculs à effectuer, car un calcul d'arc cosinus ou d'arc sinus prend plus de temps que les opérations élémentaires.
Non robun, désolé mais je n'ai pas réussi à appliquer ce que tu me disais.. J'ai galéré toute la journée pour enfin avoir un système qui marche, donc je le garde comme ça pour l'instant.. Si j'ai le temps un jour, à tête reposée, je le reprendrai.
Merci quand même car tes conseils m'ont permis de comprendre ce que d'autres m'expliquaient!
Il faut savoir que je ne suis qu'en Première S, et on n'a survolé la trigonométrie qu'en 3ème, et on l'a à peine survolée en une demi-douzaine d'heures... Donc j'avais à peu près tout oublié, alors ça a été un défi et à la fois une remise à niveau de comprendre ce que vous me disiez
On peut donc imaginer ça avec plein d'autres objets, des missiles guidés dans des jeux de style Super Meat Boy, des acolytes ou familiers qui vous suivent dans un RPG, etc...
Sauf que le produit scalaire je ne l'ai pas encore vu, mais ça va encore, alors que le produit vectoriel ne se voit pas en lycée, même en S...
Et c'est là que je bloque : d'après ce site, le produit vectoriel donne un vecteur \[u \wedge v\]. Or comment peut-on obtenir un nombre réel (sinus) avec la division d'un vecteur par un nombre?
Aussi, lorsque je tente de calculer le cosinus avec la première formule (produit scalaire), j'obtiens toujours 0 ou -0...
// en considérant
// var AB = [
// x,
// y
// ];
// et
// var AC = [
// x',
// y'
// ];
var cos = (AB[0]*AC[0]+AB[1]*AC[1])/(Math.sqrt(Math.pow(AB[0],2)+Math.pow(AB[1],2))*Math.pow(AC[0],2)+Math.pow(AC[1],2));
// cos(u,v) = ( xx'.yy' )/( sqrt(x²+y²) * sqrt(x'²+y'²) )
// cos est toujours égal à 0 ou -0
Merci! C'est l'idée que je venais d'avoir, je vais essayer ça.
Des idées pour le cos toujours égal à 0 ou -0?
Et le calcul pour le produit vectoriel de deux vecteurs u et v, c'est bien :
\[ u \wedge v = (yx'-xy' ; xy'-yx') \] ?
EDIT : Ok je viens de trouver.. Le sinus était aussi égal à 0... C'est parce que la norme de AB était toujours égale à 0... Je pense qu'après rectification de ce problème ça devrait mieux fonctionner ^^'
Le produit vectoriel n'est défini qu'en dimension 3
Tes vecteurs de départ sont donc (x,y,z) et (x',y',z') avec z=0 et z'=0
Et le produit vectoriel est aussi un vecteur de dimension 3 : (yz'-y'z, zx'-z'x, xy'-x'y)
Et comme z=0 et z'=0, ça se simplifie bien : (0,0,xy'-x'y)
Ce vecteur résultat est 'vertical' (perpendiculaire au plan de travail), mais on s'intéresse uniquement à sa norme (=|xy'-x'y|) et à sa direction (vers le haut ou le bas, selon le signe de xy'-x'y)
Dwaaren, je suis dans la même situation que toi, dans mon cas c'est un bateau et une destination, j'ai donc la position du bateau et sa direction (angle entre le bateau et l'axe des abscisses) et pour la destination j'ai que les coordonnées.
J'ai donc essayé ta 3ème fonction mais je ne vois pas comment t'as fait pour trouver les coordonnées du 3ème point (la projection).
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Je ferme ce sujet. En cas de désaccord, me contacter par MP.
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev