2018 Fall 期末專案示範網站

CMSimfly << Previous Next >> Lua gear

網際繪圖

BrythonFengari-web 都可以透過 scripting 的方式在網際繪圖, 前者使用 Python3 語法, 而後者使用 Lua 程式語法, Brython 目前的 brython-dist.js 高達 3.7 MB, 而 fengari-web.js 只需要 233 KB.

http://lab.kmol.info/blog/brython-programming-environment.html 說明如何使用 Brython 進行與機械設計領域相關的網際繪圖, 在此, 則希望利用 Lua 進行相同效果的網際程式設計.

由於本網際內容管理程式使用 Tinymce4 網際編輯器套件, 因此為了讓 CMSimfly 編輯器中可以輸入 script 與 canvas 等網際繪圖相關的 html 標註, 必須要修改相關設定:

首先必須將原先使用的 xhtml 格式, 改為 html, 以避開為了滿足 xhtml 格式的 CDATA 註解資料.

接下來則需開啟 script 與 canvas 標註的輸入, 不至於被 Tinymce4 濾除, 其中 canvas 的開放, 需要使用 valid_elements 設定, 以開啟所有標註達成, 而 script 則利用 extended_valid_elements 設定完成.

修改上述設定後, 便可直接在 CMSimfly 編輯器中, 直接輸入各種與 fengari-web 相關的網際  Lua 程式設計內容.

以下允許所有的 html 標註, 並且可以利用 lua 進行網際繪圖:

  valid_elements : '*[*]',
  extended_valid_elements: "script[language|type|src]",

以下則使用一般 Lua 程式繪圖:

<canvas id="canvas" width="600" height="400"></canvas>
<p>
<script type="application/lua">
-- 導入 "js" 模組
local js = require "js"
-- global 就是 javascript 的 window
local global = js.global
local document = global.document
-- html 檔案中 canvas id 設為 "canvas"
local canvas = document:getElementById("canvas")
-- 將 ctx 設為 canvas 2d 繪圖畫布變數
local ctx = canvas:getContext("2d")
 
-- 屬性呼叫使用 . 而方法呼叫使用 :
-- 設定填圖顏色
ctx.fillStyle = "rgb(200,0,0)"
-- 設定畫筆顏色
ctx.strokeStyle = "rgb(0,0,200)"
 
-- 乘上 deg 可轉為徑度單位
deg = math.pi / 180
 
-- 建立多邊形定點位置畫線函式
function star(radius, xc, yc, n)
    --radius = 100
    --xc = 200
    --yc = 200
    xi = xc + radius*math.cos((360/n)*deg+90*deg)
    yi = yc - radius*math.sin((360/n)*deg+90*deg)
    ctx:beginPath()
    ctx:moveTo(xi,yi)
    for i = 2, n+1 do
        x = xc + radius*math.cos((360/n)*deg*i+90*deg)
        y = yc - radius*math.sin((360/n)*deg*i+90*deg)
        ctx:lineTo(x,y)
    end
end
 
-- 以下利用多邊形畫線函式呼叫執行畫框線或填入顏色
-- 畫五邊形框線
star(100, 200, 200, 5)
ctx:closePath()
ctx:stroke()
 
-- 填三角形色塊
star(50, 350, 200, 3)
ctx:closePath()
ctx:fill()
 
-- 改變畫線顏色後, 畫七邊形框線
ctx.strokeStyle = "rgb(0,200,20)"
star(50, 450, 200, 7)
ctx:closePath()
ctx:stroke()
</script>

以下則使用 Lua 的物件導向程式設計繪圖:

<canvas id="canvas1" width="600" height="400"></canvas>
<script type="application/lua">
-- 導入 "js" 模組
local js = require "js"
-- global 就是 javascript 的 window
local global = js.global
local document = global.document
-- html 檔案中 canvas id 設為 "canvas"
local canvas = document:getElementById("canvas1")
-- 將 ctx 設為 canvas 2d 繪圖畫布變數
local ctx = canvas:getContext("2d")

-- 屬性呼叫使用 . 而方法呼叫使用 :
-- 設定填圖顏色
ctx.fillStyle = "rgb(200,0,0)"
-- 設定畫筆顏色
ctx.strokeStyle = "rgb(0,0,200)"

-- 乘上 deg 可轉為徑度單位
deg = math.pi / 180

-- 建立多邊形定點位置畫線函式
local star = {}
star.__index = star

function star.new(radius, xc, yc, n, sof)
    --radius = 100
    --xc = 200
    --yc = 200
    local self = setmetatable({}, star)
    self.radius = radius
    self.xc = xc
    self.yc = yc
    self.n = n
    -- stroke or fill
    self.sof = sof
    --return self
--end

--function star.plot(self)
    xi = self.xc + self.radius*math.cos((360/self.n)*deg+90*deg)
    yi = self.yc - self.radius*math.sin((360/self.n)*deg+90*deg)
    ctx:beginPath()
    ctx:moveTo(xi,yi)
    for i = 2, self.n+1 do
	x = self.xc + self.radius*math.cos((360/self.n)*deg*i+90*deg)
	y = self.yc - self.radius*math.sin((360/self.n)*deg*i+90*deg)
	ctx:lineTo(x,y)
    end
    ctx:closePath()
    if self.sof == true then
	ctx:stroke()
    else
	ctx:fill()
    end
end

-- 以下利用多邊形畫線函式呼叫執行畫框線或填入顏色
-- 畫五邊形框線
star1 = star.new(100, 200, 200, 5, true)
--star1:plot()

-- 填三角形色塊
star2 = star.new(50, 350, 200, 3, false)
--star2:plot()

-- 改變畫線顏色後, 畫七邊形框線
ctx.strokeStyle = "rgb(0,200,20)"
star3 = star.new(50, 450, 200, 7, true)
--star3:plot()
</script>


CMSimfly << Previous Next >> Lua gear