Arc Tan avec une valeur 0 que faire ?

Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
- - Dernière réponse : cs_JeffC1977
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
- 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
Afficher la suite 

9 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
0
Merci
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)
Commenter la réponse de cs_Jack
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
1
0
Merci
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
Commenter la réponse de cs_JeffC1977
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
0
Merci
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
Commenter la réponse de Guilou34
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
1
0
Merci
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
Commenter la réponse de cs_JeffC1977
Messages postés
142
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
29 janvier 2016
1
0
Merci
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
Commenter la réponse de Guilou34
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
1
0
Merci
merci beaucoup
Commenter la réponse de cs_JeffC1977
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
1
0
Merci
Je ne sais pas si c'est déjà fait mais si tu es encore aux études, va travailler en enseignement.

merci encore
Commenter la réponse de cs_JeffC1977
Messages postés
106
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
16 juillet 2010
0
Merci
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
Commenter la réponse de marinmarais
Messages postés
929
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
10 septembre 2010
1
0
Merci
merci je prends ca en note

tres aprécié

A+
Commenter la réponse de cs_JeffC1977