rutigraf.pro



%	trace

	code = 5000
domains
	i     = integer
	r     = real
	st    = string
	s     = symbol
	file  = valores
	li    = i*
	lr    = r*
	div   = x(r,r,r,i,i,i);y(r,r,r,i,i,i)
	key   = arr;		% cursor hacia arriba
		aba;		% cursor hacia abajo
		der;		% cursor hacia la derecha
		izq;		% cursor hacia la izquierda
		%ins;		%
		%del;		%
		esc;		% cancelar
		rpag;		% reduce el brinco del cursor [SNAP]
		apag;		% incrementa el brinco del cursor [SNAP]
% ___________________________________________________________________________
% --------------------     Predicados    ------------------------------------
%                          ----------
predicates
	a_key(key) b_key(i,key) e_tecla(key)
	nondeterm key(i,key)
	cero1(i,i,r,r,i,r) 		      % (i,i,i,i,o,o)
	nondeterm color(i,i,i)		      % (i,i,o)
	color_cursor(s,i,i)		      % (i,o,i) - (tipo_video,color_cursor,color_fondo)
	conv(i,i,i,r,r,i,st)		      % (i,i,i,i,i,i,o)
	convierte(s,r,i,r,r,i,i,i)	      %	(i,i,o,i,i,i,i,i,i)
	coordenadas(i,i,i,i)		      % (i,i,o,o)
	cruce1
	cuenta(i,i)			      % (i,o) [cantidad de elementos de cada curva]
	cuenta1
	div(s,i,i,r,r,i,i,i,i,i)	      % (i,i,i,i,i,i,i,i,i,i)
	div_ejes(div,div)		      % (x(i,i,i,i,i,i),y(i,i,i,i,i,i))
	driver(s,i)			      % (i,o) - (o,i)
