马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
 - ;; ------------------------------------------------------------------------
- ;;; 函数名称 / Function Name: XD::GEOM:POINT-FUZ
- ;;;
- ;;; 【功能说明 / Description】
- ;;; 检测点在两个不同基向量定义的坐标系之间往返变换时产生的数值误差。
- ;;; 通过测量点经过两次坐标系转换(v1 -> v2 -> v1)后的位置偏差,评估坐标变换函数的数值稳定性和准确性。
- ;;; 同时对点坐标放大两倍后重复测试,检测误差随坐标尺度变化的情况。
- ;;;
- ;;; 【参数说明 / Parameters】
- ;;; p1 - (list) 二维或三维点坐标列表,例如 (x y) 或 (x y z)
- ;;;
- ;;; 【返回值 / Return Value】
- ;;; (float) 点经过两次往返变换后的位置偏差距离的最大值。
- ;;;
- ;;; 【依赖函数 / Dependencies】
- ;;; - trans : 坐标系转换函数,格式 (trans point from-basis to-basis)
- ;;; - distance : 计算两点欧氏距离函数,格式 (distance point1 point2)
- ;;;
- ;;; 【使用示例 / Example Usage】
- ;;; (XD::GEOM:POINT-FUZ '(1.0 2.0 3.0))
- ;;; => 返回点经过两次变换后的最大误差距离
- ;;;
- ;;; 【备注 / Notes】
- ;;; - v1 和 v2 是两个不同方向的基向量,v2 不能与 v1 共线或为零向量。
- ;;; - 该函数适合用于调试和评估坐标变换模块的数值稳定性。
- ;;;
- (defun XD::GEOM:POINT-FUZ (p1)
- ;; 该函数用于检测点在两个不同基向量定义的坐标系之间往返变换时产生的数值误差。
- ;; 输入:
- ;; p1 - 一个二维或三维点坐标 (x y) 或 (x y z)
- ;; 输出:
- ;; 返回点经过两次基向量空间变换后的位置偏差距离的最大值,反映变换函数的数值稳定性和误差大小。
- ;; 1. 确保点为三维坐标,方便统一处理
- (if (= (length p1) 2)
- (setq p1 (list (first p1) (second p1) 0.0))
- )
- ;; 2. 定义两个基向量 v1 和 v2,代表两个不同的坐标系方向
- ;; v1 是 z 轴单位向量 (0,0,1)
- ;; v2 是指向空间对角线方向的向量 (sin(π/4), sin(π/4), sin(π/4)) ≈ (0.7071,0.7071,0.7071)
- (setq v1 '(0.0 0.0 1.0))
- (setq v2 (sin (/ pi 4.0)))
- (setq v2 (list v2 v2 v2))
- ;; 3. 通过 trans 函数,将点从 v1 坐标系变换到 v2 坐标系,再变换回 v1 坐标系
- ;; 理论上点应回到原位,但实际中会有数值误差
- (setq p2 (trans p1 v1 v2))
- (setq p2 (trans p2 v2 v1))
- ;; 4. 计算变换前后点的欧氏距离,作为误差指标
- (setq d (distance p1 p2))
- ;; 5. 将点坐标放大两倍,重复上述变换和误差计算
- ;; 用于检测误差随坐标尺度变化的情况
- (setq p1 (mapcar (lambda (x) (* 2 x)) p1))
- (setq p2 (trans p1 v1 v2))
- (setq p2 (trans p2 v2 v1))
- (setq d (max d (distance p1 p2)))
- ;; 6. 返回最大误差距离,反映变换函数的数值稳定性
- d
- )
|