Next: 24.3 ディスクの定義
Up: 24 ハノイの塔のモデル sample/hanoi.l
Previous: 24.1 テーブルの定義
面データの検索には,:get-faceメソッドを用いる.
(defun oriented-faces (b v)
(if (keywordp v) (setq v (named-vector v))
(setq v (normalize-vector v)))
(remove-if-not
#'(lambda (x) (face-oriented? x v))
(send b :faces)))
(defun named-vector (o)
(cadr
(assoc o
'((:x #f(1 0 0)) (:-x #f(-1 0 0))
(:y #f(0 1 0)) (:-y #f(0 -1 0))
(:z #f(0 0 1)) (:-z #f(0 0 -1))
(:nil #f(0 0 0))))))
(defun face-oriented? (f v)
(> (v. (send f :normal) v) 0.98))
(defun oriented-faces (b v)
(remove-if-not
#'(lambda (x) (face-oriented? x v))
(send b :faces)))
(defun sorted-faces (b v)
(if (keywordp v) (setq v (named-vector v))
(setq v (normalize-vector v)))
(sort (oriented-faces b v)
#'(lambda (x y) (> (v. x v) (v. y v)))
#'(lambda (f) (send f :normal)))
)
(defun top-face (b)
(car (sorted-faces b :z)))
(defun bottom-face (b)
(car (sorted-faces b :-z)))
(defun face-center (f)
(cadr (send f :centroid)))
(defun face-coords
(f &optional (c (make-cascoords)))
(setq c (copy-object c))
(send c :locate (face-center f) :world)
c)
このhanoi-tableを呼び出すことで,
大域変数にモデルを定義する.
(setq *tables*
(list
(hanoi-table :name "table-a" :pos #f(0 0 0))
(hanoi-table :name "table-b" :pos #f(150 0 0))
(hanoi-table :name "table-c" :pos #f(0 150 0))))
(setq table-a (elt *tables* 0))
(setq table-b (elt *tables* 1))
(setq table-c (elt *tables* 2))
(setq *hanoi-draw-number* 0)
(setq *hanoi-kdraw-file* "block")
(hanoi-execute 4)
のように3台のテーブルを定義する.
generated through LaTeX2HTML. M.Inaba 平成18年5月7日