Arc Tan avec une valeur 0 que faire ?

cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 - 31 mai 2010 à 21:15
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 - 11 juin 2010 à 13:56
Bonjour

Je travail sur un code qui "gère" le tableau cartésien.

J'ai une formule de base très utile que je dois utiliser à chaque cacul. Ce calcul me donne une valeur qui est reliée au cadrant auxquelles les points se rapportent.

Donc mon tableau cartésien à 4 cadrant. Celui en haut à droit vaut +,+, en bas à droite vaut +,-, en bas à gauche vaut -,- et en haut à gauche vaut -,+

J'utilise ce code afin de récupérer ma valeur Tan1.

        X1 = PointCentre(0)
        X2 = StartArc(0)
        Y1 = PointCentre(1)
        Y2 = StartArc(1)

        dX = X2 - X1
        dY = Y2 - Y1
        
        'Formule pour connaître le cadrant dans lequel se trouve les coordonnées
          If dX >= 0 And dY >= 0 Then
            aTan1 = Atn(dX / dY)
        ElseIf dX >= 0 And dY < 0 Or dX < 0 And dY < 0 Then
            aTan1 = Atn(dX / dY) + pi
        ElseIf dX < 0 And dY >= 0 Then
            aTan1 = Atn(dX / dY) + (2 * pi)
        End If




Jusqu'ici tout va bien.

Mon problème est que si j'ai une droite avec des coordonnées identiques (ex Point 1 (100,200) Point 2 (100,300), mon dx aura comme valeur 0

Donc j'arrive a une erreur (arctan ne fonctionne pas avec une valeur 0) dans ma formule pour connaitre dans quel cadrant se retrouve mes points.

Je ne sais pas comment gérer ce problème.

Merci de votre aide

9 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 mai 2010 à 23:52
Oui, normal puisque dans ce cas, ton vecteur appartient à deux cadrans.
Il te faut gérer les égalités avant de tester les bornes.

Vérifie aussi ton 2ème If : Tu mélanges des Or et des And : Il est certains que le compilateur interprète mal cette condition : ajoute des parenthèses.

Vérifie tes conditions, car, dans ce que moi j'appelle un cercle trigonométrique, les valeurs devraient aller de 0 à 2xPi, et je ne vois que deux cadrans définis car Atn(dX / dY) + (2 * pi), c'est aussi Atn(dX / dY)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 4
1 juin 2010 à 14:15
Bonjour jack

merci pour ta réponse... J'ai ajouter les parenthèse mais pour le problème de Atn(dX / dY) + (2 * pi) = Atn(dX / dY), effectivement tu as raison mais je dois laisser ces formules de cet facon. Je travail en arpentage et je cite le livre
Contrairement aux mathématiques conventionnelles, l'arpentage a un système de quadrants bien particulier

J'utilise ces formules dans plein d'autre code et ca fonctionne... Mais je bug lorsque Dx ou Dy valle 0


Ensuite pour le fait de:
Il te faut gérer les égalités avant de tester les bornes


Je l'ai fait mais c'est ensuite que je ne sais plus quoi faire car..... Voici un autre bout de code que je n'avais pas montré dans mon précédent message:

If dY 0 Or dX 0 Then
            If X1 - X2 = 0 Then
                If Y1 - Y2 < 0 Then
                    aTan1 = Pi/2 '90 degré
                Else
                    aTan1 = Pi ' 180 Degré
                End If
            ElseIf Y1 - Y2 = 0 Then
                 If X1 - X2 < 0 Then
                    aTan1 = 3 * Pi/2 '270 degré
                Else
                    aTan1 = 0
                End If
            End If            
 '***************************************
'***********Problème pour aTan1**********
'****************************************    
        Etape1 = aTan1 + Angle
        Etape2_Dx = Sin(Etape1) * Rayon
        Etape2_Dy = Cos(Etape1) * Rayon
        Etape3_X = PointCentre(0) + Etape2_Dx
        Etape3_Y = PointCentre(1) + Etape2_Dy


