/** This program constructs a view of a breasoning (an object's X, Y and Z dimensions visualised in a high quality way to God). When you present breasoning lists, you can use this program to help audience members visualise breasonings more quickly. F / \ / \ / /G / / | / / | E\ / | | \ / C | D / | | / A | / \ | / \|/ B ?- brview([pot,30,20,10]). * * * * * * * * * ** * * * * ** * * * * * * * * * * * * ** * * * * * * * * * * * ** * * * * * * ** * * * * * * * * * * ** * * * * * * * * * * * * ** * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * ** * ** * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * *** * **/ brview(Item) :- Item = [_Object, X, Y, Z], WinX is X+Y+4, WinY is X+Y+Z, createwindow(WinX, 0, WinY, [],Window1), drawprism(X, Y, Z, Window1,Window3), WinX2 is WinX-1, WinY2 is WinY-1, print(WinX2,WinY2,0,Window3). createwindow(_X,Y,Y,Window,Window) :- !. createwindow(X,Y1,Y2, Window1,Window2) :- createrow(0,X,Y1, [],Row), append(Window1,Row,Window3), Y3 is Y1+1, createwindow(X,Y3, Y2, Window3, Window2). createrow(X,X,_,Row,Row) :- !. createrow(X1, X2, Y, Row1, Row2) :- createposition(X1,Y, Position), append(Row1,[Position],Row3), X3 is X1+1, createrow(X3,X2, Y,Row3,Row2). createposition(X, Y, Position) :- Position = [X,Y,' ']. drawprism(X,Y,Z,Window1,Window10) :- AX is 0, AY is X+1, BX is X+1, BY is 1, CX is X+Y+2, CY is Y+1, DX is BX, DY is BY+Z, EX is AX, EY is AY+Z-1, FX is Y+1, FY is X+Y+Z-1, GX is CX, GY is CY + Z -1, line1(AX,AY,BX,BY,Window1,Window2), line1(BX,BY,CX,CY,Window2,Window3), line1(AX,BX,EX,EY,Window3,Window4), line1(BX,BY,DX,DY,Window4,Window5), line1(CX,CY,GX,GY,Window5,Window6), line1(EX,EY,DX,DY,Window6,Window7), line1(EX,EY,FX,FY,Window7,Window8), line1(DX,DY,GX,GY,Window8,Window9), line1(FX,FY,GX,GY,Window9,Window10). line1(X,Y1,X,Y2,Window1,Window2) :- line3(X,Y1,Y2,Window1,Window2), !. line1(X1,Y1,X2,Y2,Window1,Window2) :- C is Y1-((Y2-Y1)/(X2-X1))*X1, M is (Y2-Y1)/(X2-X1), line2(X1,X2,C,M,Window1,Window2). line2(X1,X2,_,_,Window,Window) :- X1 is X2+1, !. line2(X1,X2,C,M,Window1, Window2) :- draw(X1,C,M,Window1,Window3), X3 is X1+1, line2(X3,X2,C,M,Window3,Window2). line3(_X,Y,Y,Window,Window) :- !. line3(X,Y1,Y2,Window1,Window2) :- delete(Window1,[X,Y1,_],Window3), append(Window3,[[X,Y1,'*']],Window4), Y3 is Y1 +1, line3(X, Y3,Y2,Window4,Window2). draw(X1,C,M,Window1,Window2) :- Y is round(M*X1+C), delete(Window1,[X1,Y,_],Window3), append(Window3,[[X1,Y,'*']],Window2). print(_X, Y, Y, _Window) :- !. print(X,Y1, Y2, Window) :- print_row(0, X, Y1, Window), Y3 is Y1-1, writeln(''), print(X, Y3,Y2,Window). print_row(X,X,_Y,_Window). print_row(X1, X2,Y1,Window) :- member([X1,Y1,Character],Window), write(Character), X3 is X1+1, print_row(X3,X2,Y1,Window).