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!
%macro arrow(
x1, y1, /* start point */
x2, y2, /* end point, with arrow head */
vechead=2.0 0.5, /* head length and perpendicular offset */
color=,
vtoh=1 /* plot aspect ratio in XSYS,YSYS coordinates */
);
%let singular = 1e-8; /* approximate zero */
*------set up vector heads------;
%let headr = %scan(%bquote(&vechead),1,%str( ));
%let headw = %scan(%bquote(&vechead),2,%str( ));
%if %length(%bquote(&headw)) = 0 %then %let headr = ;
%if %length(%bquote(&vechead)) = 0 or %length(%bquote(&headw))
%then %let vechead = %str( );
drop vecslope headx heady xonvec yonvec;
comment = 'vector ';
%if %length(&color) %then
%str(color="&color");
%line(&x1, &y1, &x2, &y2);
%if %length(&headw) %then %do;
comment = 'vechead';
*------compute slope of vector------;
vecslope = &x2 - &x1;
if abs(vecslope) > &singular then
vecslope = (&y2 - &y1) / (vecslope / (&vtoh));
else vecslope = .;
*------find point on vector headr distance from end------;
%*linept(xtick,&nlines - ytick,headx,heady,vecslope,-&headr);
%linept(&x2,&y2,headx,heady,vecslope,-&headr);
*------slope of line perpendicular to vector------;
if vecslope = . then vecslope = 0;
else if abs(vecslope) > &singular
then vecslope = -1.0 / vecslope;
else vecslope = .;
*------draw vector head------;
%linept(headx,heady,xonvec,yonvec,vecslope,-&headw);
line=1;
x = xonvec; y = yonvec; function = 'DRAW '; output;
%linept(headx,heady,xonvec,yonvec,vecslope,&headw);
%line(&x2,&y2,xonvec,yonvec);
%end;
%mend;
1
%macro arrow(
2
x1, y1, /* start point */
3
x2, y2, /* end point, with arrow head */
4
vechead=2.00.5, /* head length and perpendicular offset */
5
color=,
6
vtoh=1/* plot aspect ratio in XSYS,YSYS coordinates */
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!
*------draw a line------;
%macro line(x1,y1,x2,y2);
x = &x1; y = &y1; function = 'MOVE '; output;
x = &x2; y = &y2; function = 'DRAW '; output;
%mend line;
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!
*------find a point (px,py) r distance from (x,y) on a ------;
*------line with slope m, negative r means toward origin------;
%macro linept(x,y,px,py,m,r);
drop vecdir vecm2;
vecdir = -sign(&r);
if &m ne . then do;
vecm2 = sqrt((&r) * (&r) / (1.0 + (&m) * (&m)));
if (&x) > (&x1) then vecm2 = -vecm2;
&px = vecdir * vecm2 + (&x);
&py = vecdir * (&m) * vecm2 / (&vtoh) + (&y);
end;
else do;
&px = (&x);
&py = abs(&r);
if (&y) > (&y1) then vecdir = -vecdir;
&py = vecdir * (&py) / (&vtoh) + (&y);
end;
%mend linept;
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 . THENDO;
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
ELSEDO;
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.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.