- UID
 - 500461
 
- 积分
 - 235
 
- 精华
 
- 贡献
 -  
 
- 威望
 -  
 
- 活跃度
 -  
 
- D豆
 -  
 
- 在线时间
 -  小时
 
- 注册时间
 - 2006-10-12
 
- 最后登录
 - 1970-1-1
 
 
 
 
 
 
 | 
 
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册 
 
 
 
 
×
 
 本帖最后由 czx663 于 2014-8-6 14:10 编辑  
 
   用VBA或者Lisp调用TransFromBy的方法,在下面矩阵时会出现,不能按非统一比例缩放的错误: 
    transMat(0, 0) = 1: transMat(0, 1) = 0.70710678118654: transMat(0, 2) = 0#: transMat(0, 3) = 0# 
    transMat(1, 0) = 0: transMat(1, 1) = 0.70710678118654: transMat(1, 2) = 0#: transMat(1, 3) = 0# 
    transMat(2, 0) = 0#: transMat(2, 1) = 0#: transMat(2, 2) = 1#: transMat(2, 3) = 0# 
    transMat(3, 0) = 0#: transMat(3, 1) = 0#: transMat(3, 2) = 0#: transMat(3, 3) = 1# 
所以自己写了一个矩阵变换的Lisp: 
;|对点进行矩阵变换 
返回值: 变换后的点 
参数:InPt 输入的点  类型:列表      
     Matrix 用于转换的4*4矩阵 类型:二维表|; 
(defun transPtFromBy (InPt Matrix / Str XYZ L M Scale OutPt MyErr OldErr) 
  (defun MyErr (msg) 
    (setq OutPt nil) 
    (alert Str) 
  )     ;defun MyErr 
  (defun ListMuti (List1 List2 / Num Len n) 
    (if (not (= (length List1) (length List2))) 
      (progn 
 (setq str "计算的列表长度不一致") 
 (exit) 
      ) 
    )     ;if 
    (setq Num 0) 
    (setq Len (length List1)) 
    (setq n 0) 
    (repeat Len 
      (setq Num (+ Num (* (nth n List1) (nth n List2)))) 
      (setq n (1+ n)) 
    ) 
    Num 
  )     ;defun ListMuti 
(setq OldErr *error*) 
(setq *error* MyErr)  
  (if (and (listp Matrix) (= 4 (length Matrix))) 
    (foreach L Matrix 
      (if (and (listp L) (= 4 (length L))) 
 (foreach M L 
   (if (not (numberp m)) 
     (progn 
       (setq str "输入的Matrix类型有误,存在非数值元素") 
       (exit) 
     )    ;progn 
   ) 
 )    ;foreach 
 (progn 
   (setq Str "输入的Matrix元素,有非列表元素或列表不是4*4列表") 
   (exit) 
 )    ;progn 
      )     ;if 
    )     ;foreach 
    (progn 
      (setq Str "输入的Matrix不是列表,或不是4*4列表") 
      (exit) 
    )     ;progn 
  )     ;if   ;判断矩阵是否符合要求 
  (if (and (listp InPt) (= 3 (length InPt))) 
    (foreach XYZ InPt 
      (if (not (numberp XYZ)) 
 (progn 
   (setq Str "输入点有误,内含非数值元素") 
   (exit) 
 )    ;progn 
      )     ;if 
    )     ;foreach 
    (progn 
      (setq Str "输入点有误,请用表输入三维点") 
      (exit) 
    )     ;progn 
  )     ;if 判断输入点是否有否符合要求 
  (setq Scale (car (reverse (car (reverse Matrix))))) 
  (setq InPt (append Inpt (list 1))) 
  (foreach L Matrix 
    (setq OutPt (append OutPt (list (* Scale (ListMuti InPt L))))) 
  ) 
  (setq OutPt (reverse (cdr (reverse OutPt)))) 
(setq *error* OldErr) 
  OutPt 
) 
 
 |   
 
 
 
 |