明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5731|回复: 27

[源码] 点到直线的距离,求大神优化,第一次写的

[复制链接]
发表于 2017-10-6 12:54 | 显示全部楼层 |阅读模式
点到线的距离,求大神优化,第一次写的

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 学习|主题: 95, 订阅: 7
发表于 2017-10-11 12:51 | 显示全部楼层
;; 点到两点连线的距离
(defun abc (p0 p1 p2 / p3)
  (setq p3 (polar p0 (+ (angle p1 p2) (* pi 0.5)) 1))
  (distance (inters p1 p2 p0 p3 nil) p0)
)
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-6 20:04 | 显示全部楼层
本帖最后由 vectra 于 2017-10-6 20:06 编辑

  1. (defun c:tt ()
  2.   (setq p1 (getpoint "\n请选择直线起点:"))
  3.   (setq p2 (getpoint "\n请选择直线第二点:"))
  4.   (setq p3 (getpoint "\n请输入待求点:"))

  5.   (abs (car (trans (mapcar '- p3 p1) 0 (mapcar '- p2 p1))))
  6. )


http://bbs.mjtd.com/forum.php?mo ... 954&highlight=trans
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-6 16:38 | 显示全部楼层
本帖最后由 yuanziyou 于 2017-10-6 20:44 编辑

用内置的曲线函数:
  1. (defun c:fgg ();点到直线的距离
  2.   (vl-load-com)
  3.   (setq objen (car (entsel "请选择直线")))
  4.   (setq pt2 (getpoint "\n指定点:"))
  5.   (setq pt (vlax-curve-getClosestPointTo objen pt2 T))
  6.   (setq d1 (rtos (distance pt pt2) 2 3))
  7.   (setq d2 (rtos (distance pt (vlax-curve-getStartPoint objen)) 2 3))
  8.   (princ "\n垂足到起点的距离D2为=") (princ d2) (princ)  
  9.   (princ "\n待求点到直线垂足的距离D1为=") (princ d1) (princ)
  10. )


因为我最近也在写关于点到多段线的,也可以用矢量法:
  1. (defun c:p2l ();点到直线的距离  (setq pt1 (getpoint "\n请选择直线起点:"))
  2.   (setq pt2 (getpoint "\n请选择直线第二点:"))  
  3.   (setq pt3 (getpoint "\n请输入待求点:"))
  4.   (setq x1 (car pt1));获取点列表的第一个元素
  5.   (setq y1 (cadr pt1));获取点列表的第二个元素
  6.   (setq x2 (car pt2));获取点列表的第一个元素
  7.   (setq y2 (cadr pt2));获取点列表的第二个元素
  8.   (setq x3 (car pt3));获取点列表的第一个元素
  9.   (setq y3 (cadr pt3));获取点列表的第二个元素
  10.   (setq d1 (P2LDist x1, y1, x2, y2, x3, y3)
  11.                 d3 (distance pt1 pt3)
  12.   )
  13.   (if (< (- d3 (abs d1)) 0.00001)
  14.         (setq d2 0)
  15.           (setq d2 (sqrt (- (* d3 d3) (* d1 d1))))
  16.    )
  17.   (princ "\n垂足到起点的距离D2为=") (princ (rtos d2 2 3)) (princ)  
  18.   (princ "\n待求点到直线垂足的距离D1为=") (princ (rtos (abs d1) 2 3)) (princ)
  19. )
  20. (defun P2LDist(x1, y1, x2, y2, x3, y3);点到直线的距离左+右-
  21.         (setq r0(Sqrt (+ (* ( - y2 y1) ( - y2 y1)) (* (- x1 x2) (- x1 x2)))));直线起点到终点的距离
  22.         (setq a1(-(* x1 y2) (* x3 (- y2 y1)) (* y3 (- x1 x2)) (* x2 y1)))
  23.         (setq distL (/ a1 r0))
  24. )








发表于 2017-10-6 15:50 | 显示全部楼层
太复杂, 给你个简单思路

假设A为点, B和C为两点直线

求BC角度, 然后加90度求过A点的直线上的一点(polar), 然后求四点交点(inter)即为垂足点, 然后求A到垂足点距离(distance)
发表于 2017-10-6 17:35 | 显示全部楼层
另一种方法求垂足点

(defun ::perPoint(p0 p1 p2 / a)
    (setq a(mapcar '- p1 p2))
    (inters(mapcar '+ (list(-(cadr a))(car a)(caddr a)) p0) p0 p1 p2 nil)
)
 楼主| 发表于 2017-10-6 18:32 | 显示全部楼层
asen 发表于 2017-10-6 15:50
太复杂, 给你个简单思路

假设A为点, B和C为两点直线

那个已经能算,因为是第一次写,只是要优化而已
 楼主| 发表于 2017-10-6 18:47 | 显示全部楼层
asen 发表于 2017-10-6 17:35
另一种方法求垂足点

(defun ::perPoint(p0 p1 p2 / a)

谢谢,又学得一个大招
 楼主| 发表于 2017-10-6 19:01 | 显示全部楼层
yuanziyou 发表于 2017-10-6 16:38
用内置的曲线函数:

你看看你的能计算这个位置吗

本帖子中包含更多资源

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

x
发表于 2017-10-6 19:49 | 显示全部楼层
13648893846 发表于 2017-10-6 19:01
你看看你的能计算这个位置吗

重新修改了下,你再试试
 楼主| 发表于 2017-10-6 19:51 | 显示全部楼层
yuanziyou 发表于 2017-10-6 19:49
重新修改了下,你再试试

谢谢你大神
 楼主| 发表于 2017-10-6 20:01 | 显示全部楼层
yuanziyou 发表于 2017-10-6 19:49
重新修改了下,你再试试

还有另一个BUG,当待求点垂直于起点时还是错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 15:46 , Processed in 0.434859 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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