Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Pour sécuriser votre compte sur les forums du GeoRezo, nous demandons de changer votre mot de passe.

Vous allez recevoir un message pour effectuer ce changement de mot de passe.

Merci de bien respecter les règles préconisées.

#1 Thu 07 May 2009 17:07

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Calculer la direction d'une ligne par rapport au Nord

Chers tous,

J'essaie de calculer le direction en degrés par rapport au Nord de jeux de polylignes en utilisant le premier et le dernier noeud de chacune, dans le but de mettre à jour une colonne.
Or, les directions calculées ne donnent jamais des directions vers le NW ou le SE.

Je suis certaine qu'il s'agit d'une histoire de radians mais je n'arrive pas à passer outre.

Voici la syntaxe de ma requête:

Code:

Update table_name Set GeoAngle = (
                acos( 
                sqr( (ObjectNodeY(obj,1,ObjectInfo(obj,OBJ_INFO_NPNTS)) - ObjectNodeY(obj,1,1))*(ObjectNodeY(obj,1,ObjectInfo(obj,OBJ_INFO_NPNTS)) - ObjectNodeY(obj,1,1))) 
                / sqr((0.1+
                (ObjectNodeX(obj,1,ObjectInfo(obj,OBJ_INFO_NPNTS)) - ObjectNodeX(obj,1,1))
                *(ObjectNodeX(obj,1,ObjectInfo(obj,OBJ_INFO_NPNTS)) - ObjectNodeX(obj,1,1)) )
                + ((ObjectNodeY(obj,1,ObjectInfo(obj,OBJ_INFO_NPNTS)) - ObjectNodeY(obj,1,1))
                *(ObjectNodeY(obj,1,ObjectInfo(obj,OBJ_INFO_NPNTS)) - ObjectNodeY(obj,1,1)) )
                ))
                )* RAD_2_DEG

Sachant que ObjectInfo(obj,OBJ_INFO_NPNTS) me donne le nombre de noeuds de ma polyligne.

On aura un p'tit génie en trigonométrie?


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Thu 07 May 2009 17:51

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Calculer la direction d'une ligne par rapport au Nord

Classique des classiques: la question qui tue le soir du départ en WE, pas l'irremplaçable Miss T. big_smile

Hors ligne

 

#3 Thu 07 May 2009 17:51

xavier29
Participant actif
Lieu: 29170 FOUESNANT
Date d'inscription: 5 Sep 2005
Messages: 142
Site web

Re: Calculer la direction d'une ligne par rapport au Nord

Ah, on est presque vendredi... Miss T.   (Grillé par Maurice pour le commentaire!!!)
je regarde les formules tout à l'heure.


Xavier Germain

Dernière modification par xavier29 (Thu 07 May 2009 17:52)


SARL Géodésie: Cartographie Numérique
2 Résidence de Hent Du
29170 Fouesnant

Hors ligne

 

#4 Thu 07 May 2009 18:05

xavier29
Participant actif
Lieu: 29170 FOUESNANT
Date d'inscription: 5 Sep 2005
Messages: 142
Site web

Re: Calculer la direction d'une ligne par rapport au Nord

Pour répondre vite "desfois" que Miss T. ne veuille partir en week end, une réponse provenant de
http://williams.best.vwh.net/avform.htm#Crs
"Course" veut dire Cap en anglais, et cap c'est l'angle / au nord que fait la route du point 1 au point 2

Course between points

We obtain the initial course, tc1, (at point 1) from point 1 to point 2 by the following. The formula fails if the initial point is a pole. We can special case this with:

IF (cos(lat1) < EPS)   // EPS a small number ~ machine precision
  IF (lat1 > 0)
     tc1= pi        //  starting from N pole
  ELSE
     tc1= 2*pi         //  starting from S pole
  ENDIF
ENDIF

For starting points other than the poles:

IF sin(lon2-lon1)<0       
   tc1=acos((sin(lat2)-sin(lat1)*cos(d))/(sin(d)*cos(lat1)))   
ELSE       
   tc1=2*pi-acos((sin(lat2)-sin(lat1)*cos(d))/(sin(d)*cos(lat1)))   
ENDIF

An alternative formula, not requiring the pre-computation of d, the distance between the points, is:

   tc1=mod(atan2(sin(lon1-lon2)*cos(lat2),
           cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon1-lon2)), 2*pi)

et la distance d se calcule:
Distance between points

The great circle distance d between two points with coordinates {lat1,lon1} and {lat2,lon2} is given by:

d=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))

