马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 marting 于 2025-3-24 18:06 编辑
 - ;;; 函数名称: XD::Geom:AngleToRange
- ;;; 功能: 将输入角度 (弧度) 转换为 8 个等分区间的编号 (1-8)。
- ;;; 该函数会先将角度归一化到 [0, 2π) 范围,然后返回对应的区间编号。
- ;;; 参数:
- ;;; - ANG (浮点数): 输入角度,单位为弧度。
- ;;; 返回值:
- ;;; - 整数 (1~8): 代表角度所在的 8 个等分区间。
- (defun XD::Geom:AngleToRange8 (ang /)
- ;; 归一化角度,使其落入 [0, 2π) 范围
- (setq ang (mod (+ ang (* pi 2)) (* pi 2)))
- ;; 判断角度所在的 8 个区间
- (cond
- ((and (>= ang (* pi 0.0)) (< ang (* pi 0.25))) 1) ;; 0 ~ π/4
- ((and (>= ang (* pi 0.25)) (< ang (* pi 0.5))) 2) ;; π/4 ~ π/2
- ((and (>= ang (* pi 0.5)) (< ang (* pi 0.75))) 3) ;; π/2 ~ 3π/4
- ((and (>= ang (* pi 0.75)) (< ang (* pi 1.0))) 4) ;; 3π/4 ~ π
- ((and (>= ang (* pi 1.0)) (< ang (* pi 1.25))) 5) ;; π ~ 5π/4
- ((and (>= ang (* pi 1.25)) (< ang (* pi 1.5))) 6) ;; 5π/4 ~ 3π/2
- ((and (>= ang (* pi 1.5)) (< ang (* pi 1.75))) 7) ;; 3π/2 ~ 7π/4
- ((and (>= ang (* pi 1.75)) (< ang (* pi 2.0))) 8) ;; 7π/4 ~ 2π
- )
- )
可以进一步优化代码
 - (defun XD::Geom:AngleToRange8 (ang /)
- ;|将角度转换为八个区间区间的编号,并将边界值归入下一个区间。
- 该函数将输入角度 `ang` 归一化到 [0, 2π) 范围内,并根据归一化后的角度计算其所在的八个区间区间。区间编号从 1 到 8,划分如下:
-
- 1. 0 ~ π/4 -> 第 1 区间
- 2. π/4 ~ π/2 -> 第 2 区间
- 3. π/2 ~ 3π/4 -> 第 3 区间
- 4. 3π/4 ~ π -> 第 4 区间
- 5. π ~ 5π/4 -> 第 5 区间
- 6. 5π/4 ~ 3π/2 -> 第 6 区间
- 7. 3π/2 ~ 7π/4 -> 第 7 区间
- 8. 7π/4 ~ 2π -> 第 8 区间
- 参数:
- ang - 输入角度(弧度制),可以是任意浮动值。
-
- 返回值:
- 返回一个整数,表示该角度所对应的区间区间编号,范围从 1 到 8。
- 示例:
- (XD::Geom:AngleToRange8 0) ; 返回 1,因为 0 对应第 1 区间
- (XD::Geom:AngleToRange8 (* pi 1.5)) ; 返回 6,因为 3π/4 对应第 6 区间
- (XD::Geom:AngleToRange8 (* pi 2)) ; 返回 8,因为 2π 对应第 8 区间
- (XD::Geom:AngleToRange8 (* pi 0.25)) ; 返回 2,因为 π/4 对应第 2 区间
- |;
- ;; 归一化角度,使其落入 [0, 2π) 范围
- (setq ang (mod (+ ang (* pi 2)) (* pi 2)))
- ;; 计算区间编号,边界值属于下一个区间
- (+ 1 (fix (/ ang (* pi 0.25))))
- )
|