;;; 转换函数
(defun Trans1 (A B C p / )
(if (caddr p)
(MAT:mxp (cadr (Mat:Get3PMatrix a b c)) p)
(Mat:mxp (cadr (Mat:Get3PMatrix a b c))
(list (car p) (cadr p) 0 )
)
)
other functions.
;;;-----------------------------------------------------------;;
;;; Vector Norm - Lee Mac ;;
;;; Args: v - vector in R^n ;;
;;;-----------------------------------------------------------;;
(defun Mat:norm ( v )
(sqrt (apply '+ (mapcar '* v v)))
)
;;;-----------------------------------------------------------;;
;;; Vector x Scalar - Lee Mac ;;
;;; Args: v - vector in R^n, s - real scalar ;;
;;;-----------------------------------------------------------;;
(defun Mat:vxs ( v s )
(mapcar (function (lambda ( n ) (* n s))) v)
)
;;;-----------------------------------------------------------;;
;;; Unit Vector - Lee Mac ;;
;;; Args: v - vector in R^n ;;
;;;-----------------------------------------------------------;;
(defun Mat:unit ( v )
( (lambda ( n )
(if (equal 0.0 n 1e-14)
nil
(Mat:vxs v (/ 1.0 n))
)
)
(Mat:norm v)
)
)
;;;-----------------------------------------------------------;;
;;; Mat:v*v Returns the dot product of 2 vectors ;;
;;;-----------------------------------------------------------;;
(defun Mat:Dot (v1 v2)
(apply '+ (mapcar '* v1 v2))
)
;;;-----------------------------------------------------------;;
;;; Vector Cross Product - Lee Mac ;;
;;; Args: u,v - vectors in R^3 ;;
;;;-----------------------------------------------------------;;
(defun Mat:v^v ( u v )
(list
(- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
(- (* (car v) (caddr u)) (* (car u) (caddr v)))
(- (* (car u) (cadr v)) (* (car v) (cadr u)))
)
)
;;;-----------------------------------------------------------;;
;;; Mat:trp Transpose a matrix -Doug Wilson- ;;
;;;-----------------------------------------------------------;;
(defun Mat:trp (m)
(apply 'mapcar (cons 'list m))
)
;;;-----------------------------------------------------------;;
;;; Matrix x Vector - Vladimir Nesterovsky ;;
;;; Args: m - nxn matrix, v - vector in R^n ;;
;;;-----------------------------------------------------------;;
(defun Mat:mxv (m v)
(mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
)
;;;-----------------------------------------------------------;;
;;; 点到矩阵的变换 ;;
;;;-----------------------------------------------------------;;
(defun MAT:mxp (m p)
(reverse (cdr (reverse (MAT:mxv m (append p '(1.0))))))
)
;;;-----------------------------------------------------------;;
;;; Mat:mxm Multiply two matrices -Vladimir Nesterovsky- ;;
;;;-----------------------------------------------------------;;
(defun Mat:mxm (m q)
(mapcar (function (lambda (r) (Mat:mxv (Mat:trp q) r))) m)
)
;;;-----------------------------------------------------------;;
;;; Mat:Get3PMatrix -Highflybird- ;;
;;;-----------------------------------------------------------;;
(defun Mat:Get3PMatrix (p1 p2 p3 / v1 v2 v3 mat org)
(defun AppendMatrix (mat org)
(append
(mapcar 'append mat (mapcar 'list org))
'((0. 0. 0. 1.))
)
)
(setq v1 (Mat:unit (mapcar '- p2 p1)))
(setq v2 (Mat:unit (mapcar '- p3 p1)))
(setq v3 (Mat:unit (Mat:v^v v1 v2)))
(setq v2 (Mat:unit (Mat:v^v v3 v1)))
(setq mat (list v1 v2 v3))
(setq org (mapcar '- (Mat:mxv mat p1)))
(list
(AppendMatrix mat org) ;wcs->this transformation matrix
(AppendMatrix (Mat:trp mat) p1) ;this->wcs transformation matrix
)
)