本帖最后由 newer 于 2017-4-24 23:40 编辑
通用的向量计算函数
 - ;;;-----------------------------------------------------------;;
- ;;; 两向量的叉积 ;;
- ;;; Vector Cross Product ;;
- ;;; Args: u,v - vectors in R^3 ;;
- ;;;-----------------------------------------------------------;;
- (defun XD::Vec:vxv (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)))
- )
- )
- ;;;-----------------------------------------------------------;;
- ;;; 单位向量 ;;
- ;;; Unit Vector - Lee Mac ;;
- ;;; Args: v - vector in R^n ;;
- ;;;-----------------------------------------------------------;;
- (defun XD::VEC:Normalize (v)
- ((lambda (n)
- (if (equal 0.0 n 1e-14)
- nil
- (XD::VEC:v*s v (/ 1.0 n))
- )
- )
- (XD::VEC:length v)
- )
- )
- ;;;-----------------------------------------------------------;;
- ;;; 向量的模(长度) ;;
- ;;; Vector Norm - Lee Mac ;;
- ;;; Args: v - vector in R^n ;;
- ;;;-----------------------------------------------------------;;
- (defun XD::Vec:length (v)
- (sqrt (apply '+ (mapcar '* v v)))
- )
- ;;;-----------------------------------------------------------;;
- ;;; 向量乘标量(系数) ;;
- ;;; Vector x Scalar - Lee Mac ;;
- ;;; Args: v - vector in R^n, s - real scalar ;;
- ;;;-----------------------------------------------------------;;
- (defun XD::Vec:v*s (v s)
- (mapcar (function (lambda (n) (* n s))) v)
- )
下面是测试命令,红色线画出弧线垂平面的Y轴,黄色线画出弧线垂平面的法线。
 - (defun c:tt ()
- (if (setq e (ssget ":E:N" '((0 . "arc"))))
- (progn
- (setq e (ssname e 0)
- ed (entget e)
- v210 (cdr (assoc 210 ed))
- p1 (vlax-curve-getstartpoint e)
- p2 (vlax-curve-getendpoint e)
- v1 (mapcar '- p1 p2)
- v1 (xd::vec:normalize v1)
- v2 (xd::vec:vxv v210 v1)
- p3 (mapcar '+ p2 (xd::vec:v*s v210 100.0))
- )
- (princ "\n弧线垂平面Y轴用红色线画出")
- (command "line" p2 p3 "")
- (vla-put-color (vlax-ename->vla-object (entlast)) 1)
- (princ "\n弧线垂平面的法线向量是:")
- (princ v2)
- (command "line" p3 (mapcar '+ p3 (xd::vec:v*s v2 100)) "")
- (vla-put-color (vlax-ename->vla-object (entlast)) 2)
- (princ "\n用黄色线画出")
- )
- )
- (princ)
- )
XDRX API 写就是这样:
 - (defun c:tt ()
- (if (setq e (car (xdrx_entsel "\n拾取弧线<退出>:" '((0 . "arc")))))
- (progn
- (xdrx_getpropertyvalue e "normal" "startpoint" "endpoint")
- (setq
- v1 (mapcar '- #startpoint #endpoint)
- v1 (xdrx_vector_normalize v1)
- v2 (xdrx_vector_crossproduct #normal v1)
- p3 (mapcar '+ p2 (xdrx_vector_product #normal 100.0))
- )
- (xdrx_line_make #endpoint p3)
- (xdrx_setpropertyvalue (entlast) "color" 1)
- (xdrx_prompt "\n弧线垂平面Y轴用红色线画出.\n弧线垂平面的法线向量是:" v2)
- (xdrx_line_make
- p3
- (mapcar '+ p3 (xdrx_vector_product v2 100))
- )
- (xdrx_setpropertyvalue (entlast) "color" 2)
- (xdrx_prompt "\n用黄色线画出")
- )
- )
- (princ)
- )
|