dtucad 发表于 2023-9-9 11:49:20

利用向量计算两条直线的夹角

本帖最后由 dtucad 于 2023-9-9 12:03 编辑

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


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

;测试用
(defun c:tt (/ ang p1 p2 p3 p4)
(if (and
      (setq p1 (getpoint "\n指定直线1起点"))
      (setq p2 (getpoint p1 "\n指定直线1终点"))
      (setq p3 (getpoint "\n指定直线2起点"))
      (setq p4 (getpoint p3 "\n指定直线2终点"))
      )
    (progn
      (setq ang (angle-between-lines p1 p2 p3 p4))
      (princ (strcat "\n两直线夹角为:" (rtos ang 2 4)))
    )
)
(princ)
)


ynhh 发表于 2023-9-9 13:58:20

本帖最后由 ynhh 于 2023-9-9 21:06 编辑

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

谢谢
(defun p-line-dis (PT ;点
P-1 ;线端点1
P-2 ;线端点2
/
angcos ;线 PT P-1 和线 P-2 P-1 的夹角的cos
disp-1 ;PT 和 P-1 间距离
disp-2 ;PT 和 P-2 间距离
dis1-2 ;P-1 和 P-2 间距离
tem;三维点与三维直线的最短长度距离
)
(setq disp-1 (distance PT P-1)
disp-2 (distance PT P-2)
dis1-2 (distance P-1 P-2))

(IF (< (ABS (- (+ disp-1 disp-2) dis1-2)) 1e-3);当点在线上时
(setq tem 0)
(PROGN
(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))
(setq tem (- 1.0 (expt angcos 2.0));返回N次方
tem (sqrt tem);返回一个数的平方根
tem (* disp-1 tem)
)
))
tem;看到此贴临时写的,没有足够验证。
)


xyp1964 发表于 2023-9-9 14:09:24

4点的选择顺序会影响最终计算结果

xyp1964 发表于 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))
)

ynhh 发表于 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" 是什么作用?

好象不要也可以

hubeiwdlue 发表于 2023-9-9 19:01:12

ynhh 发表于 2023-9-9 18:18
院长威武

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


临时关闭捕捉吧。

ynhh 发表于 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"是临时关闭捕捉的意思吧?


谢谢
页: [1]
查看完整版本: 利用向量计算两条直线的夹角