A mathematically equivalent formula, which is less subject to rounding error for short distances is:

d=2*asin(sqrt((sin((lat1-lat2)/2))^2 +
                 cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))

Dernière modification par xavier29 (Thu 07 May 2009 18:07)


SARL Géodésie: Cartographie Numérique
2 Résidence de Hent Du
29170 Fouesnant

Hors ligne

 

#5 Thu 07 May 2009 18:49

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Calculer la direction d'une ligne par rapport au Nord

Et pour lui laisser du "grain à moudre" pour le WE: il faut, pour exprimer tous les angles en degrés dans le sens trigo, distinguer dans quel quadrant du cercle trigonométrique on se trouve, en fonction du signe de sinus et cosinus...
En utilisant la tangente puis Arctangente (en distinguant par sélection ces 4 quadrantssuivant les signes de sinus et cosinus, calculés sans tenir compte de l'hypoténuse supposée valoir 1) je trouve le résultat ci-joint


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#6 Mon 11 May 2009 18:02

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: Calculer la direction d'une ligne par rapport au Nord

Merci les gars pour ces réponses.
Maurice, le champ MN, c'est la direction? Si oui, crois-tu qu'une ligne orientée NNE-SSW puisse avoir une direction de 70°?!?

Si j'ai bien compris (je résume car je suis une authentique biquette en trigo...):
1/ ajout des colonnes sin et cos, les remplir
2/ faire autant de requêtes que de "quartiers" trigonométriques pour trouver le quartier dans lequel on est:
Sin x > 0 et cos x > 0 ==> on est dans quart NE
Sin x < 0 et cos x > 0 ==> SE
Sin x < 0 et cos x < 0 ==> SW
Sin x > 0 et cos x < 0 ==> NW

Mais euh... (désolée pour la question, ça va être hyper... blond) comment on transpose l'angle du radian en degré en passant d'un cercle trigo à l'autre? (je vous avais prévenu...)
Sin x > 0 et cos x > 0 ==> NE => acos(cos x) * rad_2_deg
Sin x < 0 et cos x > 0 ==> SE => ?
Sin x < 0 et cos x < 0 ==> SW => ?
Sin x > 0 et cos x < 0 ==> NW => ?

Dernière modification par Miss T. (Mon 11 May 2009 18:03)

Hors ligne

 

#7 Mon 11 May 2009 18:23

xavier29
Participant actif
Lieu: 29170 FOUESNANT
Date d'inscription: 5 Sep 2005
Messages: 142
Site web

Re: Calculer la direction d'une ligne par rapport au Nord

Merci Miss T. pour la question-réponse à 18h03, cela va nous laisser du temps pour regarder ce soir!!!!


SARL Géodésie: Cartographie Numérique
2 Résidence de Hent Du
29170 Fouesnant

Hors ligne

 

#8 Mon 11 May 2009 18:46

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Calculer la direction d'une ligne par rapport au Nord

L'outil de base est bien le cercle trigo...
J'ai effectivement calculé sinus et cosinus pour savoir dans quel quartier on se trouve
J'ai aussi créé les "points de départ" pour orienter les polylignes (fichier joint)
Les valeurs des angles sont alors suivant le quartier, en degrés exprimés dans le sens trigo
Sin x > 0 et cos x > 0 ==> NE => angles de 0 à 90°
Sin x < 0 et cos x > 0 ==> SE => angles de 270 à 360°
Sin x < 0 et cos x < 0 ==> SW => angles de 180 à 270°
Sin x > 0 et cos x < 0 ==> NW => angles de 90 à 180°
J'ai ensuite utilisé, dans le champ MN, atn(tan x) = atn((Ymax-Ymin)/(Xmax-Xmin)) et, comme le résultat retourné par Atn( ) est, en radians, entre -Pi/2 radians et Pi/2 radians, j'ai ajouté ce qu'il faut pour tomber sur les valeurs ci-dessus dans chacune des 4 sélections...
Et une ligne qui part du NE pour aboutir dans le SW doit avoir un angle entre 180 et 270°...si on ne s'est pas trompé sur point de départ et point d'arrivée...ce qui a pu m'arriver smile


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#9 Tue 12 May 2009 10:02

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: Calculer la direction d'une ligne par rapport au Nord

Les valeurs des angles sont alors suivant le quartier, en degrés exprimés dans le sens trigo
Sin x > 0 et cos x > 0 ==> NE => angles de 0 à 90°
Sin x < 0 et cos x > 0 ==> SE => angles de 270 à 360°
Sin x < 0 et cos x < 0 ==> SW => angles de 180 à 270°
Sin x > 0 et cos x < 0 ==> NW => angles de 90 à 180°


Tu es sûr que ce n'est pas plutôt:
Sin x > 0 et cos x > 0 ==> NE => angles de 0 à 90°
Sin x < 0 et cos x > 0 ==> SE => angles de 90 à 180°
Sin x < 0 et cos x < 0 ==> SW => angles de 180 à 270°
Sin x > 0 et cos x < 0 ==> NW => angles de 270 à 360°

J'essaie vos formules.

Hors ligne

 

#10 Tue 12 May 2009 10:31

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Calculer la direction d'une ligne par rapport au Nord

Pas facile d'être explicite...
Aller en direction de = de l'origine vers l'extrémité
Une ligne qui va en direction du NE => Sin x > 0 et cos x > 0 => angles de 0 à 90°
Une ligne qui va en direction du NW => Sin x > 0 et cos x < 0 => angles de 90 à 180°
Une ligne qui va en direction du SW => Sin x < 0 et cos x < 0 => angles de 180 à 270° (ou de -90 à -180°)
Une ligne qui va en direction du SE => Sin x < 0 et cos x > 0 => angles de 270 à 360° (ou de 0 à -90°)

Hors ligne

 

#11 Tue 12 May 2009 16:28

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: Calculer la direction d'une ligne par rapport au Nord

Hu hu!

Si quelqu'un veut bien valider ça dans la fenêtre MapBasic (avec la table zippée envoyée précédemment par exemple), j'ai le cerveau farci (du moins, ce qu'il en reste...):

Code:

 dim table_name as string
dim rad_2_deg as float
rad_2_deg = 57.29577951
table_name = tableinfo(0, 1)   
  print table_name
    Update table_name Set GeoAngle = atn((ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1))/(0.001+(ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1))))* rad_2_deg
 
    'remise au cercle trigonométrique
    Select * from table_name where (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) > 0 and (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) >= 0  Into Orientation '==> NE => angles de 0 à 90°
    Update Orientation set GeoAngle = 90 - GeoAngle        
    Select * from table_name where (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) <= 0 and (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) >= 0  Into Orientation '==> SE => angles de 270 à 360°
    Update Orientation set GeoAngle = (GeoAngle * -1) + 90
    Select * from table_name where (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) <= 0 and (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) < 0  Into Orientation    '==> SW => angles de 180 à 270°
    Update Orientation set GeoAngle = 260 - GeoAngle
    Select * from table_name where (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) > 0 and (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) < 0  Into Orientation    '==> NW => angles de 270 à 360°
    Update Orientation set GeoAngle = (GeoAngle * -1) + 260
    
    'direction dans rose des vents
    Select * from  table_name where GeoAngle >=0 AND GeoAngle < 22.5  Into Orientation
    Update Orientation set Axe = "N"  
    Select * from  table_name where GeoAngle >=22.5 AND GeoAngle < 67.5  Into Orientation
    Update Orientation set Axe = "NE"          
    Select * from  table_name where GeoAngle >=67.5 AND GeoAngle < 112.5  Into Orientation
    Update Orientation set Axe = "E" 
    Select * from  table_name where GeoAngle >=112.5 AND GeoAngle < 157.5  Into Orientation
    Update Orientation set Axe = "SE"
    Select * from  table_name where GeoAngle >=157.5 AND GeoAngle < 202.5  Into Orientation
    Update Orientation set Axe = "S"
    Select * from  table_name where GeoAngle >=202.5  AND GeoAngle < 247.5  Into Orientation
    Update Orientation set Axe = "SW"         
    Select * from  table_name where GeoAngle >=247.5  AND GeoAngle < 292.5  Into Orientation
    Update Orientation set Axe = "W"    
    Select * from  table_name where GeoAngle >=292.5  AND GeoAngle < 337.5  Into Orientation
    Update Orientation set Axe = "NW"    
    Select * from  table_name where GeoAngle >=337.5  AND GeoAngle <= 360 Into Orientation
    Update Orientation set Axe = "N"

