大家好,我回来了一个愚蠢的Swi-prolog问题。有什么意义 - 我有一个文件,我必须从该文件开始在屏幕上显示图片。
% draw(+Size)
% draws a graphics with a given Size
draw(Size) :-
% define size of the display (picture size + scroll bar area)
SizeD is Size+20,
% create a new display and open it
new(Display,picture('*** Window with Pictire ***',size(SizeD,SizeD))),
send(Display,open),
send(Display,background,colour(black)), %* MK: ggf. Farbe auf 'white' stellen
% draw the object on the display
(
draw_object(Display,Size,Size /* , ***add additional parameters if needed *** */);
true
),
% if desired save the display as .jpg
write_ln('Save the graphics (y/n): '),
get_single_char(A),
put_code(A),nl,
(A=:=121 ->
(write_ln('enter file name: '),
read_line_to_codes(user_input,X),
atom_codes(File,X),
atom_concat(File,'.jpg',FileName),
get(Display,image,Image),
send(Image,save,FileName,jpeg) ) ; true ),
!.
% draw_object(Display,Size,CurrentSize,*** add additional parameters here, if needed ***)
% draws a gradient graphics of size Size into Display
% CurrentSize is decreased recursively fom Size to 0
draw_object(_,_,0 /* , *** add additional parameters here, if needed *** */).
draw_object(Name,Size,CSize /* , *** add additional parameters here, if needed *** */) :-
CSize > 0 , % only for positive integers
% *** insert the computation of graphical parameters here ***
% *** create and draw the current graphical object here ***
% *** send all additional parameters to the current graphical object ***
% decrement CurrentSize and call draw_object recursively
CSizeNew is CSize - 2,
% writeln(CSizeNew),
draw_object(Name,Size,CSizeNew).
% Call the program and see the result
:- draw( 400 ). % specify the desired display size in pixel here (required argument)
% ========== Tests from XPCE-guide Ch 5 ==========
% destroy objects
mkfree :-
free(@p),
free(@bo),
free(@ci),
free(@bm),
free(@tx),
free(@bz).
% create picture / window
mkp :-
new( @p , picture('Demo Picture') ) ,
send( @p , open ).
% generate objects in picture / window
mkbo :-
send( @p , display , new(@bo,box(100,100)) ).
mkci :-
send( @p , display , new(@ci,circle(50)) , point(25,25) ).
mkbm :-
send( @p , display , new(@bm,bitmap('32x32/books.xpm')) , point(100,100) ).
mktx :-
send( @p , display , new(@tx,text('Hello')) , point(120,50) ).
mkbz :-
send( @p , display , new(@bz,bezier_curve(
point(50,100),point(120,132),point(50,160),point(120,200))) ).
% modify objects
mkboc :-
send( @bo , radius , 10 ).
mkcic :-
send( @ci , fill_pattern , colour(orange) ).
mktxc :-
send( @tx , font , font(times,bold,18) ).
mkbzc :-
send( @bz , arrows , both ).
问题是我不明白它是如何工作的,也不知道如何显示这些测试数据。例如,如果我只是打开一个文件,则会自动出现一个黑色背景的窗口。
但是,我不能从命令行调用谓词。
?- mkp.
ERROR: Unknown procedure: kp/0 (DWIM could not correct goal)
如果我在评论后粘贴
% *** create and draw the current graphical object here ***
例如这样的代码:
mkbo :-
send( Display , display , new(Display,box(100,100)) ).
然后当您调用该文件时,只出现一个黑色窗口,其中没有我期望的正方形,但在控制台中出现以下错误:
ERROR: j:/grafik.pl:38:89: Syntax error: Operator priority clash
Warning: j:/grafik.pl:50:
Warning: Singleton variables: [CSize,Name,Size]
ERROR: j:/grafik.pl:50:
ERROR: Full stop in clause-body? Cannot redefine ,/2
(仅此而已)参考第 50 行:
CSizeNew is CSize - 2,
如果我在启动后立即关闭窗口并尝试调用谓词,例如 mkp,那么当我尝试调用任何测试时,我会收到语法错误错误并链接到所有测试行。
有人可以向我解释如何在屏幕上显示这些相同的测试数据(正方形、圆形、贝塞尔曲线等)吗?
难度很大,但还是掌握了。我的问题是它没有改变颜色,并且在创建对象之后,在将其发送到显示器之前,您必须指定背景以外的颜色,例如:
好吧,这是最终程序的完整示例(绘制了很多贝塞尔曲线):
结果: