Publicado el :
Macro CREATION_INTERNE

Macros para el trazado de flechas y líneas

Este código también está disponible en: Deutsch Français
En espera de validación
El script incluye tres macros principales: '%arrow' que traza una flecha entre dos puntos con una cabeza personalizable, '%line' que traza una línea recta simple, y '%linept' que calcula un punto a una distancia dada a lo largo de una línea con una pendiente específica. Estas macros son herramientas de bajo nivel para la generación de gráficos vectoriales dentro de SAS©, utilizando variables 'x', 'y' y 'function' típicas de los conjuntos de datos de anotación SAS©/GRAPH. Están pensadas para ser llamadas en un paso DATA que genera un conjunto de datos de anotación.
Análisis de datos

Type : CREATION_INTERNE


Las macros no leen datos existentes de tablas o archivos externos. Generan puntos (x, y) y funciones ('MOVE', 'DRAW') que luego se 'output' en un conjunto de datos de anotación SAS/GRAPH. Por lo tanto, sirven para la creación de datos gráficos en lugar de su procesamiento.

1 Bloque de código
MACRO %ARROW Data
Explicación :
La macro '%arrow' es el corazón del sistema. Toma las coordenadas de inicio (x1, y1) y fin (x2, y2) de una flecha, así como parámetros para el tamaño de la cabeza de flecha (vechead) y su color. Comienza trazando la línea principal de la flecha llamando a '%line'. Luego, si se especifica una cabeza de flecha, calcula la pendiente del vector y luego usa '%linept' para determinar los puntos que formarán la cabeza de flecha. Las variables 'x', 'y' y 'function' se manipulan y se 'output' para construir el objeto gráfico en un conjunto de datos de anotación. Gestiona los casos de pendientes nulas para evitar divisiones por cero.
¡Copiado!
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 Bloque de código
MACRO %LINE Data
Explicación :
La macro '%line' es una utilidad simple para dibujar una línea. Acepta las coordenadas de inicio (x1, y1) y fin (x2, y2). Utiliza la función 'MOVE ' para posicionar el cursor en el punto de inicio sin trazar, y luego 'DRAW ' para trazar una línea hasta el punto final. Cada par de coordenadas con su función se 'output' para ser añadido al conjunto de datos de anotación.
¡Copiado!
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 Bloque de código
MACRO %LINEPT
Explicación :
La macro '%linept' es una función de cálculo que determina las coordenadas de un nuevo punto (px, py) a una distancia 'r' de un punto existente (x, y) a lo largo de una línea con una pendiente 'm'. La dirección se controla por el signo de 'r'. Gestiona dos casos principales: cuando la pendiente 'm' está definida (línea no vertical) y cuando 'm' está ausente (línea vertical). Calcula las nuevas coordenadas utilizando principios geométricos y las asigna a las variables de macro 'px' y 'py'. Esta macro es una utilidad interna utilizada por '%arrow' para calcular las posiciones de los elementos de la cabeza de flecha.
¡Copiado!
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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.