prueba.pro



%        trace

domains
	file = valores
	r    = real
	lr   = r*
	i    = integer
	s    = symbol
	st   = string
	li   = i*
	lst  = st*
	key	= arr;aba;der;izq;ins;del;f(i);esc;otro;enter
% ___________________________________________________________________________
%                        --------- -- --------------
database - act
	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)-
predicates
	inter(i,i)
	pos(i,i)
	cuenta(i,i)
	min1(i,i,i)
	for(i,i,i,i)
	inter1
	valor_n(i,i,i)
	cruce1
	cuenta1
	resta
	revisa_m(r,r)                         % (i,i) (Ma,Mb)  (revisa si las rectas se cruzan)
	recorta(i,st,st)
goal
	trace(off),
	makewindow(1,7,7,"",0,0,25,80), 
	retractall(_,act), retractall(_,vxy),
	consult("val1.{v}",vxy), consult("val2.{v}",vxy),
	not(inter(1,2)),
	trace(on),
	inter1, readchar(_).
clauses
   inter(K1,K2):-
        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), !.
   min1(A,B,M):- A < B, !, M = A; B < A, !, M = B; B = A, !, M = A.
   for(Val,_,Val,_).		% enteros
	for(Val,Max,I,Inc):- Val2=Val+Inc, Val2 <= Max, for(Val2,Max,I,Inc).
   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, !.
   inter1:-
        retractall(act1(_),act), asserta(act1(0),act),
        cruce(X,Y), cuenta1, act1(N), pos(N,R),
        str_real(Xst,X), str_real(Yst,Y), recorta(8,Xst,Xr), recorta(8,Yst,Yr),
        cursor(R,15),write(Xr), cursor(R,25), write(Yr), fail.
   pos(1,3):-!. pos(2,5):-!. pos(3,7):-!. pos(4,15):-!.
   recorta(Dig, T, T) :-	str_len(T,L), L <= Dig, !.
   recorta(Dig,Tin,Tout) :-	frontstr(Dig,Tin,Tout,_), !.




% ___________________________________________________________________________
% ___________________________________________________________________________