找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 132|回复: 1

[几何] XD::GEOM:VECTOR-D-ANGLE

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2025-5-10 11:30:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. ;;; ------------------------------------------------------------------------
  2. ;;; 函数名称 / Function Name: XD::GEOM:VECTOR-D-ANGLE
  3. ;;;
  4. ;;; 【功能说明 / Description】
  5. ;;;     计算两个三维向量之间的夹角,始终返回小于等于 π 的正夹角。
  6. ;;;     Calculates the smallest positive angle between two 3D vectors (0 to π).
  7. ;;;
  8. ;;;     功能包括 / Features:
  9. ;;;       - 单位化输入向量
  10. ;;;         Normalize the input vectors
  11. ;;;       - 判断零向量或相等向量,直接返回 0
  12. ;;;         If either vector is zero or both are equal, return 0
  13. ;;;       - 利用向量叉积确定旋转平面,并在该平面内求角度差
  14. ;;;         Use cross product to define rotation plane and calculate angle
  15. ;;;       - 保证返回的角度在 [0, π] 之间
  16. ;;;         Ensures returned angle is within [0, π]
  17. ;;;
  18. ;;; 【参数说明 / Parameters】
  19. ;;;     v1 - 第一个三维向量(列表形式)/ First 3D vector in list form
  20. ;;;     v2 - 第二个三维向量(列表形式)/ Second 3D vector in list form
  21. ;;;
  22. ;;; 【返回值 / Return Value】
  23. ;;;     两向量的正向夹角,单位为弧度,范围为 [0, π]
  24. ;;;     Positive angle between the vectors, in radians, range [0, π]
  25. ;;;
  26. ;;; 【依赖函数 / Dependencies】
  27. ;;;     - XD::GEOM:UNIT-VECTOR     : 向量单位化 / Normalize a vector
  28. ;;;     - XD::GEOM:CROSS-PRODUCT   : 向量叉积 / Compute cross product
  29. ;;;     - trans                    : 向量投影到特定坐标系(AutoLISP 内建)/ Transform vectors into a plane
  30. ;;;     - angle                    : AutoLISP 内建函数,返回两点之间的角度
  31. ;;;
  32. ;;; 【使用示例 / Example Usage】
  33. ;;;     (XD::GEOM:VECTOR-D-ANGLE '(1 0 0) '(0 1 0)) => 1.5708 ; π/2
  34. ;;;     (XD::GEOM:VECTOR-D-ANGLE '(1 0 0) '(1 0 0)) => 0.0    ; 同向
  35. ;;;     (XD::GEOM:VECTOR-D-ANGLE '(1 0 0) '(-1 0 0)) => 3.1416 ; 反向
  36. ;;;
  37. ;;; 【备注 / Notes】
  38. ;;;     - 主要用于几何分析、空间方向判断等
  39. ;;;       Useful for geometric analysis and spatial orientation checks
  40. ;;; ------------------------------------------------------------------------
  41. (defun XD::GEOM:VECTOR-D-ANGLE (v1 v2 / xv a sign)
  42.   ;; 如果任意一个向量为零向量,或两向量单位化后相等,夹角为 0
  43.   (if
  44.     (or (equal v1 '(0.0 0.0 0.0) 1.0e-10)
  45.         (equal v2 '(0.0 0.0 0.0) 1.0e-10)
  46.         (setq v1 (XD::GEOM:UNIT-VECTOR '(0.0 0.0 0.0) v1))
  47.         (and (setq v2 (XD::GEOM:UNIT-VECTOR '(0.0 0.0 0.0) v2))
  48.              (equal v1 v2 1.0e-10)
  49.         )
  50.     )
  51.     ;; 返回角度为 0.0
  52.     (progn (setq a 0.0))
  53.    
  54.     ;; 正常计算角度
  55.     (progn
  56.       ;; 求单位向量的叉积,定义旋转参考平面
  57.       (setq xv (XD::GEOM:CROSS-PRODUCT v1 v2))

  58.       ;; 将 v1 和 v2 投影到该平面
  59.       (setq v1 (trans v1 0 xv))
  60.       (setq v2 (trans v2 0 xv))

  61.       ;; 计算两向量的角度差(在该平面内)
  62.       (setq a (- (angle '(0.0 0.0 0.0) v2)
  63.                  (angle '(0.0 0.0 0.0) v1)))

  64.       ;; 取绝对值
  65.       (setq a (abs a))

  66.       ;; 若角度大于 π,则取补角
  67.       (if (> a pi)
  68.         (progn (setq a (- (+ pi pi) a))))
  69.     )
  70.   )
  71.   ;; 返回夹角值
  72.   a
  73. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1346个

财富等级: 财源广进

发表于 2025-5-11 10:56:09 | 显示全部楼层
谢谢版大的分享!收藏起来
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-7 02:35 , Processed in 0.220573 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表