Si ça fonctionne, c'est cadeau pour le GeoRezo. big_smile

Hors ligne

 

#12 Tue 12 May 2009 18:09

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Calculer la direction d'une ligne par rapport au Nord

Encore une soirée télé de fichue sad

Hors ligne

 

#13 Tue 12 May 2009 18:36

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: Calculer la direction d'une ligne par rapport au Nord

Meu non, meu non.
Ca fonctionne. (en théorie).
A la limite, tu fais des lignes à convertir en polylignes avec 2 colonnes GeoAngle (flottant) et axe (2 caractères). et on voit bien à l'oeil l'angle approximatif...

Hors ligne

 

#14 Tue 12 May 2009 20:49

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Calculer la direction d'une ligne par rapport au Nord

Pour commencer je ne vois pas bien d'où sort ce 260 dans la "remise au cercle trigonométrique"...270 j'aurais mieux compris smile
Ensuite la dénomination des directions de la "rose des vents" est curieuse...Pour mémoire, voici une belle rose des vents: [img]http://kramvoussanos.unblog.fr/files/2009/02/rose20des20vents.png[/img]

Hors ligne

 

#15 Tue 12 May 2009 20:59

Damien BEAUSEIGNEUR
Participant assidu
Lieu: meyzieu
Date d'inscription: 5 Sep 2005
Messages: 425

Re: Calculer la direction d'une ligne par rapport au Nord

Bonsoir

Pas besoin de vérifier les formule de calcul des angles sont faux ...

désolé, mais arctangente donne une angle compris -pi/2 et pi/2 (donc -90, 90 en degrés) (enfin si les valeurs infinie peuvent être calculée)
personnellement et pour rester dans le même domaine je travaillerais avec arcsin. qui donne une réponse entre -pi/2 et pi/2

ensuite je vois pas le pourquoi de l'utilisation du 260°

Code:

 dim table_name as string
dim rad_2_deg as float
rad_2_deg = 57.29577951
table_name = tableinfo(0, 1)   
  print table_name
    Update table_name Set GeoAngle = asin( 
        (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) /
        sqr ( ((ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1))^2 + 
                ((ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1))^2 
              ) 
         )* rad_2_deg
 
    'remise au cercle trigonométrique
    Select * from table_name where (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) > 0 and (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) >= 0  Into Orientation '==> NE => angles de 0 à 90°
    Update Orientation set GeoAngle = GeoAngle        
    Select * from table_name where (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) <= 0 and (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) >= 0  Into Orientation '==> SE => angles de 270 à 360°
    Update Orientation set GeoAngle = GeoAngle
    Select * from table_name where (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) <= 0 and (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) < 0  Into Orientation    '==> SW => angles de 180 à 270°
    Update Orientation set GeoAngle = 180 - GeoAngle 'règle de trigo sin(X) = sin (180-X) et cos(X) = - cos (180-X) 
'l'angle trouvé sera compris entre (-90° et 0) donc  
'compris   entre 180 et 270
    Select * from table_name where (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) > 0 and (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) < 0  Into Orientation    '==> NW => angles de 90 à 180°
    Update Orientation set GeoAngle = 180 - GeoAngle 
    
    'direction dans rose des vents
    Select * from  table_name where GeoAngle >=0 AND GeoAngle < 22.5  Into Orientation
    Update Orientation set Axe = "E"  
    Select * from  table_name where GeoAngle >=22.5 AND GeoAngle < 67.5  Into Orientation
    Update Orientation set Axe = "NE"          
    Select * from  table_name where GeoAngle >=67.5 AND GeoAngle < 112.5  Into Orientation
    Update Orientation set Axe = "N" 
    Select * from  table_name where GeoAngle >=112.5 AND GeoAngle < 157.5  Into Orientation
    Update Orientation set Axe = "NW"
    Select * from  table_name where GeoAngle >=157.5 AND GeoAngle < 202.5  Into Orientation
    Update Orientation set Axe = "W"
    Select * from  table_name where GeoAngle >=202.5  AND GeoAngle < 247.5  Into Orientation
    Update Orientation set Axe = "SW"         
    Select * from  table_name where GeoAngle >=247.5  AND GeoAngle < 292.5  Into Orientation
    Update Orientation set Axe = "S"    
    Select * from  table_name where GeoAngle >=292.5  AND GeoAngle < 337.5  Into Orientation
    Update Orientation set Axe = "SE"    
    Select * from  table_name where GeoAngle >=337.5  AND GeoAngle <= 360 Into Orientation
    Update Orientation set Axe = "E"

correction faite pour tenir compte que le nord suite l'axe des y croissant...

cordialement

Dernière modification par Damien BEAUSEIGNEUR (Tue 12 May 2009 21:03)

Hors ligne

 

#16 Tue 12 May 2009 23:54

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Calculer la direction d'une ligne par rapport au Nord

Le film était bien...
J'ai juste écrit ça, avec ArcTangente (désolé !), en faisant au début une sélection pour créer la table provisoire "tata" dont l'objet est juste de rendre le code un peu plus lisible

Code:

include "mapbasic.def"
dim table_name as string
dim deltaY, deltaX as float 

table_name = TableInfo(1, 1)   
Select Nb_Noeuds, Sinuosite, GeoAngle, Axe, (ObjectNodeY(obj,1,ObjectInfo(obj,20)) - ObjectNodeY(obj,1,1)) "deltaY", (ObjectNodeX(obj,1,ObjectInfo(obj,20)) - ObjectNodeX(obj,1,1)) "deltaX" from Pour_GeoRezo into tata
 
    'remise au cercle trigonométrique        
 Select * from tata where deltaY > 0 and deltaX > 0  Into Orientation  '==> NE => angles de 0 à 90°
  Update Orientation Set GeoAngle = atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg
 Select * from tata where deltaY > 0 and deltaX < 0  Into Orientation  '==> NW => angles de 90 à 180°
  Update Orientation Set GeoAngle = atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg+90
 Select * from tata where deltaY < 0 and deltaX < 0  Into Orientation  '==> SW => angles de 180 à 270°
  Update Orientation Set GeoAngle = atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg+180
 Select * from tata where deltaY < 0 and deltaX > 0  Into Orientation  '==> SE => angles de 270 à 360°
  Update Orientation Set GeoAngle = atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg
 Close Table tata
 Commit Table table_name

    'direction dans rose des vents
 Select * from  table_name where GeoAngle between 0 AND 22.5 Into Orientation
  Update Orientation set Axe = "E"  
 Select * from  table_name where GeoAngle between 22.5 AND 67.5 Into Orientation
  Update Orientation set Axe = "NE"          
 Select * from  table_name where GeoAngle between 67.5 AND 112.5 Into Orientation
  Update Orientation set Axe = "N" 
 Select * from  table_name where GeoAngle between 112.5 AND 157.5 Into Orientation
  Update Orientation set Axe = "NW"
 Select * from  table_name where GeoAngle between 157.5 AND 202.5 Into Orientation
  Update Orientation set Axe = "W"
 Select * from  table_name where GeoAngle between 202.5 AND 247.5 Into Orientation
  Update Orientation set Axe = "SW"         
 Select * from  table_name where GeoAngle between 247.5 AND 292.5 Into Orientation
  Update Orientation set Axe = "S"    
 Select * from  table_name where GeoAngle between 292.5  AND 337.5 Into Orientation
  Update Orientation set Axe = "SE"    
 Select * from  table_name where GeoAngle between 337.5  AND 360 Into Orientation
  Update Orientation set Axe = "E" 
 Close Table Orientation
 Commit Table table_name
 Run Menu Command 304

Reste à vérifier que ce code (intitulé MissTrigo.mb big_smile) donne satisfaction..

Hors ligne

 

#17 Wed 13 May 2009 10:02

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: Calculer la direction d'une ligne par rapport au Nord

Autant pour moi pour le 260°: un bug de cerveau après 3h de trigo infernale...

Damien, je suis désolée mais tu ne me feras pas avaler qu'une trajectoire allant vers le SE a une direction comprise entre 270 à 360°... (voir angles sur rose des vents en PJ)

arctangente donne une angle compris -pi/2 et pi/2 (donc -90, 90 en degrés) (enfin si les valeurs infinie peuvent être calculée)
personnellement et pour rester dans le même domaine je travaillerais avec arcsin. qui donne une réponse entre -pi/2 et pi/2


Quelle est la différence entre une valeur comprise entre -pi/2 et pi/2 et -pi/2 et pi/2?

Maurice, si tu dessines de nouvelles trajectoires, en les faisant toutes partir à peu près du même point (histoire d'avoir une espèce de rose des vents), ton code fonctionne? la flèche Nord est-elle bien aux alentours de 0°? (voir ce que moi j'obtiens en PJ).

Dernière modification par Miss T. (Wed 13 May 2009 10:03)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#18 Wed 13 May 2009 10:21

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: Calculer la direction d'une ligne par rapport au Nord

Miss T. a écrit:

...la flèche Nord est-elle bien aux alentours de 0°? ...


Effectivement non !!
Les directions sont "orientées", soit un 0° pointant vers l'Est (l'orient)
Le code est donc écrit pour un Nord à 90° smile

Hors ligne

 

#19 Wed 13 May 2009 10:46

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: Calculer la direction d'une ligne par rapport au Nord

Mon code ne donnait-il pas des bonnes directions?
Si non, quel(s) quart(s) était(ent) concerné(s)?

Hors ligne

 

#20 Wed 13 May 2009 12:03

Damien BEAUSEIGNEUR
Participant assidu
Lieu: meyzieu
Date d'inscription: 5 Sep 2005
Messages: 425

Re: Calculer la direction d'une ligne par rapport au Nord

Désolé mais non,

L'axe des X pointe toujours vers l'est, ensuite, pour l'écriture il faut parcourir la rose des vents dans le sens trigonométrique
donc le sens opposé au sens des aiguilles d'une montre... et non pas dans le sens des aiguilles d'une montre comme tu l'as écrit.

Ce n'est pas grave d'utiliser arctangente à la place d'arcsin, sauf pour les cas ou cos X = 0...
d'ou la modif pour éviter le 0 dans les calculs...
J'ai utilisé le sinus pour rester dans le même type de formule pour la détermination de l'angle réel...
pour la tangente ,il faut faire attention...

J'ai fait une petite erreur hier dans mon code ... Mon résultat variais de -90 à 270 et non pas de 0 à 360

poursuivons...
de 90 à 180° le sinus est positif et le cosinus est négatif. Donc arctangente varie de -90 à 0 donc + 180
Si + 90 alors géoangle dans ce cas variera entre 0 et 90 désolé maurice...

déterminer l'angle avec le cosinus est plus facile...compris entre -1 et 1 le cosinus varie de 0 à 180°
si le sinus est négatif l'angle est négatif donc -180 à 0... reste plus qu'a lui ajouter 360.. pour une variation de 180 à 360

Code:

Select * from tata where deltaY > 0 and deltaX < 0  Into Orientation  '==> NW => angles de 90 à 180°
  Update Orientation Set GeoAngle = atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg+180
'tangente (X) <0  attention -90 <= arctangente (X) < 0'
Select * from tata where deltaY < 0 and deltaX < 0  Into Orientation  '==> SW => angles de 180 à 270°
  Update Orientation Set GeoAngle = atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg+180
' tangente (X)>=0 donc 0 <= arctangente (X) <= 90
Select * from tata where deltaY < 0 and deltaX > 0  Into Orientation  '==> SE => angles de 270 à 360°
  Update Orientation Set GeoAngle = atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg+360
'dans ce cas tangente négative. comme on veut une valeur positive, on rajoute un tour de roue

Dernière modification par Damien BEAUSEIGNEUR (Wed 13 May 2009 12:04)

Hors ligne

 

#21 Wed 13 May 2009 14:01

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: Calculer la direction d'une ligne par rapport au Nord

A vrai dire, je suis une biquette en trigo donc je ne vais pas me lancer dans un débat là-dessus...

Ceci dit, ce n'est toujours pas bon: voir bmp en PJ...

Dernière modification par Miss T. (Wed 13 May 2009 14:04)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#22 Wed 13 May 2009 14:40

Damien BEAUSEIGNEUR
Participant assidu
Lieu: meyzieu
Date d'inscription: 5 Sep 2005
Messages: 425

Re: Calculer la direction d'une ligne par rapport au Nord

méa culpa...
il faut enlever (abs()) dans la formule....
tel que c'est écrit la arctangente donnera toujours une valeur comprise entre 0 et pi/2
ou changer le calcul de l'angle.
compte tenu du réglage le + 0.001 pour éviter le 0 je garde la valeur absolue...

Code:

Select * from tata where deltaY > 0 and deltaX < 0  Into Orientation  '==> NW => angles de 90 à 180°
  Update Orientation Set GeoAngle = 180 - atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg
'cela revient à retirer l'angle de 180 puisque l'on retourne en arrière
Select * from tata where deltaY < 0 and deltaX < 0  Into Orientation  '==> SW => angles de 180 à 270°
  Update Orientation Set GeoAngle = 180 + atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg
' cas inverse
Select * from tata where deltaY < 0 and deltaX > 0  Into Orientation  '==> SE => angles de 270 à 360°
  Update Orientation Set GeoAngle = 360 - atn(abs(0.001+deltaY)/abs(0.001+deltaX))* rad_2_deg
' pour retirer l'angle au tour complet...

On y arrive, les formules deviennent compliquée... je trouve tout ça pour éviter le cos(X) = 0... et la distance nulle...
enfin là ça devrait marcher...

Hors ligne

 

Pied de page des forums

Powered by FluxBB