Le problème est que si je passe dans ma condition si dx ou dy = 0 alors atan1 ne vaut pas nécessairement la valeur que je lui donne 0, 2/Pi, Pi ou 3Pi/2. Si j'utilise le code que je te montre alors je n'arrive pas a la bonne coordonnée. Je dois passé dans les formules montré dans l'autre message.

Bref mon problème est dans mes conditions si dx ou dy vaut 0 et je ne sais pas quoi faire


merci de ton aide
0
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
2 juin 2010 à 00:31
Si j'ai bien compris tu veux calculer le gisement d'une droite et non pas l'angle d'un rayon du cercle trigonométrique. Si on utilise des grades il suffit de faire par exemple:

sub g(x1,x2,y1,y2)
if (x1=x2) and (y2>y1) then g=100 : exit sub
if (x1=x2) and (y2<y1) then g=300 : exit sub
g = atan((y2-y1)/(x2-x1))* 200/pi
if y2<y1 then g=200+g: exit sub
if (x2<x1) and (y2>y1)then g=400 +g
end sub

Pour des degres remplacer 100 par 90, 200 par 180 , 300 par 270 et 400 par 360.
En trigonométrie, on se place au centre du cercle qui est divisé en 4 quadrants numérotés en sens inverse des aiguilles d'une montre, alors qu'en arpentage on se place au point x1,y1 et le quadrant où se situe x2,y2 est défini par sa direction Nord-Est, Nord-Sud etc.
Amicalement
0
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 4
2 juin 2010 à 22:24
Bonjour Guilou34

Humm il n'y a pas une erreur dans ta forumle

if (x2<x1) and (y2>y1)then g=400 +g

où 400 vaut 360

il est impossible d'avoir plus grand que 360 alors si j'utilise ta formule:

if (x2<x1) and (y2>y1)then g = 360 + g 'Ici g vaut 360


Éclaire moi si je fais une erreur
merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
4 juin 2010 à 11:02
Il n'y a pas d'erreur parce que dans ce cas G est négatif.
Je me suis peut-être mal exprimé : considérons deux points M1 et M2 de coordonnées x1,y1 et x2,y2.
Traçons un cercle ayant M1 pour centre et passant par M2. Traçons aussi deux diamètres orthogonaux X et Y.
En arpentage, les extrémités de ces diamètres sont notés Nord, Est ,Sud et Ouest. Les arcs sont mesurés à partir de Nord comme origine et varient donc de 0 à 360° dans le sens des aiguilles d'une montre. .
En trigonométrie, c'est le point Est qui est pris pour origine et les arcs varient de 0 à 360° dans les sens inverse des aiguilles d'une montre.
Si le point M2 est, par exemple, à 320° par rapport au Nord il sera donc à 130° en trigonométrie.
La tangente d'un arc est le rapport entre la distance de son extrémité à l'axe des X avec la distance de celle-ci avec l'axe des Y.

Prend une calculatrice, la tangente de 320° vaut -0,84 et l'arc tangente de cette valeur donne -40° et non pas 320° parce qu'en mathématique le Nord n'existe pas.

Amicalement
0
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 4
4 juin 2010 à 13:38
merci beaucoup
0
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 4
4 juin 2010 à 13:41
Je ne sais pas si c'est déjà fait mais si tu es encore aux études, va travailler en enseignement.

merci encore
0
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
11 juin 2010 à 11:54
Salut,

Aha, une question pour un topographe... Genial...
En utilisant la propriete des angles au centre d'un cercle, tu peux calculer le gisement sans reflechir au cadrant :

Pour le gisement de M1(X1,Y1) vers M2(X2,Y2) :

dx = X2 - X1
dy = Y2 - Y1

dist = (dx^2 + dy^2)^0.5

gis = 2 * atan(dx/(dy+dist))
et en grad, modulo 400
gis_grad = 200 * gis / pi mod 400

Les seules possibilites d'erreur surviennent quand M1 M2 et quand dx 0 et dy negatif (gisement de 200 grad).

La un test comme dans les posts precedents suffit.

A+,
Thomas.

Marin Marais
0
cs_JeffC1977 Messages postés 928 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 23 septembre 2023 4
11 juin 2010 à 13:56
merci je prends ca en note

tres aprécié

A+
0
Rejoignez-nous