青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    其實有了一整套的Kernel FP API之后,只需要插入幾個外部函數就可以讓Kernel FP繪圖了。現在我們看一看這個Demo的樣子。

    這是一個Kernel FP程序。程序在窗口正中繪制“Hello World!”,之后四個正方形在四個邊角處旋轉。下面讓我們看一看這個程序的代碼:

 1 def PointAdd p1 p2 = select p1 of
 2   case GuiPoint x1 y1 : select p2 of
 3     case GuiPoint x2 y2 : GuiPoint (x1+x2) (y1+y2)
 4   end
 5 end
 6 
 7 def PointRotate angle point = select point of
 8   case GuiPoint px py : let
 9     def t = angle * 3.1415926 / 180.0
10     def x = itof px
11     def y = itof py
12     def rx = x * cos t - y * sin t
13     def ry = x * sin t + y * cos t
14   in GuiPoint (ftoi rx) (ftoi ry)
15 end

    PointAdd和PointRotate分別是一個點的平移和旋轉。

1 def DrawSquare size center angle =
2   [ GuiPoint (ineg size) (ineg size)
3   , GuiPoint (size) (ineg size)
4   , GuiPoint (size) (size)
5   , GuiPoint (ineg size) (size)
6   ] ||> PointRotate angle ||> PointAdd center |> GuiDrawPolygon

    接下來,DrawSquare使用4個點構造一個中心在坐標系中心的正方形,先旋轉后平移,最后使用外部函數GuiDrawPolygon繪制圖形。

