next up previous
Next: 24.3 ディスクの定義 Up: 24 ハノイの塔のモデル sample/hanoi.l Previous: 24.1 テーブルの定義

24.2 面データの検索と座標系設定

面データの検索には,: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日