Edit : J'ai juste besoin de connaître la formule (ou le nom de la formule ; "sinus" "cosinus") pour obtenir l'angle qui va d'un point B à un point C, C qui est un inconnu.


vec2 Dir = normalize(vec2(m_OwnerChar->m_Input.m_TargetX, m_OwnerChar->m_Input.m_TargetY)); // La direction de la souris du joueur
vec2 Start = m_OwnerChar->m_Pos + Dir * 50.0f;
vec2 To = m_OwnerChar->m_Pos + Dir * 200.0f;
CNetObj_Laser* pLaser = static_cast(Server()->SnapNewItem(NETOBJTYPE_LASER, m_ID, sizeof(CNetObj_Laser)));
if(!pLaser)
return;
pLaser->m_X = (int)Start.x;// Point A
pLaser->m_Y = (int)Start.y;
pLaser->m_FromX = (int)To.x; // La ligne qui va au point B
pLaser->m_FromY = (int)To.y;
pLaser->m_StartTick = Server()->Tick();
CNetObj_Laser* pLaser2 = static_cast(Server()->SnapNewItem(NETOBJTYPE_LASER, m_ID2, sizeof(CNetObj_Laser)));
if(!pLaser2)
return;
pLaser2->m_X = (int)To.x; // Point B
pLaser2->m_Y = (int)To.y;
pLaser2->m_FromX = (int)To.x - 50; // La ligne qui va au point C (qui devrait être calculé justement, il ne devrait pas y avoir de - 50 ou de 30 ici
pLaser2->m_FromY = (int)To.y + 30;
pLaser2->m_StartTick = Server()->Tick();
CNetObj_Laser* pLaser3 = static_cast(Server()->SnapNewItem(NETOBJTYPE_LASER, m_ID3, sizeof(CNetObj_Laser)));
if(!pLaser3)
return;
pLaser3->m_X = (int)To.x - 50; // Point C
pLaser3->m_Y = (int)To.y + 30;
pLaser3->m_FromX = (int)To.x - 50; // idem, devrait être calculé
pLaser3->m_FromY = (int)To.y + 30;
pLaser3->m_StartTick = Server()->Tick();
fatal_error a écrit:Tu veux calculer les coordonnées de C, mais tu dis pas quelle relation il doit satisfaire par rapport à A et B:
Si A a pour coordonnées (0,0)
et B a pour coordonnées (10,10)
pourquoi C de coordonnées (11,13) serait invalide.
Est-ce que l'angle (ABC) est constant (par exemple vaut toujours 30° ou bien vaut toujours 45°)? Je pense que tu sais quand même ce qu'est un angle. Sinon regardes sur le net.
Si l'angle (ABC) n'est pas constant, alors il n'y a pas de solution à ton problème, rien n'empêche de poser C n'importe ou sur un cercle de centre B
Robic a écrit:Voilà ce que j'ai compris (enfin, deviné, car il faut avouer que ce n'est vraiment pas clair...) : on dispose de trois points A, B, C (donc on dispose de leurs coordonnées je suppose) et il s'agit de calculer l'angle (BA, BC) (d'après les dessins - mais je ne suis pas 100 % sûr).
Une méthode classique est d'utiliser le produit scalaire et le produit vectoriel. À mon époque ce genre de calcul était au programme de terminale mais, depuis, j'ai un peu oublié, néanmoins il me semble que ça ressemble à :
oùest l'angle qu'on cherche et
est le vecteur unité de la 3è dimension orienté comme il faut.
Le produit scalaire et le produit vectoriel se calculent avec les formules usuelles :
Les normes de vecteurs aussi sont calculables avec les formules usuelles :
Ainsi, on obtient deux formules donnant le cosinus et le sinus :
Si on cherche un angle orienté, donc défini à 360° près, elles sont nécessaires. Si c'est un angle non orienté, une seule formule suffit.
Ensuite, il y a deux façons de procéder :
- On utilise un arc cosinus ou un arc sinus sur l'une des deux variables X ou Y, ce qui donne l'angle à 180° près. Reste à écrire un test à partir de l'autre variable pour connaître l'angle à 360° près.
- On utilise une fonction de type "arctangente étendue", si elle est disponible dans le langage (en C c'est la fonction atan2), en donnant X et Y comme arguments : elle retourne directement l'angle voulu.
Justement, mon problème est que l'angle est constant(c'est le problème que j'essaye d'expliquer depuis le début, désolé pour mon vocabulaire ^^)
fatal_error a écrit:slt,
robic,
L'angle est constant. Neox76 cherche a calculer les coordonnees du point C, connaissant les points A, B et langle ABC (jimagine qu il connait egalement la longueur BC (ex: 4cm)
Il ne s'agit donc pas de calculer l'angle mais de s'en servir en tant que parametre
Robic a écrit:Ah OK ! Donc on doit calculer le point C ? Effectivement pour ça il faut connaître la longueur BC.
Dans ce cas on peut procéder ainsi :
1) On place C' sur la droite (BA) tel que BC' = BC.
2) Puis on effectue une rotation d'angle a (j'appelle a l'angle en question).
Ce qui donne :
1)
2)où [M] est la matrice de rotation d'angle a.
En détail :
en espérant ne pas m'être trompé...
--------
Et voici une fonction en C qui calcule ça :
void calculpoint( double xa, double ya, double xb, double yb, double bc, double angle, double *pxc, double *pyc)
/* Entrée :
- coords de A : xa, ya
- coords de B : xb, yb
- distance BC : bc
- angle (BA, BC) : angle
*/
/* Sortie :
- pxc, pyc : pointeurs sur les coordonnées de C
- utilise
*/
{
double ba ; /* distance BA */
double xcc, ycc ; /* coordonnées du point C' de (BA) tel que BC' = BC */
double xc, yc ; /* coordonnées du point C */
ba = sqrt( (xa - xb) * (xa - xb) + (ya - yb) *(ya - yb) ) ;
xcc = bc * (xa - xb) / ba ;
ycc = bc * (ya - yb) / ba ;
xc = cos( angle ) * xcc - sin( angle ) * ycc ;
yc = sin( angle ) * xcc + cos( angle ) * ycc ;
*pxc = xc ;
*pyc = yc ;
}
(Bien sûr il y a beaucoup de calculs redondants, c'est juste pour faire le lien avec la méthode mathématique.)
void CTestLaser::CalculatePos(vec2 A, vec2 B, float DistBC, float Angle, vec2* pC)
{
const float DistAB = distance(A, B);
vec2 CC, C;
//DistAB = sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
CC.x = DistBC * (A.x - B.x) / DistAB;
CC.y = DistBC * (A.y - B.y) / DistAB;
C.x = cos(Angle) * CC.x - sin(Angle) * CC.y;
C.y = sin(Angle) * CC.x + cos(Angle) * CC.y;
*pC = C;
}
vec2 Dir = normalize(vec2(m_OwnerChar->m_Input.m_TargetX, m_OwnerChar->m_Input.m_TargetY));
vec2 Start = m_OwnerChar->m_Pos + Dir * 50;
vec2 To = m_OwnerChar->m_Pos + Dir * 200.f;
vec2 To2 = To;
To2.x -= 50;
To2.y += 30;
vec2 C;
CalculatePos(Start, To, distance(To, To2), 70, &C); // 70 pour l'angle (j'ai mis ça totalement au hasard)
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 78 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :