Publié le :
Macro CREATION_INTERNE

Macros pour le traçage de flèches et lignes

Ce code est également disponible en : Deutsch Español
En attente de validation
Le script comprend trois macros principales : '%arrow' qui trace une flèche entre deux points avec une tête personnalisable, '%line' qui trace une simple ligne droite, et '%linept' qui calcule un point à une distance donnée le long d'une ligne avec une pente spécifique. Ces macros sont des outils de bas niveau pour la génération de graphiques vectoriels au sein de SAS©, utilisant des variables 'x', 'y' et 'function' typiques des jeux de données d'annotation SAS©/GRAPH. Elles sont pensées pour être appelées dans un DATA step générant un dataset d'annotation.
Analyse des données

Type : CREATION_INTERNE


Les macros ne lisent pas de données existantes issues de tables ou de fichiers externes. Elles génèrent des points (x, y) et des fonctions ('MOVE', 'DRAW') qui sont ensuite 'output' dans un jeu de données d'annotation SAS/GRAPH. Elles servent donc à la création de données graphiques plutôt qu'à leur traitement.

1 Bloc de code
MACRO %ARROW Data
Explication :
La macro '%arrow' est le cœur du système. Elle prend les coordonnées de début (x1, y1) et de fin (x2, y2) d'une flèche, ainsi que des paramètres pour la taille de la tête de flèche (vechead) et sa couleur. Elle commence par tracer la ligne principale de la flèche en appelant '%line'. Ensuite, si une tête de flèche est spécifiée, elle calcule la pente du vecteur, puis utilise '%linept' pour déterminer les points qui formeront la tête de flèche. Les variables 'x', 'y' et 'function' sont manipulées et 'output' pour construire l'objet graphique dans un dataset d'annotation. Elle gère les cas de pentes nulles pour éviter les divisions par zéro.
Copié !
1%macro arrow(
2 x1, y1, /* start point */
3 x2, y2, /* end point, with arrow head */
4 vechead=2.0 0.5, /* head length and perpendicular offset */
5 color=,
6 vtoh=1 /* plot aspect ratio in XSYS,YSYS coordinates */
7 );
8 
9%let singular = 1e-8; /* approximate zero */
10*------SET up vector heads------;
11%let headr = %scan(%bquote(&vechead),1,%str( ));
12%let headw = %scan(%bquote(&vechead),2,%str( ));
13%IF %LENGTH(%bquote(&headw)) = 0 %THEN %let headr = ;
14%IF %LENGTH(%bquote(&vechead)) = 0 or %LENGTH(%bquote(&headw))
15 %THEN %let vechead = %str( );
16 drop vecslope headx heady xonvec yonvec;
17 comment = 'vector ';
18 %IF %LENGTH(&color) %THEN
19 %str(color="&color");
20 %line(&x1, &y1, &x2, &y2);
21 
22 %IF %LENGTH(&headw) %THEN %DO;
23 comment = 'vechead';
24 *------compute slope of vector------;
25 vecslope = &x2 - &x1;
26 IF abs(vecslope) > &singular THEN
27 vecslope = (&y2 - &y1) / (vecslope / (&vtoh));
28 ELSE vecslope = .;
29
30 *------find point on vector headr distance from end------;
31 %*linept(xtick,&nlines - ytick,headx,heady,vecslope,-&headr);
32 %linept(&x2,&y2,headx,heady,vecslope,-&headr);
33
34 *------slope of line perpendicular to vector------;
35 IF vecslope = . THEN vecslope = 0;
36 ELSE IF abs(vecslope) > &singular
37 THEN vecslope = -1.0 / vecslope;
38 ELSE vecslope = .;
39
40 *------draw vector head------;
41 %linept(headx,heady,xonvec,yonvec,vecslope,-&headw);
42 line=1;
43 x = xonvec; y = yonvec; function = 'DRAW '; OUTPUT;
44 %linept(headx,heady,xonvec,yonvec,vecslope,&headw);
45 %line(&x2,&y2,xonvec,yonvec);
46 %END;
47
48%mend;
2 Bloc de code
MACRO %LINE Data
Explication :
La macro '%line' est une utilité simple pour dessiner une ligne. Elle accepte les coordonnées de début (x1, y1) et de fin (x2, y2). Elle utilise la fonction 'MOVE ' pour positionner le curseur au point de départ sans tracer, puis 'DRAW ' pour tracer une ligne jusqu'au point final. Chaque paire de coordonnées avec sa fonction est 'output' pour être ajoutée au dataset d'annotation.
Copié !
1*------draw a line------;
2%macro line(x1,y1,x2,y2);
3
4 x = &x1; y = &y1; function = 'MOVE '; OUTPUT;
5 x = &x2; y = &y2; function = 'DRAW '; OUTPUT;
6
7 %mend line;
3 Bloc de code
MACRO %LINEPT
Explication :
La macro '%linept' est une fonction de calcul qui détermine les coordonnées d'un nouveau point (px, py) à une distance 'r' d'un point existant (x, y) le long d'une ligne ayant une pente 'm'. La direction est contrôlée par le signe de 'r'. Elle gère deux cas principaux : quand la pente 'm' est définie (ligne non verticale) et quand 'm' est manquante (ligne verticale). Elle calcule les nouvelles coordonnées en utilisant des principes géométriques et les attribue aux variables de macro 'px' et 'py'. Cette macro est un utilitaire interne utilisé par '%arrow' pour calculer les positions des éléments de la tête de flèche.
Copié !
1*------find a point (px,py) r distance from (x,y) on a ------;
2*------line with slope m, negative r means toward origin------;
3%macro linept(x,y,px,py,m,r);
4
5 drop vecdir vecm2;
6 vecdir = -sign(&r);
7
8 IF &m ne . THEN DO;
9 vecm2 = sqrt((&r) * (&r) / (1.0 + (&m) * (&m)));
10 IF (&x) > (&x1) THEN vecm2 = -vecm2;
11 &px = vecdir * vecm2 + (&x);
12 &py = vecdir * (&m) * vecm2 / (&vtoh) + (&y);
13 END;
14
15 ELSE DO;
16 &px = (&x);
17 &py = abs(&r);
18 IF (&y) > (&y1) THEN vecdir = -vecdir;
19 &py = vecdir * (&py) / (&vtoh) + (&y);
20 END;
21
22 %mend linept;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.