This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
vsc e5f4633c39 This commit was generated by cvs2svn to compensate for changes in r4,
which included commits to RCS files with non-trunk default branches.


git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
2001-04-09 19:54:03 +00:00

165 lines
4.2 KiB
Plaintext

/*
**********************************************************************
*
* CLP(R) Version 2.0 (Example Programs Release)
* (C) Copyright, March 1986, Monash University
*
**********************************************************************
*/
/*
* This example is credited to Richard Helm & Kim Marriot
*/
%
% Package which allows rule-based descriptions of pictures to be translated into
% commands in the "pic" package.
% for example, try ?- tell(picout), go2, told.
% and then from the UNIX command line try
% pic picout | troff | ...
%
inter( P1, P2 ,P3 ,P4 ,P5 ,P6 ) :-
intersect(P1, P2, P3, P4, PP1 ) ,
intersect(P1, P2, P5, P6, PP2 ) ,
intersect(P5, P6, P3, P4, PP3 ) ,
line( [ PP1, PP2 ] ),
line( [ PP2, PP3 ] ),
line( [ PP3, PP1 ] ),
darrow( [ P1, P2 ] , dashed ),
darrow( [ P3, P4 ] , dashed ),
darrow( [ P5, P6 ] , dashed ),
text( c1, P1, rjust ),
text( c2, P3, rjust ),
text( c3, P5, rjust ).
intersect(P1,P2,P3,P4,PP) :-
gradient(P1,P2,M1),
gradient(P3,P4,M2),
lineeq(P1,M1,C1),
lineeq(P3,M2,C2),
lineeq( PP, M1, C1 ),
lineeq( PP, M2, C2 ).
lineeq(p(X,Y),M, C ) :- Y = M * X + C.
gradient(p(P1x,P1y),p(P2x,P2y),M ) :-
M = ( P2y -P1y ) / ( P2x -P1x ) .
%--------------------
% the required pic interface
%--------------------
pstart(S) :-
printf(".PS %gi\n" , [ S ] ).
pend :-
printf(".PE\n", [] ).
box( box( p(Ox,Oy), p(Cx,Cy) ), DotDashInvis , Text ) :-
Mx = (Ox + Cx ) / 2 ,
My = (Oy + Cy ) / 2 ,
H = Cx - Cy ,
W = Cy - Oy ,
printf( "box at %g,%g width %g hieght %g \n" , [ Mx,My,W,H ] ) .
line( [ p(Ox,Oy), p(Cx,Cy) ], Style ) :-
printf( "line from %g,%g to %g,%g %\n" , [ Ox,Oy,Cx,Cy,Style ] ) .
darrow( [ p(Ox,Oy), p(Cx,Cy) ],Style ) :-
printf( "line from %g,%g to %g,%g %\n" , [ Ox,Oy,Cx,Cy,Style ] ) .
arrow( [ p(Ox,Oy), p(Cx,Cy) ],Style ) :-
printf( "line from %g,%g to %g,%g %\n" , [ Ox,Oy,Cx,Cy,Style ] ) .
line( [ p(Ox,Oy), p(Cx,Cy) ] ) :-
printf( "line from %g,%g to %g,%g \n" , [ Ox,Oy,Cx,Cy ] ) .
text( Text , p(Ox,Oy), Just ) :-
printf( " %s %s %s at %g,%g %s \n" , [ '"', Text, '"', Ox, Oy, Just] ) .
quadrilateral( Pt1, Pt2, Pt3, Pt4, MPt1, MPt2, MPt3, MPt4) :-
parallelogram(MPt1, MPt2, MPt3, MPt4) ,
lineWithMidPoint(Pt1,Pt2,MPt1) ,
lineWithMidPoint(Pt2,Pt3,MPt2) ,
lineWithMidPoint(Pt3,Pt4,MPt3) ,
lineWithMidPoint(Pt4,Pt1,MPt4) ,
line([ MPt1, MPt2 ], dashed),
line([ MPt2, MPt3 ], dashed),
line([ MPt3, MPt4 ], dashed),
line([ MPt4, MPt1 ], dashed).
lineWithMidPoint( p(P1x,P1y), p(P2x,P2y) , p(Mx,My) ) :-
P1x - Mx = Mx - P2x ,
P1y - My = My - P2y ,
line([ p(P1x,P1y) , p(P2x,P2y) ]).
parallelogram(p(P1x,P1y), p(P2x,P2y), p(P3x,P3y), p(P4x,P4y)) :-
P1x - P2x = P4x - P3x,
P1y - P2y = P4y - P3y,
P1x - P4x = P2x - P3x,
P1y - P4y = P2y - P3y.
go1:-
pstart(2),
inter( p(0,1), p(4,2) ,p(3.5,1) ,p(2,5) ,p(0.33,0.5) ,p(3,5.5 ) ),
pend.
% Output:
% .PS 2i
% line from 3.2,1.8 to 0.688979,1.172245
% line from 0.688979,1.172245 to 2.302393,4.193619
% line from 2.302393,4.193619 to 3.2,1.8
% line from 0,1 to 4,2 dashed
% line from 3.5,1 to 2,5 dashed
% line from 0.33,0.5 to 3,5.5 dashed
% " c1 " at 0,1 rjust
% " c2 " at 3.5,1 rjust
% " c3 " at 0.33,0.5 rjust
% .PE
go2:-
pstart(3),
quadrilateral( p(0,0), p(8,10) ,p(10,10) ,p(10,1) ,_, _, _, _ ),
quadrilateral( p(0,20), p(0,15) ,p(10,15) ,p(10,20) ,_, _, _, _ ),
quadrilateral( p(5,30), p(10,23), p(15,30), p(10,25), _, _, _, _),
pend.
% Output:
% .PS 3i
% line from 0,0 to 8,10
% line from 8,10 to 10,10
% line from 10,10 to 10,1
% line from 10,1 to 0,0
% line from 4,5 to 9,10 dashed
% line from 9,10 to 10,5.5 dashed
% line from 10,5.5 to 5,0.5 dashed
% line from 5,0.5 to 4,5 dashed
% line from 0,20 to 0,15
% line from 0,15 to 10,15
% line from 10,15 to 10,20
% line from 10,20 to 0,20
% line from 0,17.5 to 5,15 dashed
% line from 5,15 to 10,17.5 dashed
% line from 10,17.5 to 5,20 dashed
% line from 5,20 to 0,17.5 dashed
% line from 5,30 to 10,23
% line from 10,23 to 15,30
% line from 15,30 to 10,25
% line from 10,25 to 5,30
% line from 7.5,26.5 to 12.5,26.5 dashed
% line from 12.5,26.5 to 12.5,27.5 dashed
% line from 12.5,27.5 to 7.5,27.5 dashed
% line from 7.5,27.5 to 7.5,26.5 dashed
% .PE
?- printf("\n>>> Sample goals: go1/0, go2/0\n", []).