% 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
% ---