先來看怎們取出點資料,如果你在命令列輸入 (getpoint),再螢幕上點選一點, 這時程式會回應一個像下面的資料 (串列)
(982.466 568.978 0.0)
直覺的,它一定是 x, y , z 值,那怎麼拿出來,先得講 LISP 如何操作串列,基本上先認識 (car) (cadr) (caddr)
三個兄弟函數,老大 car 取出串列第一個內容,所以一個點 pt 的內容為 (1 2 3),那麼 (car pt) 便傳回 1,同理 (cadr pt) 傳回 2,同理 (caddr pt) 傳回 3,此時再設定變數,便可以得到 x, y ,z 參數
(setq x (car pt)
y (cadr pt)
z (caddr pt)
)
便可對 x, y, z 三個變數進行運算,但要說明的是在 LISP 語言內不只以上三個函數,例如 (cdr pt) 傳回 (2 3),很明顯的是傳回第二個到最後一個串列內容;(nth 2 pt) 傳回 3,(nth) 函數則依據 index 2 傳回內容 3,當然串列的第一個 index 是 0。
當有了新的 x y z 值,要將其組合成一個點資料傳給函數,一樣是 LISP 語言內串列的操作函數 (list),沒啥技巧
(list x y z)
就可以了,如果在 2D 環境繪圖,那麼 z 可以省略,不需再設定。
下面一個例子,程式要求使用者輸入一點, 然後程式劃出由輸入點開始長度 100,30 度角的直線
(defun c:aline( / pt x y _osmode)
(setq _osmode
(getvar "OSMODE"))
(setvar "OSMODE"
0)
// 取得起始點
(setq pt (getpoint
"輸入起始點\n")
x (car pt)
y (cadr pt)
)
// 計算終點
(setq x (+
x (* 100 (cos (/ pi 6))))
y (+ y (* 100 (sin (/ pi 6))))
)
// 繪出
(command "LINE"
pt (list x y) "")
(setvar "OSMODE"
_osmode)
)
當然,實際程式設計時會使用 (polar) 函數
(command "LINE"
pt (polar pt (/ pi 6) 100) "")
沒有留言:
張貼留言