J'ai un "petit" problème qui me donne des cheveux blancs depuis 1 semaine. Ca a l'air simple en apparence (peut-être que ça l'est) mais je bloque vraiment.
Pour une application je dois calculer les angles d'usinage de vecteurs. En gros je dois attaquer un vecteur à 45° et le finir à 135° (45 + 90). Quand des vecteurs se suivent, je dois calculer "l'angle moyen" entre la fin théorique du premier vecteur et le début théorique du 2e vecteur. Simple...
Sauf que je n'ai pas trouvé de formule qui me permette de connaître le sens de cet angle moyen (une erreur de 180° arrive dans certaines situation).
Voici les 2 cas :
1er cas
Mon premier vecteur a un angle de 180°, donc mon angle d'attaque sera 180-135 = 45° et mon angle théorique de fin sera 45+90 = 135°.
Mon deuxième vecteur a un angle de 315°, donc mon angle d'attaque sera 315-135 = 180° et mon angle théorique de fin sera 180+90 = 270°.
Mon "angle moyen" ou de "jonction" sera (135+180)/2 = 157.5°.
2e cas
Mon premier vecteur a un angle de 135°, donc mon angle d'attaque sera 135-135 = 0° et mon angle théorique de fin sera 0+90 = 90°.
Mon deuxième vecteur a un angle de 0°, donc mon angle d'attaque sera 0-135 = -135° -> 225° et mon angle théorique de fin sera 225+90 = 315°.
Mon "angle moyen" ou de "jonction" sera (225+90)/2 + 180 = 337.5°.
Mon problème c'est que je n'ai pas trouvé de formule qui me permette de savoir quand faire "+180". Visuellement ça saute aux yeux. Mais je n'arrive pas à poser ça en formule (enfin en code pour être exacte, c'est pour une appli C++).
Donc si quelqu'un aurait une idée... ?
Merci d'avance !
Olivier
P.-S. J'ai mis que 2 cas pour montrer la problématique, mais évidement ça doit fonctionner avec n'importe quel angle entre les 2 vecteurs.
Si j'ai bien compris, dans le second cas, l'angle cherché doit être de (225°+90°)/2 = 157,5° et non pas 337,5°, c'est bien ça ? Et sur le second dessin la flèche verte devrait partir à l'opposé, n'est-ce pas ?
Si vraiment le second cas doit donner 337,5°, je n'ai pas compris.
Comment définis-tu dans quel sens il faut tracer la flèche verte ? Si tu sais l'expliquer, je pense que tu auras répondu à la question.
Je vais tenter d'expliquer par écrit mais c'est pas simple (surtout que je suis dedans depuis une semaine alors ça me parait évident ^^).
En fait concrétement il s'agit d'un "fraisage" laser, la matière qu'on doit garder se trouve à "gauche" de chaque vecteur. Mes angles d'attaques (en rouge) indique le sens dans lequel le laser attaque la matière. Dans le 2e cas, 157.5° "sort" de mes 2 vecteurs, alors qu'il doit rentrer (du coup je sais de fait qu'il me faut ajouter 180°).
Dans le premier cas, le laser (qu'on peut considérer simplement comme une fraise) va aller enlever la matière à l'extérieur de l'angle (on le sait grâce au sens des vecteurs, on garde la matière à "gauche".).
Dans le deuxième cas, le laser va aller enlever la matière à l'intérieur de l'angle (idem, on le sait grâce au sens des vecteurs, on garde la matière à "gauche").
Je sais dans mon deuxième cas que l'équation "(angle 2 vecteur 1/ angle 1 vecteur 2) / 2" est fausse car l'angle de 157.5 "sort" de mon angle. Je sais que c'est faux car visuellement c'est évident. Mais je n'arrive pas à poser ça en code.
Tu as totalement raison quand tu dis "Comment définis-tu dans quel sens il faut tracer la flèche verte ? Si tu sais l'expliquer, je pense que tu auras répondu à la question." Simplement je n'arrive pas à trouver l’algorithme qui me permet de définir pour chaque pair de vecteurs quand je dois faire "+180". Visuellement ça saute aux yeux, mais je sèche pour poser ça en formule...
Je ne sais pas si c'est plus clair...
P.-S. Mes connaissances théoriques en math, trigo, géométrie sont assez limitées, alors peut-être que j'utilise de mauvais termes, voir de faux termes... j'espère être compréhensible tout de même.
je ne comprends pas forcément grand chose à tes explications car elles me paraissent confuses et mal présentées. Néanmoins je me demande si dans ton cas (et avec ton vocabulaire) tu n'ajoutes pas tout simplement 180° lorsque l'angle du vecteur 1 > angle vecteur 2.
Là on a une histoire de bissectrices. Avec deux demi-droites, on peut dessiner deux angles : un angle aigu et un angle obtu. S'il s'agit de trouver la bissectrice qui coupe l'angle aigu, je procèderais ainsi :
1. Ramener les deux angles a1 et a2 à un même intervalle, par exemple à [0; 360°[. Je crois qu'Oli197 le fait systématiquement.
2. Selon les cas (faire un dessin pour comprendre) :
- Si a1 < a2 et a2-a1 < 180° (on va de a1 à a2), calculer (a1+a2)/2.
- Si a1 < a2 et a2-a1 >= 180° (on va de a2 à a1 en traversant [Ox) ), calculer (a1+a2-360°)/2.
- Si a1 > a2 et a1-a2 < 180° (on va de a2 à a1), calculer (a1+a2)/2.
- Si a1 > a2 et a1-a2 >= 180° (on va de a2 à a1 en traversant [Ox) ), calculer (a1+a2-360°)/2.
Mais je ne sais pas si ça correspond au besoin d'Oli197. Peut-être (vu que ça fait intervenir des -180° une fois sur deux).
je ne comprends pas forcément grand chose à tes explications car elles me paraissent confuses et mal présentées. Néanmoins je me demande si dans ton cas (et avec ton vocabulaire) tu n'ajoutes pas tout simplement 180° lorsque l'angle du vecteur 1 > angle vecteur 2.
Bonjour,
Non car comme dit robun "Mais 350° est-il < ou > à 10° ?"
robun a écrit:
Mais 350° est-il < ou > à 10° ?
------------
Là on a une histoire de bissectrices. Avec deux demi-droites, on peut dessiner deux angles : un angle aigu et un angle obtu. S'il s'agit de trouver la bissectrice qui coupe l'angle aigu, je procèderais ainsi :
1. Ramener les deux angles a1 et a2 à un même intervalle, par exemple à [0; 360°[. Je crois qu'Oli197 le fait systématiquement.
2. Selon les cas (faire un dessin pour comprendre) :
- Si a1 < a2 et a2-a1 < 180° (on va de a1 à a2), calculer (a1+a2)/2.
- Si a1 < a2 et a2-a1 >= 180° (on va de a2 à a1 en traversant [Ox) ), calculer (a1+a2-360°)/2.
- Si a1 > a2 et a1-a2 < 180° (on va de a2 à a1), calculer (a1+a2)/2.
- Si a1 > a2 et a1-a2 >= 180° (on va de a2 à a1 en traversant [Ox) ), calculer (a1+a2-360°)/2.
Mais je ne sais pas si ça correspond au besoin d'Oli197. Peut-être (vu que ça fait intervenir des -180° une fois sur deux).
- Edité par robun il y a environ 10 heures
Effectivement le problème c'est le 360/0°. Dans certain cas il faut le considérer comme 0° et dans d'autres comme 360°.
J'ai essayé ton algorithme, (a1 et a2 correspondent aux angles des vecteurs 1 et 2 respectivement si j'ai bien compris).
J'ai le problème avec ce cas suivant (je n'ai pas continué d'essayer d'autres cas mais mon expérience sur ce problème me fait penser qu'il ne s'agit sûrement pas du seul cas problématique).
a1 = 270°
a2 = 80°
Ce qui nous donne ce cas (le 4e) : Si a1 (270) > a2 (80) et a1-a2 (270-80) >= 180° (on va de a2 à a1 en traversant [Ox) ), calculer (a1+a2-360°)/2. Le résultat sera faux, je ne doit pas soustraire 180 dans ce cas.
La première remarque de ton 2e message est le point central du problème. Le problème 0°/360°.
Mon algorithme traitait un cas général : quand on cherche l'angle moyen (la bissectrice) contenu dans l'angle « intérieur » (j'avais écrit « aigu » plus haut mais ce n'est pas le bon terme). (Ah, j'ai trouvé : il faut parler d'angles saillant et rentrant.)
Voyons ça sur un dessin :
Quand on tourne de OA vers OB dans le sens direct (par la droite), on parcourt l'angle saillant. La bissectrice (sous forme de vecteur (*)) est le vecteur OM
Quand on tourne de OA vers OB dans le sens indirect (par la gauche), on parcourt l'angle rentrant. La bissectrice est le vecteur -OM (dans l'autre sens).
Mon algorithme servait à calculer la mesure de la bissectrice de l'angle saillant.
Dans ton problème, on a deux vecteurs (Angle 1 vecteur 2 et Angle 2 vecteur 1) dont on cherche la « moyenne », c'est donc une question de bissectrice. Mais la moyenne de quel côté ? Saillant ou rentrant ?
Attention : dans ton exemple tu n'as pas pris les bons vecteurs. On cherche la « moyenne » de Angle 1 vecteur 2 et Angle 2 vecteur 1, donc :
a1 = Angle 1 vecteur 2 = 225°
a2 = Angle 2 vecteur 1 = 305°
Ici a1 < a2 et a2-a1 < 180° (on n'a pas traversé [Ox) ) donc la moyenne est simplement (225+305)/2 = 265°.
----
(*) Je crois qu'on ne définit jamais un « vecteur bissecteur », donc pour les matheux je dois le définir : c'est un vecteur directeur de la bissectrice (la demi-droite qui partage le secteur saillant en deux parties égales) ayant pour origine le sommet du secteur et pour extrémité un point quelconque de la bissectrice distinct du sommet.
je ne comprends pas forcément grand chose à tes explications car elles me paraissent confuses et mal présentées. Néanmoins je me demande si dans ton cas (et avec ton vocabulaire) tu n'ajoutes pas tout simplement 180° lorsque l'angle du vecteur 1 > angle vecteur 2.
Bonjour,
Non car comme dit robun "Mais 350° est-il < ou > à 10° ?"
je ne comprends pas forcément grand chose à tes explications car elles me paraissent confuses et mal présentées. Néanmoins je me demande si dans ton cas (et avec ton vocabulaire) tu n'ajoutes pas tout simplement 180° lorsque l'angle du vecteur 1 > angle vecteur 2.
Bonjour,
Non car comme dit robun "Mais 350° est-il < ou > à 10° ?"
350 > 10
Regarde le 2e cas, ça n'irait pas si le 2e angle était à 359°
@robun je regarde ça, je te réponds
Edit :
robun a écrit:
Dans ton problème, on a deux vecteurs (Angle 1 vecteur 2 et Angle 2 vecteur 1) dont on cherche la « moyenne », c'est donc une question de bissectrice. Mais la moyenne de quel côté ? Saillant ou rentrant ?
Justement je n'arrive pas à déterminer le côté (saillant ou rentrant) mathématiquement.
Le deuxième vecteur est toujours plus grand que le premier (si on admet avoir des angles plus grands que 360°).
Dans le cas 1 je sais que c'est l'angle rentrant car l'arc de cercle qui le représente se trouve dans la direction où pointe tous mes angles laser (angles rouge).
Dans le cas 2 je sais que c'est l'angle saillant car l'arc de cercle qui le représente se trouve dans la direction où pointe tous mes angles laser (angles rouge).
En fait seuls les vecteurs dessinés en bleu sont utiles : V1 et V2.
Notons A, B, C les points tels que V1 = AB et V2 = BC. On se déplace de A à B suivant le vecteur V1, puis de B à C suivant le vecteur V2.
Si ces vecteurs sont de même longueur, alors on peut définir l'angle moyen comme étant l'angle (par rapport ) la direction des x) du vecteur V1 - V2 (c'est-à-dire AB + CB).
Est-ce que c'est bien ça ?
Ah, zut, ça colle avec le premier schéma mais pas le second (je ne comprends toujours pas pourquoi dans le second schéma on va dans le sens que tu as dessiné...)
Le sens des vecteurs ou le sens de l'angle moyen (en vert) ?
Le sens des vecteurs est donné arbitrairement, il définit le côté de la matière qu'on garde.
robun a écrit:
Aaaaah je crois avoir compris !
En fait seuls les vecteurs dessinés en bleu sont utiles : V1 et V2.
Notons A, B, C les points tels que V1 = AB et V2 = BC. On se déplace de A à B suivant le vecteur V1, puis de B à C suivant le vecteur V2.
Oui exactement, on se déplace de A à B et de B à C. Les angles d'usinage (rouge) doivent "pointer" à gauche de chaque vecteur. C'est pour ça que dans le cas 1 et le cas 2 je sais si oui ou non je dois faire +180°.
Enfin comme dis, je le vois visuellement, mais pas mathématiquement...
Ah, je crois que j'ai compris (bis) : le vecteur dessiné en vert est la bissectrice de l'angle ABC se situant dans le secteur qui permet de tourner (BA, BC) dans le sens direct.
Schéma 1 : si on tourne de -V1 à V2 dans le sens direct, on passe par l'angle en vert, qui est égal à V1-V2
Schéma 2 : si on tourne de -V1 à V2 dans le sens direct, on passe par l'angle en vert, qui est égal à V2-V1.
Je note a1 l'angle que fait V1 avec l'axe des x, et a2 l'angle que fait V2 avec l'axe des x. On chercher a = l'angle que fait V avec l'axe des x, où V est le vecteur dessiné en vert. (Attention, je ne me sers que de V1 et V2, pas des petits vecteurs à +/-45°.)
L'algorithme pourrait être (je te laisse vérifier sur plein de cas particuliers...) :
1. Exprimer a1 et a2 dans l'intervalle [0; 360°[.
2. Selon les cas :
- Si a1 < a2 et a2-a1 < 180° (sens direct dans le secteur saillant), calculer (a1+a2-180°)/2.
Exemple schéma 1 : a1 = 180°, a2=315°, a = (180+315-180)/2 = 157,5°.
Exemple schéma 2 : a1 = 0°, a2 = 135°, a = (0+135-180)/2 = -22,5°, c'est pareil que 337,5°.
Exemple : a1 = 20°, a2 = 40°, a = (20+40-180)/2 = -60°, ça m'a l'air correct.
- Si a1 < a2 et a2-a1 >= 180° (sens direct dans le secteur rentrant, on traverse Ox), calculer (a1+a2+180°)/2.
Exemple schéma 2 : a1=360°, a2= 135°, a = (135+360+135)/2 = 337,5°
- Si a1 > a2 et a1-a2 < 180° (sens direct dans le secteur rentrant), calculer (a1+a2-180°)/2.
Exemple : a1 = 315°, a2 = 180°, a = (315+180-180)/2 = 157,5°.
- Si a1 > a2 et a1-a2 >= 180° (sens direct dans le secteur saillant, on traverse Ox), calculer (180°-a1-a2)/2.
Exemple schéma 3 : a1 = 270°, a2 = 80°, a = (180-270-80)/2 = -85°, pareil que 265°.
Exemple : a1 = 300°, a2 = 60°; a = (180-300-60)/2 = -90°. Si j'ai compris le principe, c'est ce qui est attendu.
3. On peut ensuite ramener le résultat à l'intervalle [0; 360°[.
Il y a peut-être moyen de simplifier l'algorithme.
https://heimtech.ch/
https://heimtech.ch/
https://heimtech.ch/
https://heimtech.ch/
https://heimtech.ch/
https://heimtech.ch/
https://heimtech.ch/