(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台のテーブルを定義する.