os)
	ejes2				      % [letreros]
	graf(r,r)			      % (i,i)
 imagen fija)
	inicia
	inter(i,i)
	inter1
	mezcla_max(i,i)			      % (i,i)  (al mezclar, cual es mayor)
	mar(s,i,st,i,i,i,i)		      % (i,o,i,o,o,o,o)
	max(r,r,r)			      % (i,i,o)
	min(r,r,r)			      % (i,i,o)
	min1(i,i,i)			      % (i,i,o)
	modo_grafico
	nondeterm for(i,i,i,i)		      % (i,i,o,i)
	obten_real(r,r,r,i,i,i,i,st)	      % (i,i,i,i,i,i,i,o)  (Ri,R0,Rf,Li,L0,Lf,L,R)
	pos(s,i,i,i,i)			      % (i,o,o,o) [video,#,ren,col1,col2]
	resta
	revisa_m(r,r)                         % (i,i) (Ma,Mb)  (revisa si las rectas se cruzan)
	run				      % - activa el control de catalogos
	run1
	tletra(i,i,i,i)			      % (i,o,o,o)
	traza_ejes(i,i,i,i,i,r,r,r,r)	      % (i,i,i,i,i,i,i,i,i)
	valor_n(i,i,i)			      % (i,i,i) [#,cantidad,control)
	ventana(s,i,i,i,i,i,i,i,i,i,i,i,i,i,i)% (i,i,o's) (tipo_video, #,izq,sup,der,inf)
% ___________________________________________________________________________
%                         ----- -- ----- ---------
database - video
	video(i,i)		%  -(G_driver,G_mode)-
database - ejes			%  -[valores extremos de los ejes xy]
	ejex(i,r,r)		%  -(#, px, gx)
	ejey(i,r,r)		%  -(#, py, gy)
	cero(i,st)		%  -(#, 0x)     --  [cruce por cero]
database - grafica
	grafica(i,div,div)
	modif(i)		%  -(#)
	mezcla(i)		%  -(#)  (filtra las funciones a graficar)
	activa(i)
	act(r,r,r,r,r,r,r,r)	%  -(xa1,ya1,xa2,ya2,xb1,yb1,xb2,yb2)
	act1(i)			%  -(i) [contador auxiliar para las intersecciones]
database - vxy			%  -[Datos de los ejes coordenados]
	vxy(i,r,r)		%  -(#, Vx, Vy)-
database - coord		%  -[datos coordenados en pantalla]
	coord(i,i)		%  -(x_ant_pant, y_ant_pant)-
   f(i,i,i,i)			%  -(Xanterior,Yanterior,Xnueva,Ynueva)
database - brinco		%  -[almacena el brinco SNAP del cursor]
   brinco(i)			%  -(Incremento)   es el SNAP.
   cambio(i)			%  -(cambio?)	detecta si no es flecha.
   				%  - cambio = 1      no funciona fantasma.
   f6(i)			%  -( f6 = 1  [F6] activada. no se ve nada
   				%  -( f6 = _  [F6] desactivada. se ve cursor.
% ___________________________________________________________________________
%                       --------- - ------

clauses
	cero1(Li,Lf,_,0,L0,0) if		%  (Vi = -) (Vf = 0)
		abs(Lf - Li) = L0 and !.
	cero1(Li,Lf,_,Vf,L0,Vf) if		%  (Vi = -) (Vf = -)
		Vf < 0 and abs(Lf - Li) = L0 and !.
 		Vi >= 0 and !.
	cero1(Li,Lf,Vi,Vf,L0,0):-		%  (Vi = -) (Vf = +)
 		abs(Lf - Li) = Lii and abs(Vf) + abs(Vi) = Vr and
 		L0 = (abs(Vi) * Lii) / Vr and !.

	for(Val,_,Val,_).			% enteros
	for(Val,Max,I,Inc):- Val2=Val+Inc, Val2 <= Max, for(Val2,Max,I,Inc).
	gr("1/4"). gr("2/4"). gr("3/4"). gr("4/4"):-!.

	mezcla_max(K1,K2):-
		ejex(K1,Xi1,Xf1), ejey(K1,Yi1,Yf1),
		ejex(K2,Xi2,Xf2), ejey(K2,Yi2,Yf2),
		min(Xi1,Xi2,Xim), min(Yi1,Yi2,Yim),
		max(Xf1,Xf2,Xfm), max(Yf1,Yf2,Yfm),
		retractall(ejex(5,_,_),ejes), retractall(ejey(5,_,_),ejes),
		asserta(ejex(5,Xim,Xfm),ejes), asserta(ejey(5,Yim,Yfm),ejes).
	min(A,B,M):- A < B, !, M = A; B < A, !, M = B; B = A, !, M = A.
	max(A,B,M):- A > B, !, M = A; B > A, !, M = B; B = A, !, M = A.
	min1(A,B,M):- A < B, !, M = A; B < A, !, M = B; B = A, !, M = A.
	fantasma:-		% cursor ==> wi = 10  hi = 10
	    cambio(1), !;
	    f6(1),     !;
	    video(Driver,_), driver(Gname,Driver), imagen(Gname,B,E,T,Y),
	    f(Xa,Ya,Xn,Yn),
	    Xa1 = Xa - 10, Ya1 = Ya - 10,
	    Xn1 = Xn - 10, Yn1 = Yn - 10, Xn2 = Xn + 10, Yn2 = Yn + 10,
	    color_cursor(Gname,C,C1), setcolor(C), line(Xn1,Yn,Xn2,Yn), line(Xn,Yn1,Xn,Yn2),
	    setcolor(C1), retractall(_,cambio), !.
	imagen(herc,650,195,670,215):-!. imagen(vga, 580,270,600,290):-!.
	imagen(ega, 580,195,600,215):-!. imagen(cga, 284,105,304,125):-!.
			imagen(otro,100,100,120,120):-!.
	actualiza(Xn,Yn):-
		f(_,_,Xa,Ya), retractall(_,f), retractall(_,cambio),
		asserta(f(Xa,Ya,Xn,Yn),f), !.

	obten_real(Ri,R0,Rf,Li,L0,Lf,L,R):-
		L = Li, str_real(Lst,Ri), recorta(8,Lst,R), !;
		L = L0, str_real(Lst,R0), recorta(8,Lst,R), !;
		L = Lf, str_real(Lst,Rf), recorta(8,Lst,R), !;
		L < Li, R = "        ", !; L > Lf, R = "        ", !;
		L < L0, conv(8,Li,L0,Ri,R0,L,R), !;
		L < Lf, conv(8,Lf,L0,Rf,R0,L,R), !.
% ___________________________________________________________________________
% --------------------     TIPOS DE MONITOR   -------------------------------
%                          ----- -- -------
% ---------------------------------------------------------------------------
	% ventanas        720 x 348
	ventana(herc, 1,555,1,  710,185,0,0,0,0,0,0,0,0,0):-!.				% valores extremos -----
	ventana(herc, 2,555,223,710,335,0,0,0,0,0,0,0,0,0):-!.				% logo		   -----
	ventana(herc, 3,555,187,710,221,0,0,0,0,0,0,0,0,0):-!.				% transitorios     -----
	ventana(herc, 4,1,  302,550,335,0,0,0,0,0,0,0,0,0):-!.				% intersecciones   -----
	% adornos
	ventana(herc, 5,560,6,  21, 36, 56,71, 86, 102,119,142,157,172,190):-!.		% letreros             -----
	ventana(herc, 6,200,305,315,325,50,170,290,410,570,221,600,261,301):-!.		% intersecciones       -----
	ventana(herc, 7,580,21, 36, 71, 86,161,176,119,  0,  0,  0,  0,  0  ):-!.	% valores              -----
	ventana(herc, 8,580,157,172,128,660,136,0,0,0,0,0,0,0):-!.			% valores del fantasma
% ---------------------------------------------------------------------------
	% ventanas        640 x 480
	ventana(vga , 1,505,1,  637,250,0,0,0,0,0,0,0,0,0):-!.				% valores extremos     -----
	ventana(vga , 2,505,303,637,430,0,0,0,0,0,0,0,0,0):-!.				% logo		       -----
	ventana(vga , 3,505,252,637,301,0,0,0,0,0,0,0,0,0):-!.				% transitorios         -----
	ventana(vga , 4,1,  402,500,435,0,0,0,0,0,0,0,0,0):-!.				% intersecciones       -----
	% adornos
	ventana(vga , 5,510,8,23,38,78,93,108,138,153,188,203,218,258):-!.		% letreros	       -----
	ventana(vga , 6,200,405,415,425,40,160,280,400,520,320,550,350,380):-!.		% intersecciones       -----
	ventana(vga , 7,526,23,38,93,108,203,218,153,0,0,0,0,0):-!.			% valores	       -----
	ventana(vga , 8,526,203,218,233,600,248,0,0,0,0,0,0,0):-!.			% valores del fantasma -----
% ---------------------------------------------------------------------------
	% ventanas        640 x 350
	ventana(ega , 1,505,1,  638,183,0,0,0,0,0,0,0,0,0):-!.				% valores extremos     -----
	ventana(ega , 2,505,221,638,335,0,0,0,0,0,0,0,0,0):-!.				% logo		       -----
	ventana(ega , 3,505,185,638,219,0,0,0,0,0,0,0,0,0):-!.				% transitorios         -----
	ventana(ega , 4,1,  300,500,335,0,0,0,0,0,0,0,0,0):-!.				% intersecciones       -----
	% adornos
	ventana(ega , 5,510,8,23,38,53,68,83,98,113,128,143,158,188):-!.		% letreros	       -----
	ventana(ega , 6,200,305,315,325,30,150,270,390,515,221,545,261,301):-!.		% intersecciones       -----
	ventana(ega , 7,526,23,38,68,83,143,158,113,0,0,0,0,0):-!.			% valores	       -----
	ventana(ega , 8,526,143,158,250,600,258,0,0,0,0,0,0,0):-!.			% valores del fantasma -----
% ---------------------------------------------------------------------------
	% ventanas        640 x 350
	ventana(cga , 1,251,1,  319,100,0,0,0,0,0,0,0,0,0):-!.				% valores extremos     -----
	ventana(cga , 2,251,131,319,198,0,0,0,0,0,0,0,0,0):-!.				% logo		       -----
	ventana(cga , 3,251,101,319,130,0,0,0,0,0,0,0,0,0):-!.				% transitorios         -----
	ventana(cga , 4,1,  171,250,198,0,0,0,0,0,0,0,0,0):-!.				% intersecciones       -----
	% adornos
	ventana(cga , 5,254,2,10,18,26,34,42,50,58,66,74,82,102):-!.			% letreros	       -----
	ventana(cga , 6,90,171,180,188,10,70,130,190,254,135,270,155,175):-!.		% intersecciones       -----
	ventana(cga , 7,265,10,18,34,42,74,82,58,0,0,0,0,0):-!.				% valores	       -----
	ventana(cga , 8,265,74,82,90,295,98,0,0,0,0,0,0,0):-!.				% valores del fantasma -----
/*

	ventana(Gname,8,B,  E,  T,  I,  R,  A,_,_,_,_,_,_,_),
		getimage(B,I,R,A,Bit),
		putimage(B,E,Bit,0), putimage(B,T,Bit,0),
		outtextxy(B,E,Xr), outtextxy(B,T,Yr), !.


	ventana(Gname,7,A0,A1,A2,A3,A4,A5,A6,A7,_,_,_,_,_),
	     recorta(10,Gxs,Gxss), outtextxy(A0,A1,Gxss),
	     recorta(10,Gys,Gyss), outtextxy(A0,A2,Gyss),
	     recorta(10,Pxs,Pxss), outtextxy(A0,A3,Pxss),
	     recorta(10,Pys,Pyss), outtextxy(A0,A4,Pyss),
	     outtextxy(A0,A5,"        "), outtextxy(A0,A6,"        "),
	     cero(N,Cero), outtextxy(A0,A7,Cero), !.

	ventana(Gname, 5,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13),
	     outtextxy(B1,B2,"VALORES MAXIMOS"), outtextxy(B1,B3,"X="),outtextxy(B1,B4,"Y="),
	     outtextxy(B1,B5,"VALORES MINIMOS"), outtextxy(B1,B6,"X="),outtextxy(B1,B7,"Y="),
	     outtextxy(B1,B8,"CRUCE POR CERO"), outtextxy(B1,B9,"X="),
	     outtextxy(B1,B10,"VALOR DEL CURSOR"), outtextxy(B1,B11,"X="),outtextxy(B1,B12,"Y="),
	     outtextxy(B1,B13,"CURSOR:"),

        ventana(Gname, 6,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13),
	     outtextxy(E1,E2,"PUNTOS DE INTERSECCION"),
	     outtextxy(E5,E3,"X1="), outtextxy(E5,E4,"Y1="),
	     outtextxy(E6,E3,"X2="), outtextxy(E6,E4,"Y2="),
	     outtextxy(E7,E3,"X3="), outtextxy(E7,E4,"Y3="),
	     outtextxy(E8,E3,"X4="), outtextxy(E8,E4,"Y4="),
	     settextstyle(1,0,4), outtextxy(E9,E10,"UMSNH"),
	     outtextxy(E11,E12,"EIE"), outtextxy(E11,E13,"SID"),
*/
% ---------------------------------------------------------------------------
% ---------------------------------------------------------------------------
%                       ------- --------   --- - ---
	mar(herc,1,"1/4",1,170,1,350):- !. mar(herc,2,"2/4" ,1,170,360,719):- !.
	mar(herc,3,"3/4",180,340,1,350):- !.mar(herc,4,"4/4" ,180,340,360,719):- !.
			mar(herc,5,"1/5",1,300,1,550):- !.
% -------------------   Monitor  VGA  (640 x 480)  --------------------------
%                       -------  ---   --- - ---
	mar(vga,1,"1/4",1,235,1,315):- !. mar(vga,2,"2/4",1,235,325,639):- !.
	mar(vga,3,"3/4",245,478,1,315):- !. mar(vga,4,"4/4",245,478,325,639):- !.
			mar(vga,5,"1/5",1,400,1,500):-!.
% -------------------   Monitor  EGA  (640 x 350)  --------------------------
%                       -------  ---   --- - ---
	mar(ega,1,"1/4" ,1,170,1,350):-	!. mar(ega,2,"2/4" ,1,170,360,719):- !.
	mar(ega,3,"3/4" ,180,340,1,315):- !. mar(ega,4,"4/4" ,180,340,325,639):- !.
			mar(ega,5,"1/5",1,300,1,500):-	!.
% -----------------     Monitor  CGA  (640 x 200)  --------------------------
%                       -------  ---   --- - ---
	mar(cga,1,"1/4" ,1,95,1,160):-    !. mar(cga,2,"2/4" ,1,95,161,319):- !.
	mar(cga,3,"3/4" ,105,199,1,160):- !. mar(cga,4,"4/4" ,105,199,161,319):- !.
			mar(cga,5,"1/5",1,170,1,250):- !.
% -----------------  Monitor  OTRO  (320 x 200)  ----------------------------
%                    -------  ----   --- - ---
	mar(otro,1,"1/4" ,1,95,1,155):- !. mar(otro,2,"2/4" ,1,95,165,319):- !.
	mar(otro,3,"3/4" ,105,199,1,155):- !. mar(otro,4,"4/4" ,105,199,165,319):- !.
			mar(otro,5,"H1/2",1,95,1,319):- !.
% ___________________________________________________________________________
% ------------------------   drivers   --------------------------------------
%                            -------
	driver(cga,1):- !.   driver(ega,3):- !.   driver(ega,5):- !.
%          640 x 200             640 x 350              640 x 350
	driver(herc,7):- !.  driver(vga, 9):- !.  driver(otro,_):-!.
%          720 x 348             640 x 480              320 x 200
% ___________________________________________________________________________
%                           ------ ---- -------
	modo_grafico:-
		DetectGraph(G_Driver, G_Mode1), color(G_Driver,G_Mode1,G_Mode),
		retractall(_,video), asserta(video(G_driver,G_mode),video),
		InitGraph(G_Driver,G_Mode, _, _, bgi_Path),!.
	color(1,_,0). color(_,Mode,Mode).
	color_cursor(herc,2,15):- !. color_cursor(vga,2,15):- !.
	color_cursor(ega,1,7):- !.   color_cursor(cga,2,15):- !.
			color_cursor(otro,1,7):- !.
% ___________________________________________________________________________
%                      ----- - -------- -- ---- - -------

	div_ejes(x(Xi,X0,Xf,Lxi,Lxf,Yx0),y(Yi,Y0,Yf,Lyi,Lyf,Xy0)):-
		Lx = Lxf - Lxi,	% Ly = Lyi - Lyf,
		tletra(Lx,Letray,Liny,Digy),			  % de letra.
		Incx = (Lxf - Lxi)/10, Incy = (Lyi - Lyf)/10,
		div(x_,Xy0,Lxi,X0,Xi,Yx0,Linx,Letrax,Incx,Digx),  % (-x)
		div(x__,Xy0,Lxf,X0,Xf,Yx0,Linx,Letrax,Incx,Digx), % (+x)
		div(y_,Yx0,Lyi,Y0,Yi,Xy0,Liny,Letray,Incy,Digy),  % (-y)
		div(y__,Yx0,Lyf,Y0,Yf,Xy0,Liny,Letray,Incy,Digy). % (+y)

	tipo_letra(herc,1):- settextstyle(0,0,1), !. tipo_letra(vga,1):- settextstyle(0,0,1), !.
	tipo_letra(ega,1):- settextstyle(0,0,1), !. tipo_letra(cga,1):- settextstyle(2,0,2), !.
	tipo_letra(herc,2):- settextstyle(1,0,4), !. tipo_letra(vga,2):- settextstyle(1,0,4), !.
	tipo_letra(ega,2):- settextstyle(1,0,4), !. tipo_letra(cga,2):- settextstyle(1,0,1), !.

	tletra(Long,1,1,2):-	Long <= 180 and !.
	tletra(Long,3,1,5):-	Long <= 400 and !.
	tletra(_,4,3,6):-	!.

	div(x_,Xy0,Lxi,X0,Xi,Yx0,Len,Letra,Step,Dig) if
		Lxi <= (Xy0 - Step), Y1 = Yx0 - Len, Y2 = Yx0 + Len,
		n(Lxi,Xy0,Step,N), Xy0 - ( N * Step ) = Lxii,
		X00 = Xy0 - Step, for(Lxii,X00,X,Step), line(X, Y1, X, Y2),
		conv(Dig,Lxi,Xy0,Xi,X0,X,Xtex),
		settextstyle(2,0,Letra), Xx = X - 8, Yy = Y2 + 2,
		outtextxy(Xx,Yy,Xtex), fail.
	div(x__,Xy0,Lxf,X0,Xf,Yx0,Len,Letra,Step,Dig) if
		Lxf >= (Xy0 + Step), Y1 = Yx0 - Len, Y2 = Yx0 + Len,
		n(Xy0,Lxf,Step,N), /* abs(Xf)/N = Incv,*/
		Xy0 + (N * Step) = Lxff, X00 = Xy0 + Step,
		for(X00,Lxff,X,Step), line(X,Y1,X,Y2),
		conv(Dig,Lxf,Xy0,Xf,X0,X,Xtex), settextstyle(2,0,Letra),
		Xx = X - 5, Yy = Y2 + 2, outtextxy(Xx,Yy,Xtex),	fail.
	div(y_,Yx0,Lyi,Y0,Yi,Xy0,Len,Letra,Step,Dig) if
		Lyi >= (Yx0 + Step), X1 = Xy0 - Len, X2 = Xy0 + Len,
		n(Yx0,Lyi,Step,N), Yx0 + (N * Step) = Lyii, Y00 = Yx0 + Step,
		for(Y00,Lyii,Y,Step), line(X1,Y,X2,Y),
		conv(Dig,Lyi,Yx0,Yi,Y0,Y,Ytex),	settextstyle(2,0,Letra),
		textwidth(Ytex,Ylen), Xx = X1 - 1 - Ylen, Yy = Y - 4,
		outtextxy(Xx,Yy,Ytex), fail.
	div(y__,Yx0,Lyf,Y0,Yf,Xy0,Len,Letra,Step,Dig) if
		Lyf <= (Yx0 - Step), X1 = Xy0 - Len, X2 = Xy0 + Len,
		n(Lyf,Yx0,Step,N), Yx0 - (N * Step) = Lyff, Y00 = Yx0 - Step,
		for(Lyff,Y00,Y,Step), line(X1,Y,X2,Y),
		conv(Dig,Lyf,Yx0,Yf,Y0,Y,Ytex), settextstyle(2,0,Letra),
		textwidth(Ytex,Ylen), Xx = X1 - 1 - Ylen, Yy = Y - 4,
		outtextxy(Xx,Yy,Ytex), fail. div(_,_,_,_,_,_,_,_,_,_) if !.

	conv(Dig,Pi,Pf,Vf,V0,Pn,Texto) :-
		L  = Pf - Pi, V = Vf - V0, Lnva = Pf - Pn,
		Vn = ((Lnva * V) / L) + V0, !,
		str_real(Tex,Vn),recorta(Dig,Tex,Texto).
	recorta(Dig, T, T) :-		str_len(T,L), L <= Dig, !.
	recorta(Dig,Tin,Tout) :-	frontstr(Dig,Tin,Tout,_), !.
	n(V1,V2,Inc,N):-	N = trunc((V2 - V1) / Inc),!.

	traza_ejes(Act,Sup,Inf,Izq,Der,Xi,Xf,Yi,Yf):-
		setlinestyle(0,0,0),
		Lxi = Izq + 15, Lxf = Der - 15,		% LIMITES DE
		% anterior    Lxi = Izq + 45, Lxf = Der - 15,		% LIMITES DE
		% anterior    Lyi = Inf - 25, Lyf = Sup + 15,		% LOS EJES.
		Lyi = Inf - 15, Lyf = Sup + 15,		% LOS EJES.
		cero1(Lxi,Lxf,Xi,Xf,Lx0,X0),		% DISTANCIA DESDE
		cero1(Lyi,Lyf,Yi,Yf,Ly0,Y0),		% i HASTA 0.
		Yx0 = Lyi - Ly0, Xy0 = Lxi + Lx0,	% CRUCE POR 0 EN [x] Y [y].
		rectangle(Izq,Sup,Der,Inf),
		line(Lxi,Yx0,Lxf,Yx0),			% trazo del eje x
		line(Xy0,Lyi,Xy0,Lyf),			% trazo del eje y
		retractall(_,grafica),
		assertz(grafica(Act,x(Xi,X0,Xf,Lxi,Lxf,Yx0),y(Yi,Y0,Yf,Lyi,Lyf,Xy0)),grafica),
		div_ejes(x(Xi,X0,Xf,Lxi,Lxf,Yx0),y(Yi,Y0,Yf,Lyi,Lyf,Xy0)).
		%	 x(r  r    f  f   f)  y(r  r   f   f   f)
		%	r = REAL	f = FICTICIO

	ejes(Gr) if
		activa(Act), modif(N), ejex(N,Xi,Xf), ejey(N,Yi,Yf),
		video(Driver,_), driver(Name_driver,Driver),
		mar(Name_driver,Act,Gr,Sup,Inf,Izq,Der),
		traza_ejes(Act,Sup,Inf,Izq,Der,Xi,Xf,Yi,Yf),
		ejes1, fail.
	ejes(_) if !.
%  __________________________________________________________________________
%               ------- ------ -------- -- ---- - -------
% ___________________________________________________________________________
%
%                    Programa:       rutigraf.pro
%                                    U. M. S. N. H.
%  --------------------------------------------------------------------------
%                            -----------
	coordenadas(X1,Y1,X2,Y2) :-
		coord(X2,Y2), 50 > abs(X2 - X1), 50 > abs(Y2 - Y1), 
		retractall(_,coord), asserta(coord(X1,Y1),coord), !.
	coordenadas(X,Y,X,Y):-
		retractall(_,coord), asserta(coord(X,Y),coord), !.

	graf(Xr,Yr) if
		activa(Act),
		grafica(Act,x(Xi,_,Xf,Lxi,Lxf,Yx0),y(Yi,_,Yf,Lyi,Lyf,Xy0)),
		convierte(x,Xr,Xn,Xi,Xf,Lxi,Lxf,Xy0),
		convierte(y,Yr,Yn,Yi,Yf,Lyi,Lyf,Yx0),
		coordenadas(Xn,Yn,Xant,Yant),
		setlinestyle(0,0,3), line(Xant,Yant,Xn,Yn), !.

	convierte(x,Xr,Lnu,Xi,Xf,Li,Lf,L0) if	% (0+,+)
		Xi >= 0, Xr >= Xi, Xr <= Xf, !, X  =  Xf - Xi, L  =  Lf - Li,
		Lnu =  L0 + ((Xr * L)/X).
	convierte(x,Xr,Lnu,Xi,Xf,Li,Lf,L0) if	% (-,-)
		Xi < 0, Xf <= 0, Xr >= Xi, Xr <= Xf, !,
		X = Xf - Xi, L = Lf - Li, Lnu =  L0 + ((Xr * L)/X).
	convierte(x,Xr,Lnu,Xi,Xf,Li,Lf,L0) if	% (-,+)
		Xr >= Xi, Xr <= Xf, X = abs(Xi) + abs(Xf),
		L   = Lf - Li, Lnu = L0 + ((Xr * L) / X), !.
	convierte(x,_,L0,_,_,_,_,L0) if !.	% (fuera del rango real)
	convierte(y,Yr,Lnu,Yi,Yf,Li,Lf,L0) if % (0+,+)
		Yi >= 0, Yf > 0, Yr >= Yi, Yr <= Yf, !, Y = Yf - Yi,
		L = abs(Lf - Li), Lnu = L0 - ((Yr * L)/Y).
	convierte(y,Yr,Lnu,Yi,Yf,Li,Lf,_) if % (-,0-)
		Yi < 0, Yf <= 0, Yr >= Yi, Yr <= Yf, !, Y = Yf - Yi,
		L   = abs(Lf - Li), Lnu = Lf + abs((Yr * L)/Y).
	convierte(y,Yr,Lnu,Yi,Yf,Li,Lf,L0) if % (-,+)
		Yr >= Yi, Yr <= Yf, !, Y   = abs(Yf) + abs(Yi),
		L   = abs(Lf - Li), Lnu = L0 - ((Yr * L)/Y).
	convierte(y,_,L0,_,_,_,_,L0) if !.	% (fuera del rango real)
% ___________________________________________________________________________
% ---------------------   determina las intersecciones   --------------------
%                         --------- --- --------------
   inter(K1,K2):-
        video(Driver,_), driver(Gname,Driver), pos(Gname,5,_,Y,T),
        outtextxy(T,Y,"..."),
        cuenta(K1,M1), cuenta(K2,M2), min1(M1,M2,M), vxy(K1,X1,Y1), vxy(K2,X2,Y2),
        retractall(act(_,_,_,_,_,_,_,_),act), asserta(act(X1,Y1,X1,Y1,X2,Y2,X2,Y2),act),
        !, for(2,M,N,1), valor_n(K1,N,1), valor_n(K2,N,2), cruce1, fail.
   cuenta(K,_):-
   	retractall(act1(_),act), asserta(act1(0),act),
   	vxy(K,_,_), cuenta1, fail.
   cuenta(_,M):-  act1(M), !, retractall(act1(_),act).  cuenta(_,0):- !.
   cuenta1:-  act1(N), N + 1 = N1, retractall(act1(_),act), asserta(act1(N1),act), !.
   valor_n(K,N,1):-
        retractall(act1(_),act), asserta(act1(N),act), vxy(K,X,Y), resta, !,
        act(_,_,X1,Y1,X2,Y2,X3,Y3), retractall(act(_,_,_,_,_,_,_,_),act), asserta(act(X1,Y1,X,Y,X2,Y2,X3,Y3),act).
   valor_n(K,N,2):- retractall(act1(_),act), asserta(act1(N),act), vxy(K,X,Y), resta, !,
        act(X1,Y1,X2,Y2,_,_,X3,Y3), retractall(act(_,_,_,_,_,_,_,_),act), asserta(act(X1,Y1,X2,Y2,X3,Y3,X,Y),act).
   resta:-
        act1(N), N - 1 = N1, retractall(act1(_),act), asserta(act1(N1),act), N1 = 0, !.
   cruce1:-
        act(Xa1,Ya1,Xa2,Ya2,Xb1,Yb1,Xb2,Yb2),
        (Ya2 -Ya1) / (Xa2 - Xa1) = Ma, (Yb2 -Yb1) / (Xb2 - Xb1) = Mb,
        revisa_m(Ma,Mb),
        Ca = Xa2*Ya1 - Xa1*Ya2, Cb = Xb2*Yb1 - Xb1*Yb2,
        Aa = Ya2 - Ya1, Ba = Xa2 - Xa1, Ab = Yb2 - Yb1, Bb = Xb2 - Xb1,
        Y  = ( Ab * Ca - Aa * Cb) / ( Ab * Ba - Aa * Bb ), X  = ( Y * Ba - Ca ) / Aa,
        revisa_x(Xa1,Xa2,Xb1,Xb2,X), assertz(cruce(X,Y),act), !.
   inter1:-
        video(Driver,_), driver(Gname,Driver), pos(Gname,5,B,T,_),
        outtextxy(B,T,"..."),       % limpia el mensaje inferior
        retractall(act1(_),act), asserta(act1(0),act),
        cruce(X,Y), cuenta1, act1(N), pos(Gname,N,R,B,E),
        str_real(Xst,X), str_real(Yst,Y), recorta(8,Xst,Xr), recorta(8,Yst,Yr),
        outtextxy(R,B,Xr), outtextxy(R,E,Yr), fail.


%   Es para colocar los valores de las intersecciones.  (pos)
        pos(herc,1,78,315,325):-!. pos(herc,2,198,315,325):-!. pos(herc,3,318,315,325):-!. pos(herc,4,438,315,325):-!. pos(herc,5,270,340,200):-!.
        pos(vga,1,78,415,425):-!.  pos(vga,2,198,415,425):-!.  pos(vga,3,318,415,425):-!.  pos(vga,4,438,415,425):-!. pos(vga,5,270,450,200):-!.
        pos(ega,1,78,415,425):-!.  pos(ega,2,198,415,425):-!.  pos(ega,3,318,415,425):-!.  pos(ega,4,438,415,425):-!. pos(ega,5,270,450,200):-!.
        pos(cga,1,78,415,425):-!.  pos(cga,2,198,415,425):-!.  pos(cga,3,318,415,425):-!.  pos(cga,4,438,415,425):-!. pos(cga,5,270,450,200):-!.

   revisa_m(Ma,Mb):-
        Ma = 0, Mb > 0, !; Ma = 0, Mb < 0, !; Ma < 0, Mb = 0, !;
        Ma < 0, Mb > 0, !; Ma > 0, Mb = 0, !; Ma > 0, Mb < 0, !.
   revisa_x(Xa1,Xa2,Xb1,Xb2,X):- X > Xa1, X > Xb1, X < Xa2, X < Xb2, !.
% ---------------------------------------------------------------------------
% -----------------------  Inicio del acceso   ------------------------------
%                          ------ --- ------
	     modif(N), N >< 5, vxy(N,Xr,Yr), graf(Xr,Yr), fail.
	ejes1:-
	     modif(5), mezcla(N), vxy(N,Xr,Yr), graf(Xr,Yr), fail.
	ejes1:- !.
	ejes2 if
	     video(Driver,_), driver(Gname,Driver), setlinestyle(0,0,0),
	     ventana(Gname,1,Iz1,S1,D1,In1,_,_,_,_,_,_,_,_,_), rectangle(Iz1,S1,D1,In1),		% valores extremos -----
	     ventana(Gname,2,Iz2,S2,D2,In2,_,_,_,_,_,_,_,_,_), rectangle(Iz2,S2,D2,In2),		% logo             -----
	     ventana(Gname,3,Iz3,S3,D3,In3,_,_,_,_,_,_,_,_,_), rectangle(Iz3,S3,D3,In3),		% transitorios     -----
	     ventana(Gname,4,Iz4,S4,D4,In4,_,_,_,_,_,_,_,_,_), rectangle(Iz4,S4,D4,In4),		% intersecciones   -----
	     tipo_letra(Gname,1),
	     ventana(Gname, 5,B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13),
	     outtextxy(B1,B2,"VALORES MAXIMOS"), outtextxy(B1,B3,"X="),outtextxy(B1,B4,"Y="),
	     outtextxy(B1,B5,"VALORES MINIMOS"), outtextxy(B1,B6,"X="),outtextxy(B1,B7,"Y="),
	     outtextxy(B1,B8,"CRUCE POR CERO"), outtextxy(B1,B9,"X="),
	     outtextxy(B1,B10,"VALOR DEL CURSOR"), outtextxy(B1,B11,"X="),outtextxy(B1,B12,"Y="),
	     outtextxy(B1,B13,"CURSOR:"),
	     ventana(Gname, 6,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13),
	     outtextxy(E1,E2,"PUNTOS DE INTERSECCION"),
	     outtextxy(E5,E3,"X1="), outtextxy(E5,E4,"Y1="),
	     outtextxy(E6,E3,"X2="), outtextxy(E6,E4,"Y2="),
	     outtextxy(E7,E3,"X3="), outtextxy(E7,E4,"Y3="),
	     outtextxy(E8,E3,"X4="), outtextxy(E8,E4,"Y4="),
	     tipo_letra(Gname,2), outtextxy(E9,E10,"UMSNH"),
	     outtextxy(E11,E12,"EIE"), outtextxy(E11,E13,"SID"), fail.
	ejes2:-
	     efectiva(N), video(Driver,_), driver(Gname,Driver),
	     ejey(N,Py,Gy), ejex(N,Px,Gx), tipo_letra(Gname,1),
	     str_real(Pys,Py), str_real(Gys,Gy), str_real(Pxs,Px), str_real(Gxs,Gx),
	     ventana(Gname,7,A0,A1,A2,A3,A4,A5,A6,A7,_,_,_,_,_),
	     recorta(10,Gxs,Gxss), outtextxy(A0,A1,Gxss),
	     recorta(10,Gys,Gyss), outtextxy(A0,A2,Gyss),
	     recorta(10,Pxs,Pxss), outtextxy(A0,A3,Pxss),
	     recorta(10,Pys,Pyss), outtextxy(A0,A4,Pyss),
	     outtextxy(A0,A5,"        "), outtextxy(A0,A6,"        "),
	     cero(N,Cero), outtextxy(A0,A7,Cero), !.
	efectiva(N):- modif(5), mezcla(N), !; modif(N), !.

	run:-   existfile("ejes.{v}"), for(1,4,Sal,1), str_int(A,Sal),
		concat("val",A,A1), concat(A1,".{v}",A2),
		consult(A2,vxy), fail.
	run:-	existfile("ejes.{v}"), !, consult("ejes.{v}",ejes).
	run:-
		makewindow(2,0,7,"",0,0,25,80,1,255,"ɻȼͺ"),
		makewindow(1,0,7,"",8,4,3,4,1,255,"ɻȼͺ"), sound(10,500),
		makewindow(1,0,7,"",10,5,3,8,1,255,"ɻȼͺ"), sound(10,500),
		makewindow(1,0,7,"",12,8,3,12,1,255,"ɻȼͺ"), sound(10,500),
		makewindow(1,0,7,"",14,13,3,16,1,255,"ɻȼͺ"), sound(10,500),
		makewindow(1,112,0,"",4,30,1,18,1,255,"ɻȼͺ"), sound(10,500),
		write("SID/EIE/UMSNH ..."),
		makewindow(1,0,7,"",14,57,3,16,1,255,"ɻȼͺ"), sound(10,500),
		makewindow(1,0,7,"",12,62,3,12,1,255,"ɻȼͺ"), sound(10,500),
		makewindow(1,0,7,"",10,70,3,8,1,255,"ɻȼͺ"), sound(10,500),
		makewindow(1,0,7,"",8,75,3,4,1,255,"ɻȼͺ"), sound(10,500),
		makewindow(1,7,7,"",15,22,3,43,1,255,"ɻȼͺ"), sound(10,100),
		write("          No existen valores ..."),
		sound(20,100), sound(20,200), sound(20,300), sound(20,400), sound(20,100),
		shiftwindow(2), removewindow(), !, fail.
	run1 :-
	      e_tecla(f(1)), retractall(_,act), asserta(activa(6),act).
% ---------------------------------------------------------------------------
% -----------------------   lectura de tecla   ------------------------------
%                           ------- -- -----
	inicia:- a_key(K), !, trace(on), e_tecla(K), fantasma, inicia.
	a_key(Key):-   readchar(K), !, char_int(K,Asc), key(Asc,Key).
	a_key(K_):-    !,a_key(K_).
	key(13,enter):- !.      key(27,esc):- !.
	key(49,f(1)):-!.key(50,f(2)):-!.key(51,f(5)):-!.
	key(0,Key):- readchar(T), char_int(T,Asc),
		     b_key(Asc,Key).               key(_,otro):- !.
       b_key(72,arr):-!. b_key(80,aba):-!. b_key(75,izq):-!. b_key(77,der):-!.
	b_key(73,rpag):-!. b_key(81,apag):-!.
	b_key(N,f(K)):- N >= 59, N <= 68, !, N - 58 = K.    b_key(_,otro):-!.
% ---------------------------------------------------------------------------
%                     --------- -- ----- -------
	e_tecla(esc):-  !, clearviewport(), sound(5,1000), sound(5,500), fail.
		N>0, N<5, ejey(N,_,_), clearviewport(), retractall(_,act),
		retractall(_,modif), retractall(_,f6), asserta(modif(N),modif),
		retractall(_,f), asserta(f(20,12,20,12),f), asserta(activa(5),act),
		ejes("1/5"), ejes2, retractall(_,cambio),
		getimage(10,2,30,22,Bit), video(Driver,_), driver(Gname,Driver),
		imagen(Gname,B,E,_,_), putimage(B,E,Bit,0), !.
		a_key(f(K1)), a_key(f(K2)), K1 > 0, K1 < 5, K2 > 0, K2 < 5, not(K1 = K2),
		mezcla_max(K1,K2), clearviewport(), retractall(_,act),
		retractall(_,modif), asserta(modif(5),modif),
		retractall(mezcla(_),modif), assertz(mezcla(K1),modif), assertz(mezcla(K2),modif),
		retractall(_,f), asserta(f(20,12,20,12),f),
		asserta(activa(5),act), ejes("1/5"), ejes2,
		retractall(_,cambio), not(inter(K1,K2)), inter1,
		retractall(_,f6), !.
	e_tecla(f(6)):-           %  ----  reimprime las 4       ------------
		video(Driver,_), driver(N_driver,Driver), clearviewport(),
		gr(Gr),	mar(N_driver,Act,Gr,_,_,_,_),
		retractall(_,act), asserta(activa(Act),act),
		retractall(_,modif), asserta(modif(Act),modif),
		ejes(Gr), retractall(_,cambio), retractall(_,f6), asserta(f6(1),f6), fail.
	e_tecla(f(7)):-           %  ----  zoom                  ------------
		!.
	e_tecla(izq):-
		f(_,_,X1,Y1), brinco(B), X1 - B > 10,  !,
		X1 - B = X2, actualiza(X2,Y1).
	e_tecla(arr):-
		f(_,_,X1,Y1), brinco(B), Y1 - B > 10,  !,
		Y1 - B = Y2, actualiza(X1,Y2).
	e_tecla(der):-
		f(_,_,X1,Y1), brinco(B), video(Driver,_), driver(Gname,Driver),
		mar(Gname,5,"1/5",_,_,_,Bety), Limite = Bety - 10,
		X1 + B < Limite, !,
		X1 + B = X2, actualiza(X2,Y1).
	e_tecla(aba):-
		f(_,_,X1,Y1), brinco(B), video(Driver,_), driver(Gname,Driver),
		mar(Gname,5,"1/5",_,Bety,_,_), Limite = Bety - 10,
		Y1 + B < Limite, !,
		Y1 + B = Y2, actualiza(X1,Y2).
	e_tecla(rpag):- 
		brinco(B), B > 5, !, retractall(_,brinco),
		B - 5 = B1, asserta(brinco(B1),brinco),
		retractall(_,cambio), asserta(cambio(1),cambio).
	e_tecla(apag):-
		brinco(B), B < 20, !, retractall(_,brinco),
		B + 5 = B1, asserta(brinco(B1),brinco),
		retractall(_,cambio), asserta(cambio(1),cambio).
	e_tecla(enter):-
		f(_,_,X,Y), retractall(_,cambio), asserta(cambio(1),cambio),
		grafica(5,x(Xi,X0,Xf,Lxi,Lxf,Yx0),y(Yi,Y0,Yf,Lyi,Lyf,Xy0)),
		obten_real(Xi,X0,Xf,Lxi,Xy0,Lxf,X,Xr),
		obten_real(Yf,Y0,Yi,Lyf,Yx0,Lyi,Y,Yr),
		video(Driver,_), driver(Gname,Driver),
		ventana(Gname,8,B,  E,  T,  I,  R,  A,_,_,_,_,_,_,_),
		getimage(B,I,R,A,Bit), putimage(B,E,Bit,0), putimage(B,T,Bit,0),
		outtextxy(B,E,Xr), outtextxy(B,T,Yr), !.
	e_tecla( _ ):-   retractall(_,cambio), asserta(cambio(1),cambio), !.
% ---------------------------------------------------------------------------
%                             Fin del Acceso
%                             --- --- ------
% ---------------------------------------------------------------------------
% ---------------------------------------------------------------------------
goal
	trace(off),
	retractall(_,ejes),
	retractall(_,grafica), retractall(_,modif), retractall(_,act),
	retractall(_,vxy), retractall(_,coord),
	retractall(_,f), asserta(f(20,12,20,12),f),
	retractall(_,brinco), asserta(brinco(1),brinco),
	run, modo_grafico, run1,
	getimage(10,2,30,22,Bit), video(Driver,_), driver(Gname,Driver),
	imagen(Gname,B,E,T,Y), putimage(B,E,Bit,0), 
	inicia, fantasma, closegraph(), retractall(_).
% ---------------------------------------------------------------------------
%				Fin
%                               ---