計算幾何難寫主要的原因就是太不直觀,而手畫圖“精度”有限,效率也不高,怎麼辦?
寫程式畫是一個不錯的想法!
於是我就找盾哥學了一下graph和crt單元的一些用法,做了這樣一個簡陋的畫圖器
為了方便使用,我把這個畫圖器做成了一個庫,要使用就只要uses draw_lib;就可以了
代碼:
unit<br /> draw_lib;<br />interface<br />procedure init(k:longint);<br />procedure putpoint(x,y:longint);<br />procedure putline(x1,y1,x2,y2:longint);<br />procedure putcircle(x,y,r:longint);<br />procedure pause;<br />implementation<br />uses<br /> crt,graph;<br />var<br /> bili:real;<br /> o,max:longint;<br />procedure pause;<br />var c:char;<br />begin<br /> c:=#0;<br /> repeat<br /> c:=readkey;<br /> until c<>#0;<br />end;<br />procedure changexy(var x,y:longint);<br />var t:longint;<br />begin<br /> if o=1 then begin x:=trunc(x*bili); y:=trunc(y*bili) end;<br /> x:=x+50; y:=550-y;<br />end;<br />procedure fill(x,y:longint);<br />var r:longint;<br />begin<br /> circle(x+1,y,2);<br /> circle(x,y+1,2);<br /> circle(x-1,y,2);<br /> circle(x,y-1,2);<br /> settextstyle(0,0,1);<br /> outtextxy(x-3,y-3,#7);<br />end;<br />procedure putpoint(x,y:longint);<br />begin<br /> changexy(x,y);<br /> fill(x,y);<br />end;<br />procedure putline(x1,y1,x2,y2:longint);<br />begin<br /> changexy(x1,y1);<br /> changexy(x2,y2);<br /> if o=1 then begin fill(x1,y1); fill(x2,y2); end;<br /> line(x1,y1,x2,y2);<br />end;<br />function istr(i:longint):string;<br />begin<br /> str(i,istr);<br />end;<br />procedure putcircle(x,y,r:longint);<br />begin<br /> changexy(x,y);<br /> setlinestyle(0,0,2);<br /> circle(x,y,trunc(r*bili));<br /> fill(x,y);<br />end;<br />function f(x:longint):longint;<br />begin<br /> x:=trunc(x/500*max);<br />end;<br />procedure init(k:longint);<br />var i:longint; t1,t2:integer;<br />begin<br /> t1:=d8bit; t2:=m800x600; max:=k;<br /> initgraph(t1,t2,'');<br /> bili:=500/k; o:=0;<br /> setlinestyle(0,0,2);<br /> line(50,550,50,50);<br /> line(50,550,550,550);<br /> line(50,50,45,55);<br /> line(50,50,55,55);<br /> line(550,550,545,545);<br /> line(550,550,545,555);<br /> putpoint(0,0); o:=1;<br /> settextstyle(0,0,2);<br /> outtextxy(36,555,'O');<br /> settextstyle(0,0,1);<br /> for i:=6 to 54 do begin<br /> line(50,i*10,53,i*10);<br /> if i mod 5=0 then outtextxy(26,i*10-2,istr(f((55-i)*10)));<br /> end;<br /> for i:=6 to 54 do begin<br /> line(i*10,550,i*10,547);<br /> if i mod 5=0 then outtextxy(i*10-7,556,istr(f((i-5)*10)));<br /> end;<br />end;<br />begin<br />end.<br />
本庫暫時只支援畫非負整數域內的 點、線、圓,如果要畫實數,或負數,可以考慮自己手動先轉化一下再使用
本庫調用了crt和graph單元,你的fp需要有這兩個單元這個庫才能正常使用
使用方法:
1.調用draw_lib單元
2.先調用init(k)過程,初始化座標系,k為座標最大值
3.幾個主要過程的格式
putpoint(x,y),畫一個座標為(x,y)的點
putline(x1,y1,x2,y2),畫一條(x1,y1) -> (x2,y2)的線段
putcircle(x,y,r),畫一個圓心為(x,y),半徑為r的圓
pause,暫停,按任意鍵繼續(這個功能還有點問題,但要正常使用的話還是可以的,只是要求你的程式不能直接將輸入資料流改成標準檔案輸入input,而是另外弄一個檔案類型的變數作為輸入資料流,原因應該是如果你的程式將輸入資料流重新導向到檔案,程式就不能從鍵盤輸入了)
4.上面提到的所有過程的參數都是整數
5.一個參考的將實數轉化為整數的方法,先乘一個比例係數再round一下;將負數轉化為正數的方法,加上一個比較大的數。-_-!
就這樣吧,祝大家使用愉快,有發現bug或好的想法請聯絡我