马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
 - ;;; ------------------------------------------------------------------------
- ;;; 函数名称 / Function Name: XD::GEOM:VECTOR-D-ANGLE
- ;;;
- ;;; 【功能说明 / Description】
- ;;; 计算两个三维向量之间的夹角,始终返回小于等于 π 的正夹角。
- ;;; Calculates the smallest positive angle between two 3D vectors (0 to π).
- ;;;
- ;;; 功能包括 / Features:
- ;;; - 单位化输入向量
- ;;; Normalize the input vectors
- ;;; - 判断零向量或相等向量,直接返回 0
- ;;; If either vector is zero or both are equal, return 0
- ;;; - 利用向量叉积确定旋转平面,并在该平面内求角度差
- ;;; Use cross product to define rotation plane and calculate angle
- ;;; - 保证返回的角度在 [0, π] 之间
- ;;; Ensures returned angle is within [0, π]
- ;;;
- ;;; 【参数说明 / Parameters】
- ;;; v1 - 第一个三维向量(列表形式)/ First 3D vector in list form
- ;;; v2 - 第二个三维向量(列表形式)/ Second 3D vector in list form
- ;;;
- ;;; 【返回值 / Return Value】
- ;;; 两向量的正向夹角,单位为弧度,范围为 [0, π]
- ;;; Positive angle between the vectors, in radians, range [0, π]
- ;;;
- ;;; 【依赖函数 / Dependencies】
- ;;; - XD::GEOM:UNIT-VECTOR : 向量单位化 / Normalize a vector
- ;;; - XD::GEOM:CROSS-PRODUCT : 向量叉积 / Compute cross product
- ;;; - trans : 向量投影到特定坐标系(AutoLISP 内建)/ Transform vectors into a plane
- ;;; - angle : AutoLISP 内建函数,返回两点之间的角度
- ;;;
- ;;; 【使用示例 / Example Usage】
- ;;; (XD::GEOM:VECTOR-D-ANGLE '(1 0 0) '(0 1 0)) => 1.5708 ; π/2
- ;;; (XD::GEOM:VECTOR-D-ANGLE '(1 0 0) '(1 0 0)) => 0.0 ; 同向
- ;;; (XD::GEOM:VECTOR-D-ANGLE '(1 0 0) '(-1 0 0)) => 3.1416 ; 反向
- ;;;
- ;;; 【备注 / Notes】
- ;;; - 主要用于几何分析、空间方向判断等
- ;;; Useful for geometric analysis and spatial orientation checks
- ;;; ------------------------------------------------------------------------
- (defun XD::GEOM:VECTOR-D-ANGLE (v1 v2 / xv a sign)
- ;; 如果任意一个向量为零向量,或两向量单位化后相等,夹角为 0
- (if
- (or (equal v1 '(0.0 0.0 0.0) 1.0e-10)
- (equal v2 '(0.0 0.0 0.0) 1.0e-10)
- (setq v1 (XD::GEOM:UNIT-VECTOR '(0.0 0.0 0.0) v1))
- (and (setq v2 (XD::GEOM:UNIT-VECTOR '(0.0 0.0 0.0) v2))
- (equal v1 v2 1.0e-10)
- )
- )
- ;; 返回角度为 0.0
- (progn (setq a 0.0))
-
- ;; 正常计算角度
- (progn
- ;; 求单位向量的叉积,定义旋转参考平面
- (setq xv (XD::GEOM:CROSS-PRODUCT v1 v2))
- ;; 将 v1 和 v2 投影到该平面
- (setq v1 (trans v1 0 xv))
- (setq v2 (trans v2 0 xv))
- ;; 计算两向量的角度差(在该平面内)
- (setq a (- (angle '(0.0 0.0 0.0) v2)
- (angle '(0.0 0.0 0.0) v1)))
- ;; 取绝对值
- (setq a (abs a))
- ;; 若角度大于 π,则取补角
- (if (> a pi)
- (progn (setq a (- (+ pi pi) a))))
- )
- )
- ;; 返回夹角值
- a
- )
|