找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1393|回复: 11

[原创]:为了更好的理解向量,写了几个和XDAPI中向量函数同等功能的LSP函数。

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-2-21 12:58:32 | 显示全部楼层 |阅读模式

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

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

×
这样就好理解了。

  1. <normalfont>
  2. ;;**********************************************************
  3. ;;****************     向量运算          *******************
  4. ;;**********************************************************
  5. ;;角度转换至0 - pi
  6. (defun ea:angle_format0        (ang)
  7.   (cond
  8.     ((> ang pi)
  9.      (- _2pi ang)
  10.     )
  11.     ((< ang 0.0)
  12.      (if (< (abs ang) pi)
  13.        (abs ang)
  14.        (+ _2pi ang)
  15.      )
  16.     )
  17.     (t ang)
  18.   )
  19. )
  20. ;|两个向量的叉积
  21.     | i  j  k |
  22. v1xv2 = | x1 y1 z1 |= (y1z2-y2z1, z1x2-z2x1, x1y2-x2y1)
  23.     | x2 y2 z2 |
  24.       
  25. |;
  26. ;;向量的差积;
  27. (defun ea:vector_CrossProduct
  28.                               (ve1 ve2 / x1 y1 z1 x2 y2 z2)
  29.   (setq        x1 (car ve1)
  30.         y1 (cadr ve1)
  31.         z1 (last ve1)
  32.         x2 (car ve2)
  33.         y2 (cadr ve2)
  34.         z2 (last ve2)
  35.   )
  36.   (list        (- (* y1 z2) (* y2 z1))
  37.         (- (* z1 x2) (* z2 x1))
  38.         (- (* x1 y2) (* x2 y1))
  39.   )
  40. )
  41. ;|夹角 0 - pi 之间
  42. ea:vector_Angle
  43. 功    能:求两向量的夹角
  44. 调用格式:(ea:vector_Angle <向量1> <向量2>)
  45. 返 回 值:实数
  46. |;
  47. (defun ea:vector_angle (v1 v2 / po)
  48.   (setq po '(0.0 0.0 0.0))
  49.   (ea:angle_format0 (abs (- (angle po v2) (angle po v1))))
  50. )
  51. ;|
  52. ea:vector_Divide
  53. 功    能:向量除以一个比例系数
  54. 调用格式:(ea:vector_Divide <向量> <比例>)
  55. 返 回 值:向量;
  56. |;
  57. (defun ea:vector_divide        (ve scl /)
  58.   (mapcar '(lambda (x) (/ x scl)) ve)
  59. )
  60. ;|
  61. ea:vector_IsZeroLength
  62. 功    能:判断向量是否是0长度
  63. 调用格式:(ea:vector_IsZeroLength <向量>)
  64. 返 回 值:是T 否NIL
  65. |;
  66. (defun ea:vector_iszerolength (ve)
  67.   (if (= (distance '(0.0 0.0 0.0) ve) 0.0)
  68.     T
  69.     nil
  70.   )
  71. )
  72. ;|ea:vector_Length
  73. 功    能:求向量的长度
  74. 调用格式:(ea:vector_Length <向量>)
  75. 返 回 值:实数
  76. |;
  77. (defun ea:vector_length        (ve /)
  78.   (distance '(0.0 0.0 0.0) ve)
  79. )
  80. ;|;
  81. ea:vector_Negate
  82. 功    能:求负向量
  83. 调用格式:(ea:vector_Negate <向量>)
  84. 返 回 值:向量
  85. |;
  86. (defun ea:vector_negate        (ve)
  87.   (mapcar '- ve)
  88. )
  89. ;|ea:vector_IsCodirectional
  90. 功    能:判断两向量是否同向
  91. 调用格式:(ea:vector_IsCodirectional <向量1> <向量2>)
  92. 返 回 值:同向T 否NIL
  93. |;
  94. (defun ea:vector_iscodirectional (v1 v2 / po)
  95.   (setq po '(0.0 0.0 0.0))
  96.   (if (= (angle po v1) (angle po v2))
  97.     T
  98.     nil
  99.   )
  100. )
  101. ;|ea:vector_IsEqual
  102. 功    能:判断两向量是否相等
  103. 调用格式:(ea:vector_IsEqual <向量1> <向量2>)
  104. |;
  105. (defun ea:vector_IsEqual (v1 v2)
  106.   (if (and (= (ea:vector_length v1) (ea:vector_length v2))
  107.            (ea:vector_iscodirectional v1 v2)
  108.       )
  109.     T
  110.     nil
  111.   )
  112. )
  113. ;|ea:vector_IsParallel
  114. 功    能:判断两向量是否平行
  115. 调用格式:(ea:vector_IsParallel <向量1> <向量2>)
  116. 返 回 值:平行 T 否 NIL
  117. |;
  118. (defun ea:vector_isparallel (v1 v2)
  119.   (if (or (= (ea:vector_angle v1 v2) 0.0)
  120.           (= (ea:vector_angle v1 v2) pi)
  121.       )
  122.     T
  123.     nil
  124.   )
  125. )
  126. ;|ea:vector_IsPerpendicular
  127. 功    能:判断两向量是垂直
  128. 调用格式:(ea:vector_IsPerpendicular <向量1> <向量2>)
  129. |;
  130. (defun ea:vector_isperpendicular        (v1 v2)
  131.   (if (= (ea:vector_angle v1 v2) _pi2)
  132.     T
  133.     nil
  134.   )
  135. )
  136. ;|ea:vector_IsUnitLength
  137. 功    能:判断一个向量是否是单位向量
  138. 调用格式:(ea:vector_IsUnitLength <向量>)
  139. 返 回 值:是T 否NIL
  140. |;
  141. (defun ea:vector_isunitlength (v)
  142.   (if (equal (ea:vector_Normalize v) (mapcar 'float v))
  143.     t
  144.     nil
  145.   )
  146. )
  147. ;|ea:vector_PerpVector
  148. 功    能:求切向量
  149. 调用格式:(ea:vector_PerpVector <向量>)
  150. 返 回 值:向量
  151. |;
  152. (defun ea:vector_perpvector (v)
  153.   (polar '(0.0 0.0 0.0)
  154.          (+ (angle '(0.0 0.0) (ea:point_2d v)) _pi2)
  155.          1.0
  156.   )
  157. )
  158. </normalfont>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-2-21 13:48:27 | 显示全部楼层
(SETQ _PI2  (/ PI 2)) ????
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-2-21 21:03:48 | 显示全部楼层
最初由 LUCAS 发布
[B](SETQ _PI2  (/ PI 2)) ???? [/B]

是的,我定义了几个常用的几个角度值。
另上面的函数未经严格测试,比如向量旋转的还有问题。

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-2-22 00:44:37 | 显示全部楼层
向量的差积,得到的结果是什么?
就是说两个向量要得到什么才用到差积?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-2-22 00:49:18 | 显示全部楼层
最初由 aeo 发布
[B]向量的差积,得到的结果是什么?
就是说两个向量要得到什么才用到差积? [/B]

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-2-22 00:50:38 | 显示全部楼层
最初由 aeo 发布
[B]向量的差积,得到的结果是什么?
就是说两个向量要得到什么才用到差积? [/B]


点集得到两个向量夹角余弦

差集得到两个向量的组成平面的符合右手法则的“垂向量”,也就是X轴和Y轴差集得到的是Z轴 (1 0 0) X(0 1 0) = (0 0 1)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-2-22 01:03:26 | 显示全部楼层
得到了右手的拇指.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-2-27 09:42:34 | 显示全部楼层
EACHY兄:
求向量的单位向量好像错了????

指令: (xdrx_vector_normalize '(0.0 0.0 1.0))
(0.0 0.0 1.0)

指令: (ea:vector_normalize '(0.0 0.0 1.0))
Error: ** 除以 0 ** ; 错误: *错误* 功能内部已发生一个错误退出/结束跳出
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-2-27 12:07:21 | 显示全部楼层
最初由 LUCAS 发布
[B]EACHY兄:
求向量的单位向量好像错了????

指令: (xdrx_vector_normalize '(0.0 0.0 1.0))
(0.0 0.0 1.0)

指令: (ea:vector_normalize '(0.0 0.0 1.0))
Error: ** 除以 0 ** ; 错误: *错误* 功能内部已发生一... [/B]

在测试优化,下面这个可以用。

  1. ;;求向量的单位向量
  2. (defun ea:vector_Normalize (ve / t_length xy_length)
  3.   (setq        t_length  (distance '(0.0 0.0 0.0) ve)
  4.         xy_length (distance '(0.0 0.0) (list (car ve) (cadr ve)))
  5.   )
  6.   (if (and (/= xy_length 0.0)
  7.            (/= t_length 0.0)
  8.       )
  9.     (list (* (/ xy_length t_length) (/ (car ve) xy_length)) ;X余弦
  10.           (* (/ xy_length t_length) (/ (cadr ve) xy_length)) ;Y余弦
  11.           (if (= (length ve) 3)
  12.             (/ (last ve) t_length)
  13.             0.0
  14.           )
  15.     )                                        ;Z正弦
  16.     (list 0.0
  17.           0.0
  18.           (if (and (= (length ve) 3) (/= (last ve) 0.0))
  19.             1.0
  20.             0.0
  21.           )                                ;Z正弦
  22.     )
  23.   )
  24. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-2-27 12:36:49 | 显示全部楼层
最初由 eachy 发布
[B]
是的,我定义了几个常用的几个角度值。
另上面的函数未经严格测试,比如向量旋转的还有问题。
[CODE]
(setq _pi2 (/ pi 2)
    ... [/B]


我也喜欢这样定义常量
是受stdlib影响------我觉得stdlib确实有很多东西值得借鉴
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-2-28 12:31:06 | 显示全部楼层
EACHY兄:
单位向量還問題????

指令: (ea:vector_normalize '(0.0 0.0 0.0))
Error: ** 除以 0 ** ; 错误: *错误* 功能内部已发生一个错误退出/结束跳出

單位化(Normalize)
矢量Vector(x,y,z)
矢量長度Length(Vector)= |Vector|=sqr(x*x+y*y+z*z)
Normalize後:
(x/Length(Vector),y/Length(Vector),z/Length(Vector))
方向不變,長度為1個單位
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2003-2-28 13:34:47 | 显示全部楼层
最初由 LUCAS 发布
[B]EACHY兄:
单位向量還問題????

指令: (ea:vector_normalize '(0.0 0.0 0.0))
Error: ** 除以 0 ** ; 错误: *错误* 功能内部已发生一个错误退出/结束跳出

單位化(Normalize)
矢量Vector(x,y,z)
矢量長度Leng... [/B]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 09:42 , Processed in 0.206321 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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