明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 422|回复: 6

[函数] 利用向量求点到直线的垂直距离

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

上次弄了个利用向量计算两条直线的夹角http://bbs.mjtd.com/thread-188543-1-1.html

这次利用上次的函数求点到直线的垂直距离
没啥技术含量,向量入门知识,希望对新手有用。
水平有限,如有错误,请不吝指正。

  1. ;利用向量求点到直线的垂直距离
  2. ;参数1、2:直线起点、终点
  3. ;参数3:直线外一点
  4. ;返回值:点到直线的垂直距离
  5. (defun distance-to-line (p1 p2 cp / ang dis)
  6.   (setq ang (angle-between-lines p1 p2 p1 cp));以p1为起点的2条直线的夹角
  7.   (setq dis (distance p1 cp));三角形斜边长度
  8.   (* dis (sin ang))
  9. )

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

  25. ;测试用
  26. (defun c:tt (/ cp dis p1 p2)
  27.   (if (and
  28.         (setq p1 (getpoint "\n指定直线起点"))
  29.         (setq p2 (getpoint p1 "\n指定直线终点"))
  30.         (setq cp (getpoint "\n指定直线外一点"))
  31.       )
  32.     (progn
  33.       (setq dis (distance-to-line p1 p2 cp))
  34.       (princ (strcat "\n点到直线的距离为:" (rtos dis 2 4)))
  35.     )
  36.   )
  37.   (princ)
  38. )


点评

面积除底等于高  发表于 2023-9-12 11:00
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-9-11 23:24 | 显示全部楼层
点到直线距离应该是一句话函数.高飞版主trans讲课中最后实例有提到.
发表于 2023-9-12 07:34 | 显示全部楼层
tigcat 发表于 2023-9-11 23:24
点到直线距离应该是一句话函数.高飞版主trans讲课中最后实例有提到.

这里解释得也很清楚http://bbs.mjtd.com/thread-188468-1-1.html
 楼主| 发表于 2023-9-12 09:50 | 显示全部楼层
trans背后实质是用的矩阵变换,这只是桌子提供的一个轮子,虽然用起来很方便,但是并不是因为有了这个轮子,我们就不用学习向量、矩阵的知识了。
这只是向量应用的一个例子而已,并不是说它有多高级,有多省代码,主要是帮助学习向量,理解底层原理,理解了底层原理才能造出新的轮子。
假如桌子没有提供distance函数,你能利用向量计算出两点的距离吗?

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 赞一个!

查看全部评分

发表于 2023-9-12 10:58 | 显示全部楼层
没那么复杂
  1. (defun distance-to-line         (p1 p2 cp / vxv)
  2.     (defun vxv        (u v)
  3.         (list (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  4.               (- (* (car v) (caddr u)) (* (car u) (caddr v)))
  5.               (- (* (car u) (cadr v)) (* (car v) (cadr u)))))
  6.     (/ (distance '(0 0 0)
  7.                  (vxv (mapcar '- cp p1) (mapcar '- cp p2)))
  8.        (distance p1 p2)))

评分

参与人数 1明经币 +1 收起 理由
dtucad + 1 叉乘 本来准备下次发的,这次是上次帖子的.

查看全部评分

发表于 2023-9-12 11:06 | 显示全部楼层
dtucad 发表于 2023-9-12 09:50
trans背后实质是用的矩阵变换,这只是桌子提供的一个轮子,虽然用起来很方便,但是并不是因为有了这个轮子 ...
  1. (sqrt (apply '+ (mapcar '(lambda (x y)  (* (- x y) (- x y)) ) pt1 pt2)))
复制代码


用这一问太简单了。

评分

参与人数 2明经币 +2 收起 理由
dtucad + 1 求模长,都是入门知识
x_s_s_1 + 1 神马都是浮云,加一维

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-5 08:29 , Processed in 0.420329 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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