Ver Mensaje Individual
  #6 (permalink)  
Antiguo 23-10-2003, 11:38:07
Jose Luis Diaz
 
Mensajes: n/a
Predeterminado Re: Dígitos segmentados

"Jesús Moreno" <jmonteverdeARROBA***ono.com> writes:

> Hola:
>
> Otra vez por aquí.
> Estoy haciendo un documento, en los que comento el
> funcionamiento de los dígitos de una calculadora. Sé que hay
> símbolos que me permiten escribir todos los dígitos usando
> "textifsym" y el paquete "ifsym", pero quiero ir un poco más
> allá.
> Necesito símbolos de varios segmentos que no tengan porqué
> formar dígitos. Por ejemplo, un carácter formado por el
> dígito superior, el medio y el derecho superior, etc.
> Si esto no lo hay, ¿cómo los puedo crear?


He programado unas macros en metapost que permiten generar cualquier
combinación de los siete segmentos. Lo que hace es asignar a cada
segmento un numero:

0
+----+
1| |2
| 3 |
+----+
4| |5
| 6 |
+----+

y recibe como parámetro una cantidad decimal entre 0 y 127. Cada bit
de esa cantidad indica si el correspondiente segmento debe estar
encendido o apagado. Así, para sacar el "3", hay que encender los
segmentos 0,2,3,5 y 6, lo que significa pasarle el parámetro
2^0+2^2+2^3+2^5+2^6 que es 109. Etc. La macro permite elegir el color
del display LCD, de los segmentos encendidos y de los segmentos
apagados. Por defecto pone el display blanco (papel), los encendidos a
negro y los apagados a gris muy clarito. Pero puedes usar cualquier
otro color si te mola más :-)

Usando esta macro he creado 127 figuras, una para cada combinación
posible (un simple bucle for), llamadas 7seg.0, 7seg.1, 7seg.2,
.... 7seg.127 (por ejemplo, la última tiene todos los segmentos
encendidos y por tanto es el "8"). Estas figuras son EPS y puedes
incluirlas en tu documento latex.

Este sería un ejemplo, para mostrar la cantidad 231, con dos "espacios
blancos" por la izquierda:

\documentclass{article}
\usepackage{graphicx}
\usepackage[latin1]{inputenc}

\DeclareGraphicsRule{*}{mps}{*}{} % Para que admita la extension .1, .2, etc

% Defino una macro para que sea más cómodo incluir las figuras,
% y que las escala además al tamaño de letra actual
\def\sseg#1{\includegraphics[width=1ex]{7seg.#1}}

\begin{document}
El resultado salió 231, es decir, el display mostró:
\fbox{\sseg{0}\sseg{0}\sseg{93}\sseg{109}\sseg{36} }.
\end{document}

Y a continuación el programa metapost que genera los 128
caracteres. Debes guardarlo con el nombre 7seg.mp y compilarlo con
mpost (forma parte de las distribuciones latex más corrientes). Si no
te aclaras con la compilación metapost, puedo enviarte por email los
128 ficheros que genera como resultado.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%
% 7seg.mp
% Genera las 128 combinaciones posibles de un display de
% siete segmentos
% (c) 2003 Jose Luis Diaz
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%
prologues:=2;

w:=1cm; % Ancho y alto de cada segmento
h:=3mm;

color encendido, apagado, fondo;

% Combinaciones de colores. Descomenta solo una de ellas

% Combinacion blanco, negro y gris
fondo:=white;
encendido:=black;
apagado:=.95white;

% Combinacion blanco y negro
% fondo:=white;
% encendido:=black;
% apagado:=white;

% Combinacion LCD
% fondo:=(.5,.99,.7);
% encendido:=(.1, .3, .2);
% apagado:=(.5,.9,.6);

% Combinación fosforo verde
% fondo:=black;
% encendido:=(.7,.99, .7);
% apagado:=(.1,.3,.1);

vardef segmento = % Macro que proporciona la forma de un segmento
save p;
pair p[];
p[0]=(-w/2,0);
p[1]=p[0] shifted (h/2, -h/2);
p[2]=p[3] shifted (-h/2, -h/2);
p[3]=(w/2, 0);
p[4]=-p[1];
p[5]=-p[2];
(for i:=0 upto 5: p[i]-- endfor cycle)
enddef;

% Macro que pinta los 7 segmentos, cada uno encendido o apagado
% segun los bits del entero que recibe como parámetro
vardef display(expr n) =
save p, r, m;
pair p[]; % Posición del centro de cada segmento
numeric r[]; % Rotación de cada segmento
numeric m;
m:=n;
% Inicialización de p y r. Los segmentos se numeran así:
%
% 0
% +----+
% 1| |2
% | 3 |
% +----+ <-- origen de coordenadas en el centro del
% 4| |5 segmento 3
% | 6 |
% +----+
%
p[3]=origin;
p[0]=p[3] shifted (0,w);
p[6]=-p[0];
p[1]=p[3] shifted (-w/2, w/2);
p[5]=-p[1];
p[4]=p[3] shifted (-w/2, -w/2);
p[2]=-p[4];
r[0]=r[3]=r[6]=0;
r[1]=r[2]=r[4]=r[5]=90;

% Pintar el rectángulo de fondo
filldraw (origin--(w+1.2h,0)--(w+1.2h,2w+1.2h)--(0,2w+1.2h)--cycle)
shifted (-w/2-1.2h/2, -w-1.2h/2) withcolor fondo;
% Y ahora los 7 segmentos
for i:=0 upto 6: % Recorrer los 7 segmentos
if (m mod 2=1): % Si activado, pintarlo en color encendido
filldraw segmento rotated r[i] shifted p[i] withcolor encendido;
draw segmento rotated r[i] shifted p[i]
withpen pencircle scaled .05w withcolor fondo;
else: % si no está activado, lo pintamos en color apagado
filldraw segmento rotated r[i] shifted p[i] withcolor apagado;
draw segmento rotated r[i] shifted p[i]
withpen pencircle scaled .05w withcolor fondo;
fi;
m:=(m - m mod 2)/2; % Desplazar para acceder al siguiente bit
endfor;
enddef;

% Y ahora generar las 128 figuras en un bucle for
for i:=0 upto 127:
beginfig(i);
display(i);
endfig;
endfor;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%
% Fin de 7seg.mp
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%

¡Que aproveche!
--
JL Diaz
Responder Con Cita