明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 823|回复: 15

[函数] 利用向量求点到直线垂足的坐标

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

利用向量求点到直线垂足的坐标,可用于三维
没啥技术含量,向量入门知识,希望对新手有用。
水平有限,如有错误,请不吝指正。

  1. ;利用向量求点到直线垂足的坐标
  2. ;参数1:直线起点、终点
  3. ;参数2:直线外一点
  4. ;返回值:点到直线垂足的坐标
  5. (defun footcoord (p1 p2 cp / dis dot-product foot projection v-p v-w)
  6.   (setq v-w (mapcar '- p2 p1));向量p1-p2
  7.   (setq v-p (mapcar '- cp p1));向量p1-cp
  8.   ;计算点到直线的投影比例
  9.   (setq dot-product (+ (* (car v-p) (car v-w)) (* (cadr v-p) (cadr v-w)) (* (caddr v-p) (caddr v-w))));点乘
  10.   (setq dis (distance p1 p2))
  11.   (setq projection (/ dot-product (expt dis 2)))
  12.   (setq foot (list (+ (car p1) (* (car v-w) projection)) (+ (cadr p1) (* (cadr v-w) projection)) (+ (caddr p1) (* (caddr v-w) projection))));求垂足的坐标
  13. )

  14. ;测试用
  15. (defun c:tt (/ cp dis p1 p2 pt)
  16.   (if (and
  17.         (setq p1 (getpoint "\n指定直线起点"))
  18.         (setq p2 (getpoint p1 "\n指定直线终点"))
  19.         (setq cp (getpoint "\n指定直线外一点"))
  20.       )
  21.     (progn
  22.       (setq pt (footcoord p1 p2 cp))
  23.       (princ "\n点到直线的垂足坐标为:")(princ pt)
  24.     )
  25.   )
  26.   (princ)
  27. )


点评

点积写得太罗嗦了。(apply '+ (mapcar '* v-w v-p)) 即可,而且对于多维向量也是成立的。p1 向 p2 走投影长度那一段也是,也可以简化。  发表于 2023-9-12 11:15
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2023-9-12 12:45 | 显示全部楼层
本帖最后由 dtucad 于 2023-9-12 13:14 编辑

谢谢大佬的优化建议,下次手动优化一下(gpt的码确实不够简洁,但是整体流程还是非常清晰),谢谢大佬

  1. ;利用向量求点到直线垂足的坐标
  2. ;参数1:直线起点、终点
  3. ;参数2:直线外一点
  4. ;返回值:点到直线垂足的坐标
  5. (defun footcoord (p1 p2 cp / dis dot-product foot projection v-p v-w)
  6.   (setq v-w (mapcar '- p2 p1));向量p1-p2
  7.   (setq v-p (mapcar '- cp p1));向量p1-cp
  8.   ;计算点到直线的投影比例
  9.   
  10.   ;(setq dot-product (+ (* (car v-p) (car v-w)) (* (cadr v-p) (cadr v-w)) (* (caddr v-p) (caddr v-w))));点乘
  11.   (setq dot-product (apply '+ (mapcar '* v-w v-p)));点乘
  12.   (setq dis (distance p1 p2))
  13.   (setq projection (/ dot-product (expt dis 2)))
  14.   ;(setq foot (list (+ (car p1) (* (car v-w) projection)) (+ (cadr p1) (* (cadr v-w) projection)) (+ (caddr p1) (* (caddr v-w) projection))));求垂足的坐标
  15.   (mapcar '(lambda (x y)(+ x (* y projection))) p1 v-w);求垂足的坐标
  16. )



发表于 2023-9-17 21:07 | 显示全部楼层
vormittag 发表于 2023-9-17 19:40
如果垂足不在曲线上,找到的就是曲线比较近的端点。比如直线两点是 (-1,0) 和 (1,0),点 P 是 (5,3),得 ...

(vlax-curve-getClosestPointTo curve givenPnt [extend])

功能
    返回曲线上离指定点最近的点(在 WCS 上)。

说明
1)参数 curve为要测量的对象。
2)参数 givenPnt 为点(在 WCS 上),寻找曲线上距该点最近的点。
3)参数 extend 若指定该参数且其值不为 nil,那么 vlax-curve-getClosestPointTo  在搜索最近点时扩展曲线。
发表于 2023-9-12 22:19 | 显示全部楼层
本帖最后由 xyp1964 于 2023-9-17 21:03 编辑

  1. (defun PtPer2Pt (p0 p1 p2 / s1 pt)
  2.   "点到两点的垂足"
  3.   (command "line" "non" p1 "non" p2 "")
  4.   (setq pt (vlax-curve-getclosestpointto (setq s1 (entlast)) p0 t)); 参数 t 在搜索最近点时扩展曲线
  5.   (entdel s1)
  6.   pt
  7. )
发表于 2023-9-12 14:18 | 显示全部楼层
代码太复杂了

点评

院长666  发表于 2023-9-12 18:10
 楼主| 发表于 2023-9-12 22:29 | 显示全部楼层
院长 这样最快(getdist)
发表于 2023-9-12 22:30 | 显示全部楼层
dtucad 发表于 2023-9-12 22:29
院长 这样最快(getdist)

(getdist)完全两码事
 楼主| 发表于 2023-9-12 22:33 | 显示全部楼层
本帖最后由 dtucad 于 2023-9-12 22:46 编辑

vlax-curve-getclosestpointto的实现原理倒是可以研究一下
大量程序运算 为了节省代码 还去画线 本末倒置了
可能一会又有人说用trans了 好吧好吧 轮子最香 我爱轮子
发表于 2023-9-14 16:55 | 显示全部楼层
另一个思路
  1. (defun get-perp_pt (pt p1 p2 / vec);
  2.   (setq vec (mapcar '- p2 p1))
  3.   (inters pt (mapcar '+ pt (vl-list* (- (cadr vec)) (car vec) (cddr vec))) p1 p2 nil)
  4. )

点评

666 高级应用 计算出垂直向量 再求2条直线交点  发表于 2023-9-16 22:00

评分

参与人数 1明经币 +1 收起 理由
dtucad + 1 666 高级应用 计算出垂直向量 再求2条直线.

查看全部评分

发表于 2023-9-14 17:11 | 显示全部楼层
vlax-curve-getclosestpointto 在很多情况下得到的不是垂足,说不定是一个端点。

点评

这还没太注意,看起来好像都是垂足呢?大佬知道是啥原理不  发表于 2023-9-16 22:02
发表于 2023-9-17 19:40 | 显示全部楼层
vormittag 发表于 2023-9-14 17:11
vlax-curve-getclosestpointto 在很多情况下得到的不是垂足,说不定是一个端点。

如果垂足不在曲线上,找到的就是曲线比较近的端点。比如直线两点是 (-1,0) 和 (1,0),点 P 是 (5,3),得到的点不是(5,0) 而是 (1,0)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 16:28 , Processed in 0.285712 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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