1 def DrawBackground = do
2   GuiSetPen (GuiSolidPen (GuiColor 255 0 01);
3   GuiSetBrush (GuiSolidBrush (GuiColor 255 255 255));
4   GuiDrawRect (GuiRect (GuiPoint 0 0) (GuiPoint 799 599));
5 end

    DrawBackground繪制背景,邊框紅色,背景白色。

 1 def DrawHelloWorld = do
 2   TextSize = GuiTextSize "Hello World!";
 3   select TextSize of
 4     case GuiSize SizeX SizeY : do
 5       TextX = return ((800 - SizeX)/2);
 6       TextY = return ((600 - SizeY)/2);
 7       GuiDrawText (GuiPoint TextX TextY) "Hello World!";
 8     end
 9   end;
10 end

    DrawHelloWorld首先使用外部函數GuiTextSize獲得文字大小,然后計算坐標以便將文字繪制在正中。

1 def DrawScreen = do
2   DrawBackground;
3   DrawHelloWorld;
4   angle = _GetAngle;
5   DrawSquare 20 (GuiPoint 50 50) angle;
6   DrawSquare 20 (GuiPoint 50 550) angle;
7   DrawSquare 20 (GuiPoint 750 550) angle;
8   DrawSquare 20 (GuiPoint 750 50) angle;
9 end

    這是完整的繪圖函數。首先繪制背景,然后繪制文字,最后繪制4個旋轉的正方形。驅動程序執行的main函數如下:

 1 func main :: GuiMessage -> IO void
 2 def main message = do
 3   select message of
 4     case GuiInitialize : do
 5       GuiSetCanvas (GuiSize 800 600);
 6       GuiSetTitle "Canvas Program";
 7       GuiSetFont (GuiFont "宋體" 96 false false false);
 8       GuiSetFontColor (GuiColor 0 0 255);
 9       _SetAngle 0.0;
10       DrawScreen;
11       GuiOpenTimer 0 1;
12     end
13     case GuiTimer ID : do
14       angle = _GetAngle;
15       _SetAngle (angle + 5.0);
16       DrawScreen;
17       GuiFlush;
18     end
19     else : iovoid
20   end;
21 end

    窗口接收到消息的時候調用main函數,這個main函數可以看成消息循環的循環體。函數接收到GuiInitialize消息時進行初始化并申請一個定時器。函數接收到GuiTimer消息的時候增加角度并繪圖。由于Kernel FP是一個沒有狀態的程序,因此使用IO void作為函數類型。IO類型是一個函數,接受“環境”參數。“環境”參數是無狀態程序對事件的一個建模。可以這么理解:程序在不同的時間有不同的輸出。由于熱力學定律,時間不可倒退,因此一個程序在一個給定的時間下只有一次輸出的機會。因此外部世界不斷的遞增時間并向程序請求給定時間的輸出。一個時間的輸出可以影響以后時間的輸出,所以使用這種辦法就可以在一個無狀態程序中為時間建模以便處理狀態。

    IO T的定義是IOEnv -> maybe (pair T IOEnv) IOError。程序在接受一個時間的時候,進行計算并返回結果。結果有兩種,一種是正確一種是錯誤。當一次IO任務執行出錯后,接下來的所有IO任務會立刻中止。當一次IO任務執行成功后,IO任務會返回一個新的時間供后續的IO任務執行。所以我們可以猜到_GetAngle和_SetAngle的類型了。這是一對與狀態有關的函數,在給定時間下具有相同的行為,因此為了讓他們保留類型,因此這兩個函數也必須是IO類型的。getter::X與setter::X是Kernel FP虛擬機提供的狀態有關的存儲服務。X可以取任意值,虛擬機會在需要的時候存儲狀態。

1 func _GetAngle :: IO float alias "getter::program.Angle"
2 func _SetAngle :: float -> IO void alias "setter::program.Angle"

    于是當Kernel FP程序被加載到窗口中時,窗口接收到消息就用一個時間概念向main函數求值。這種復雜的相互作用隱藏在了do-end語法糖和Kernel FP API內部。外部程序僅需要在適當的時候提供IO函數就可以了。在這里給出圖形界面的外部函數接口。

    CanvasModule.txt(生成的代碼文件)
 1 module canvas
 2 import system
 3 
 4 data GuiMouseButton = (GuiMouseLeftButton | GuiMouseRightButton)
 5 
 6 data GuiMessage = (((((((GuiKeyDown int| (GuiKeyUp int)) | (GuiMouseDown GuiPoint GuiMouseButton)) | (GuiMouseUp GuiPoint GuiMouseButton)) | (GuiMouseMove GuiPoint)) | GuiInitialize) | (GuiTimer int))
 7 
 8 data GuiColor = (GuiColor int int int)
 9 
10 data GuiPen = ((GuiSolidPen GuiColor int| GuiClearPen)
11 
12 data GuiBrush = ((GuiSolidBrush GuiColor) | GuiClearBrush)
13 
14 data GuiFont = (GuiFont string int bool bool bool)
15 
16 data GuiPoint = (GuiPoint int int)
17 
18 data GuiSize = (GuiSize int int)
19 
20 data GuiRect = (GuiRect GuiPoint GuiPoint)
21 
22 func GuiSetPen :: (GuiPen -> (IO void)) alias "gui::SetPen"
23 
24 func GuiSetBrush :: (GuiBrush -> (IO void)) alias "gui::SetBrush"
25 
26 func GuiSetFont :: (GuiFont -> (IO void)) alias "gui::SetFont"
27 
28 func GuiSetFontColor :: (GuiColor -> (IO void)) alias "gui::SetFontColor"
29 
30 func GuiSetCanvas :: (GuiSize -> (IO void)) alias "gui::SetCanvas"
31 
32 func GuiSetTitle :: (string -> (IO void)) alias "gui::SetTitle"
33 
34 func GuiDrawLine :: (GuiPoint -> (GuiPoint -> (IO void))) alias "gui::DrawLine"
35 
36 func GuiDrawRect :: (GuiRect -> (IO void)) alias "gui::DrawRect"
37 
38 func GuiDrawEllipse :: (GuiRect -> (IO void)) alias "gui::DrawEllipse"
39 
40 func GuiDrawArc :: (GuiRect -> (GuiPoint -> (GuiPoint -> (IO void)))) alias "gui::DrawArc"
41 
42 func GuiDrawChord :: (GuiRect -> (GuiPoint -> (GuiPoint -> (IO void)))) alias "gui::DrawChord"
43 
44 func GuiDrawPie :: (GuiRect -> (GuiPoint -> (GuiPoint -> (IO void)))) alias "gui::DrawPie"
45 
46 func GuiDrawPolyline :: ((list GuiPoint) -> (IO void)) alias "gui::DrawPolyline"
47 
48 func GuiDrawPolygon :: ((list GuiPoint) -> (IO void)) alias "gui::DrawPolygon"
49 
50 func GuiDrawText :: (GuiPoint -> (string -> (IO void))) alias "gui::DrawText"
51 
52 func GuiFlush :: (IO void) alias "gui::Flush"
53 
54 func GuiTextSize :: (string -> (IO GuiSize)) alias "gui::TextSize"
55 
56 func GuiOpenTimer :: (int -> (int -> (IO void))) alias "gui::OpenTimer"
57 
58 func GuiCloseTimer :: (int -> (IO void)) alias "gui::CloseTimer"
59 
posted on 2008-12-29 10:41 陳梓瀚(vczh) 閱讀(2729) 評論(0)  編輯 收藏 引用 所屬分類: 腳本技術
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美四级在线观看| 亚洲一级高清| 在线亚洲美日韩| 亚洲每日更新| 一区二区三区 在线观看视频 | 久久久久中文| 久久亚洲国产成人| 蜜臀av在线播放一区二区三区| 久久久久久久激情视频| 久久婷婷久久一区二区三区| 蜜臀久久99精品久久久画质超高清| 欧美大片免费久久精品三p| 欧美日韩国产精品一区二区亚洲| 欧美视频1区| 国产亚洲福利社区一区| 亚洲二区在线视频| 一区二区欧美视频| 久久久九九九九| 亚洲第一中文字幕| 99视频国产精品免费观看| 香蕉久久一区二区不卡无毒影院 | 亚洲免费精彩视频| 亚洲视频999| 久久婷婷综合激情| 欧美日韩亚洲激情| 依依成人综合视频| 亚洲午夜av| 欧美韩日视频| 亚洲女ⅴideoshd黑人| 欧美国产免费| 国内视频精品| 性欧美8khd高清极品| 亚洲福利视频在线| 久久国产精品99精品国产| 欧美三级电影精品| 亚洲国产老妈| 久久久久国产精品麻豆ai换脸| 亚洲精品免费在线| 久久久精品日韩欧美| 国产精品伦子伦免费视频| 亚洲国产日韩精品| 久久电影一区| 亚洲午夜视频在线观看| 欧美精品在线看| 永久免费视频成人| 久久久国产视频91| 亚洲一二三区在线| 欧美吻胸吃奶大尺度电影| 亚洲理伦在线| 亚洲高清不卡| 欧美成人精品在线| 1024成人网色www| 久久夜色精品国产欧美乱| 亚洲综合色自拍一区| 国产精品成人观看视频国产奇米| 99综合视频| 亚洲毛片在线观看.| 欧美另类一区二区三区| 日韩写真在线| 亚洲毛片av在线| 欧美区一区二| 一区二区欧美日韩视频| 99精品欧美一区二区蜜桃免费| 欧美成人在线免费视频| 亚洲日本无吗高清不卡| 亚洲国产老妈| 欧美黄色大片网站| 制服丝袜亚洲播放| 日韩午夜在线观看视频| 国产精品成人av性教育| 亚洲综合欧美| 欧美一级淫片aaaaaaa视频| 国产日韩精品视频一区二区三区| 欧美一区二区三区在线观看视频| 亚洲一区二区三区中文字幕| 国产免费观看久久黄| 久久久久国产免费免费| 久久久久九九九九| 日韩视频一区二区在线观看 | 亚洲一区二区精品| 亚洲视频网在线直播| 国产亚洲欧美一区| 欧美第十八页| 欧美日韩一区二区三区在线| 午夜精品久久久久久久蜜桃app| 亚洲免费一在线| 亚洲成人自拍视频| 日韩亚洲欧美在线观看| 国产亚洲欧美一区二区| 欧美激情1区2区3区| 欧美午夜精品久久久久免费视| 欧美在线观看一区二区| 免费久久99精品国产| 亚洲少妇诱惑| 久久精品欧洲| 亚洲一区二区免费看| 久久精品一区二区三区不卡牛牛| 亚洲精品视频在线播放| 亚洲欧美国产高清| 亚洲美女黄色片| 久久精品国产在热久久 | 欧美国产日韩亚洲一区| 亚洲午夜久久久久久久久电影网| 亚洲男女自偷自拍| 一本久久a久久精品亚洲| 欧美亚洲免费电影| 99视频精品在线| 久久久久免费视频| 亚洲在线中文字幕| 久久综合激情| 久久免费视频在线观看| 国产精品久久久久久久久久尿| 欧美高清在线精品一区| 国产一区二区三区直播精品电影 | 日韩一级二级三级| 久久久久久伊人| 久久精品国产96久久久香蕉| 欧美日韩精选| 亚洲国产片色| 亚洲国产成人午夜在线一区| 欧美一区久久| 欧美一区二区三区视频免费| 欧美日韩妖精视频| 亚洲人在线视频| 亚洲精品无人区| 免费日韩av| 亚洲第一在线| 亚洲国产1区| 久久综合999| 免费欧美在线视频| 亚洲精选国产| 国产欧美一区二区白浆黑人| 一区二区三区福利| 中文一区在线| 欧美日韩一区二区视频在线观看| 亚洲福利电影| 亚洲看片一区| 欧美日韩国产精品自在自线| 亚洲精品1区| 一区二区日韩精品| 欧美午夜不卡在线观看免费| 日韩视频在线一区| 亚洲综合色婷婷| 国产精品天美传媒入口| 亚洲综合日本| 老司机免费视频一区二区三区| 狠狠爱综合网| 免费久久精品视频| 亚洲精品国产系列| 亚洲一区欧美一区| 国产精品亚洲аv天堂网 | 日韩视频免费观看| 99视频一区二区三区| 欧美午夜精品理论片a级大开眼界| 亚洲精品国产品国语在线app| 一区二区三区久久精品| 国产精品麻豆va在线播放 | 欧美人与禽猛交乱配视频| 91久久精品国产91久久性色| 一本一本久久| 国产精品自拍小视频| 久久久精品999| 亚洲欧洲综合| 久久国产精品久久国产精品 | 免费在线观看精品| 一本久道久久综合狠狠爱| 欧美影院在线播放| 亚洲人人精品| 国产女人精品视频| 欧美国产精品v| 性做久久久久久久免费看| 牛夜精品久久久久久久99黑人| 亚洲日本在线观看| 国产午夜精品麻豆| 欧美激情一区二区三区四区| 亚洲综合三区| 亚洲国产精品日韩| 久久久www| 在线一区二区三区做爰视频网站| 国产视频一区欧美| 欧美日本中文字幕| 久久er精品视频| 一区二区三区 在线观看视| 久久亚洲美女| 午夜一区二区三区不卡视频| 在线观看三级视频欧美| 国产精品久久久久久久久婷婷 | 国产精品视频导航| 欧美区亚洲区| 美女被久久久| 久久狠狠久久综合桃花| 亚洲一区二区精品视频| 亚洲激情国产| 欧美刺激性大交免费视频 | 国产欧美日韩高清| 久久久噜噜噜久久久| 99国产精品久久久| 麻豆精品视频| 久久aⅴ国产欧美74aaa| 一区二区三区av|