明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1116|回复: 6

[函数] 利用向量计算两条直线的夹角

  [复制链接]
发表于 2023-9-9 11:49:20 | 显示全部楼层 |阅读模式
本帖最后由 dtucad 于 2023-9-9 12:03 编辑

上次弄了个利用向量判断点和直线的位置 http://bbs.mjtd.com/thread-188436-1-1.html
这次来个利用向量计算两条直线的夹角(gpt回答有些问题,手动修改了下,如有错误请指正)
没啥技术含量,向量入门知识,希望对新手有用


  1. ;利用向量计算两条直线的夹角
  2. ;参数:直线1起点、终点,直线2起点、终点
  3. ;返回夹角的弧度值
  4. (defun angle-between-lines (p1 p2 p3 p4 / cosa dp m-v1 m-v2 v1 v2)
  5.   (setq v1 (mapcar '- p2 p1)); 计算直线1的方向向量
  6.   (setq v2 (mapcar '- p4 p3)); 计算直线2的方向向量
  7.   (setq dp (+ (* (car v1) (car v2)) (* (cadr v1) (cadr v2)) (* (caddr v1) (caddr v2)))) ; 计算两个向量的点积
  8.   (setq m-v1 (sqrt (+ (* (car v1) (car v1)) (* (cadr v1) (cadr v1)) (* (caddr v1) (caddr v1))))) ; 计算向量v1的模长
  9.   (setq m-v2 (sqrt (+ (* (car v2) (car v2)) (* (cadr v2) (cadr v2)) (* (caddr v2) (caddr v2))))) ; 计算向量v2的模长
  10.   (setq cosA (/ dp (* m-v1 m-v2))) ; 计算夹角的余弦值
  11.   (if (zerop cosA) ; 判断是否0值
  12.     (/ pi 2) ; 0值时为0.5pi
  13.     (atan (sqrt (- 1.0 (* cosA cosA))) cosA) ; 利用反正切函数求反余弦
  14.   )
  15. )

  16. ;测试用
  17. (defun c:tt (/ ang p1 p2 p3 p4)
  18.   (if (and
  19.         (setq p1 (getpoint "\n指定直线1起点"))
  20.         (setq p2 (getpoint p1 "\n指定直线1终点"))
  21.         (setq p3 (getpoint "\n指定直线2起点"))
  22.         (setq p4 (getpoint p3 "\n指定直线2终点"))
  23.       )
  24.     (progn
  25.       (setq ang (angle-between-lines p1 p2 p3 p4))
  26.       (princ (strcat "\n两直线夹角为:" (rtos ang 2 4)))
  27.     )
  28.   )
  29.   (princ)
  30. )


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-9-9 13:58:20 | 显示全部楼层
本帖最后由 ynhh 于 2023-9-9 21:06 编辑

这平面的好象有现成的函数吧

谢谢
  1. (defun p-line-dis (PT ;点
  2. P-1 ;线端点1
  3. P-2 ;线端点2
  4. /
  5. angcos ;线 PT P-1 和线 P-2 P-1 的夹角的cos
  6. disp-1 ;PT 和 P-1 间距离
  7. disp-2 ;PT 和 P-2 间距离
  8. dis1-2 ;P-1 和 P-2 间距离
  9. tem;三维点与三维直线的最短长度距离
  10. )
  11. (setq disp-1 (distance PT P-1)  
  12. disp-2 (distance PT P-2)  
  13. dis1-2 (distance P-1 P-2))

  14. (IF (< (ABS (- (+ disp-1 disp-2) dis1-2)) 1e-3);当点在线上时
  15. (setq tem 0)
  16. (PROGN  
  17. (setq angcos (/ (+ (expt disp-1 2.0) (expt dis1-2 2.0) (* -1.0 (expt disp-2 2.0))) 2.0 disp-1 dis1-2))  
  18. (setq tem (- 1.0 (expt angcos 2.0));返回N次方  
  19. tem (sqrt tem);返回一个数的平方根
  20. tem (* disp-1 tem)  
  21. )
  22. ))
  23. tem;看到此贴临时写的,没有足够验证。
  24. )



发表于 2023-9-9 14:09:24 | 显示全部楼层
4点的选择顺序会影响最终计算结果
发表于 2023-9-9 14:15:53 | 显示全部楼层
ynhh 发表于 2023-9-9 13:58
这平面的好象有现成的函数吧
老师来个
求空间点到空间直线的垂足点

(defun PtPer2Pt        (p0 p1 p2 / s1)
  "点到两点的垂足点和垂线长"
  (command "line" "non" p1 "non" p2 "")
  (setq        s1 (entlast)
        pt (vlax-curve-getclosestpointto s1 p0)
  )
  (entdel s1)
  (list pt (distance p0 pt))
)
发表于 2023-9-9 18:18:03 | 显示全部楼层
本帖最后由 ynhh 于 2023-9-9 21:05 编辑
xyp1964 发表于 2023-9-9 14:15
(defun PtPer2Pt        (p0 p1 p2 / s1)
  "点到两点的垂足点和垂线长"
  (command "line" "non" p1 "non" p2 ...

院长威武


(command "line" "non" p1 "non" p2 "")

请教这里的   "non" 是什么作用?

好象不要也可以

发表于 2023-9-9 19:01:12 来自手机 | 显示全部楼层
ynhh 发表于 2023-9-9 18:18
院长威武

(command "line" "non" p1 "non" p2 "")

临时关闭捕捉吧。
发表于 2023-9-9 19:24:37 | 显示全部楼层
本帖最后由 ynhh 于 2023-9-9 20:55 编辑
xyp1964 发表于 2023-9-9 14:15
(defun PtPer2Pt        (p0 p1 p2 / s1)
  "点到两点的垂足点和垂线长"
  (command "line" "non" p1 "non" p2 ...

"non"  是临时关闭捕捉的意思吧?


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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 04:41 , Processed in 0.162402 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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