**任意軸算法**
官方文檔 https://help.autodesk.com/view/OARX/2019/ENU/?guid=GUID-E19E5B42-0CC7-4EBA-B29F-5E1D595149EE
其大體意思是說:
任意軸算法 被用于在autocad程序內部,用來產生對象坐標系(ocs)的。
給定一個單位向量,任意軸算法可以生成一個坐標系。
算法具體如下:(所有向量位于三維空間,用世界坐標表示)
N--給定的單位向量
Nx--N的x軸分量
Ny--N的y軸分量
Wy--世界坐標系的y軸方向向量,當然是(0,1,0)
Wz--世界坐標系的z軸方向向量,當然是(0,0,1)
Ax--新坐標系的x軸向量
Ay--新坐標系的y軸向量
Az--新坐標系的z軸向量
~~~
新坐標系原點為(0,0,0)
Az=N
If (abs (Nx) < 1/64) and (abs (Ny) < 1/64)?then
Ax = Wy X N?( “X” 表示向量叉乘).
Otherwise,
Ax = Wz X N.
將 Ax 規范化為單位向量.
Ay = N X Ax.
將 Ay 規范化為單位向量
~~~
任意軸算法的lisp實現
```
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;任意軸算法的lisp實現,來自http://bbs.mjtd.com/forum.php?mod=viewthread&tid=99954&highlight=trans
;;OCS的變換矩陣,或叫法線矢量的變換矩陣
(defun OcsMatrix (zdir / xdir)
(or (equal 1.0 (distance '(0 0 0) zdir) 1e-8)
(setq zdir (Normalize zdir)) ; 先把矢量單位化。
)
(if (and (< (abs (car zdir)) 0.015625) ; 如果(abs (Nx) < 1/64)
(< (abs (cadr zdir)) 0.015625) ; 且 (abs (Ny) < 1/64)
)
(setq xdir (Normalize (CrossProduct '(0 1 0) zdir))); Ax = Wy X N (叉積)
(setq xdir (Normalize (CrossProduct '(0 0 1) zdir)));否則 Ax = Wz X N。
)
(list xdir (Normalize (CrossProduct zdir xdir)) zdir) ;Y方向滿足右手型坐標系統
)
;; CrossProduct
;; Returns the cross product (vector) of two vectors
;; Arguments : two vectors
;; 兩個矢量的叉積,參數兩個矢量,返回值一個矢量.
(defun CrossProduct (v1 v2)
(list(\- (\* (cadr v1) (caddr v2)) (\* (caddr v1) (cadr v2)))
(\- (\* (caddr v1) (car v2)) (\* (car v1) (caddr v2)))
(\- (\* (car v1) (cadr v2)) (\* (cadr v1) (car v2)))
)
)
;; Normalize
;; Returns the single unit vector
;; Argument : a vector
;; 把一個矢量單位化.
(defun Normalize (v)
( (lambda (l)
(if (/= 0 l)
(mapcar (function (lambda (x) (/ x l))) v)
)
)
(distance '(0 0 0) v)
)
)
;; Apply a transformation matrix to a vector by Vladimir Nesterovsky
(defun mxv (m v)
(mapcar (function (lambda (r) (apply '+ (mapcar '\* r v)))) m)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
```
驗證上述算法的正確性
思路:給定一個向量normal,用任意軸算法生成normal對應的坐標系cs1
用trans函數 將任意點,從normal對應的ocs(通過系統的任意軸算法生成)變換到cs1,如果點坐標沒有變化,說明 normal對應的ocs和任意軸算法給出的cs1是相同的,也就說明我們的任意軸算法和系統的任意軸算法是功能一致的。
驗證用到的函數
```
;;;;;;;;;;;;;;;;;;;;;;;
;by 鳥哥qq1833183060
;驗證任意軸算法 OcsMatrix 的正確性
;normal 為任意向量
(defun OcsMatrix-test (normal / ent ocsvector)
(setq oldosmode (getvar "osmode"))
(setvar "osmode" (logior (getvar "osmode") 16384))
(setq pt (list 1 1 1))
(command "ucs" "")
(setq ocsvector (OcsMatrix normal))
(princ ocsvector)
(command "ucs" "3p" "0,0,0" (car ocsvector) (cadr ocsvector) )
(setq pt2 (trans '(0 0 1) normal 1))
(princ "\\n(0 0 1)變換后坐標是:")
(princ pt2)
(setq pt2 (trans '(1 0 0) normal 1))
(princ "\\n(1 0 0)變換后坐標是:")
(princ pt2)
(setq pt2 (trans '(0 1 0) normal 1))
(princ "\\n(0 1 0)變換后坐標是:")
(princ pt2)
(setvar "osmode" oldosmode)
(princ)
)
```
執行:(ocsmatrix-test (list 20 33 880))
結果:
(0 0 1)變換后坐標是:(7.70372e-034 1.38778e-017 1.0)
(1 0 0)變換后坐標是:(1.0 -5.55112e-017 3.46945e-018)
(0 1 0)變換后坐標是:(5.55112e-017 1.0 -6.93889e-018)
執行:(ocsmatrix-test (list 20 303 880))
結果:
(0 0 1)變換后坐標是:(-3.46945e-018 5.55112e-017 1.0)
(1 0 0)變換后坐標是:(1.0 0.0 -3.46945e-018)
(0 1 0)變換后坐標是:(0.0 1.0 -5.55112e-017)
執行:(ocsmatrix-test (list 20 0 880))
結果:
(0 0 1)變換后坐標是:(0.0 0.0 1.0)
(1 0 0)變換后坐標是:(1.0 0.0 0.0)
(0 1 0)變換后坐標是:(0.0 1.0 0.0)
**測試通過**
- 前言
- 概述
- autolisp簡介(初)
- 搭建編程環境
- Visual Lisp 編輯器的使用(初)
- vs code的使用
- 基本概念(初)
- 表達式
- 數據類型
- 整數類型
- 實數類型
- 字符串類型
- 列表
- 選擇集類型
- 實體名稱(ename)
- vla對象(vla-object)
- 文件描述符
- 符號和變量(初)(精)
- 源碼文件
- 變量
- 變量的類型
- 變量賦值
- 變量求值
- 預定義變量
- 數值處理
- 字符串處理
- 顯示和輸出
- 控制字符
- 列表操作
- 重點函數列表
- 尺寸標注
- 文字固定偏移
- 填充
- 填充到指定的矩形
- 計算填充面積并標注
- 其他
- 繪制任意曲線的等分線
- 原位縮放
- 修改填充基點和角度
- 批量標注多段線長度
- 統計相同直徑的圓的數量
- z坐標置0
- 生成隨機數
- 圖層
- 相交
- intersectWith無法求交點的幾種情形
- 向量和矩陣
- 向量加減乘除
- 向量長度
- 求單位向量
- 向量點積
- 向量叉積
- 命令和交互
- 調用command命令
- 多段線
- 獲取多段線頂點
- UCS
- 有關ucs的命令和系統變量
- 通過command操作ucs
- 草圖設置
- 捕捉
- 柵格
- 正交
- 對象捕捉
- 坐標系和變換(高級)
- 任意軸算法
- 坐標系
- trans
- geomcal
- autocad開發相關網站
- 小技巧匯總
- 判斷點是否在封閉圖形內
- 安裝
- acad啟動加載順序
- 安裝包制作
- 添加文件到啟動組
- 添加目錄到搜索路徑
- 對話框和圖形界面
- DCL
- openDCL
- 菜單和自定義界面
- 菜單文件
- 自定義文件
- 函數參考
- quote