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