明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7206|回复: 7

请问如何过一点作一条直线的垂线

[复制链接]
发表于 2011-9-23 17:09:22 | 显示全部楼层 |阅读模式
如题,如何过一个点作一条直线的垂线。谢谢。
发表于 2011-9-23 20:08:17 | 显示全部楼层
本帖最后由 cabinsummer 于 2011-9-23 22:02 编辑

程序如下。但该程序没有判断是否选取了直线和点,也就是说,没有错误处理
  1. (defun c:per(/ el sp dp ep dsp dep dse al pp spx spy dpx dpy epx epy ppx ppy)
  2.   (prompt "请选择直线:")
  3.   (setq el (car (entsel)));;;直线图元名
  4.   (setq sp (cdr (assoc 10 (entget el))));;;直线起点
  5.   (setq dp (cdr (assoc 11 (entget el))));;;直线终点
  6.   (prompt "请选择点:")
  7.   (setq ep (getpoint));;;已知点选取
  8.   (setq dsp (distance ep sp));;;直线起点到选取点距离
  9.   (setq dep (distance ep dp));;;直线终点到选取点距离
  10.   (setq dse (distance sp dp));;;直线长度
  11.   (if
  12.     (or
  13.       (= dsp (+ dep dse))
  14.       (= dep (+ dsp dse))
  15.       (= dse (+ dsp dep))
  16.     );;;判断
  17.     (princ "\n点位于直线上")
  18.     (progn
  19.       (setq spx (car sp) spy (cadr sp));;;直线起点xy坐标
  20.       (setq dpx (car dp) dpy (cadr dp));;;直线终点xy坐标
  21.       (setq al (- (angle (list spx spy)(list dpx dpy))(/ pi 2.0)));;;直线的垂线方向角
  22.       (if (< al 0.0)(setq al (+ al (* pi 2.0))));;;如果垂线方向角<0则+360度
  23.       (setq pp (polar ep al 10));;;垂线上的某一点
  24.       (setq epx (car ep) epy (cadr ep));;;选取点的xy坐标
  25.       (setq ppx (car pp) ppy (cadr pp));;;垂线上某一点的xy坐标
  26.       (setq pp (append (inters (list spx spy)(list dpx dpy)(list epx epy)(list ppx ppy) nil) (list 0.0)));;;求垂足
  27.       (entmake (list '(0 . "LINE")(cons 10 ep)(cons 11 pp)));;;画选取点和垂足点之间的线,即垂线
  28.     )
  29.   )
  30.   (princ)
  31. )

发表于 2011-9-23 20:53:55 | 显示全部楼层
  1. public static Point3d GetPrjPoint(Point3d pt, Point3d start, Point3d end)
  2.         {
  3.             Line3d l = new Line3d(start, end);
  4.             return l.GetClosestPointTo(pt).Point;
  5.         }
发表于 2011-9-23 21:30:57 | 显示全部楼层
本帖最后由 cabinsummer 于 2011-9-23 22:04 编辑

  1. (defun c:per(/ el obj cp ep)
  2.   (if (and (setq el (car (entsel "\n请选择直线:")))(= (cdr (assoc 0 (entget el))) "LINE"))
  3.     (progn
  4.       (setq obj (vlax-ename->vla-object el))
  5.       (if (setq ep (getpoint "\n请选择点:"))
  6.         (progn
  7.           (setq cp (vlax-curve-getClosestPointTo obj ep T))
  8.           (if (/= (distance ep cp) 0.0)
  9.             (entmake (list '(0 . "LINE")(cons 10 ep)(cons 11 cp)))
  10.             (princ "\n点位于直线上,三维无解")
  11.           )
  12.         )
  13.         (princ "\n未选取点")
  14.       )
  15.     )
  16.     (princ "\n未选取直线")
  17.   )
  18.   (princ)
  19. )

点评

能做成多个点到直线的垂线吗?  发表于 2020-9-27 11:27
发表于 2011-10-25 16:58:37 | 显示全部楼层
新手学习了!!
发表于 2011-10-28 23:25:16 | 显示全部楼层
fsxm 发表于 2011-9-23 20:53

如果直线外的那个点向直线作垂线时,垂足在延长线上,那么取最近点就不对了!!!

点评

Line3d是GE库中的无限直线!相当于DB中的XLine!  发表于 2011-10-30 23:27
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 19:53 , Processed in 0.179574 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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