找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4360|回复: 26

[其他]:关于点到空间直线垂点的Lisp方法

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-2-15 13:31:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
http://xinli.stinfo.net/xllw/184.htm

  1. <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700" id="AutoNumber1" height="498">
  2.   <tr>
  3.     <td width="100%" height="489">
  4.       <iframe name="I1" width="100%" height="100%" src="http://xinli.stinfo.net/xllw/184.htm">
  5. 浏览器不支持嵌入式框架或配置为不显示嵌入式框架
  6.       </iframe>
  7.     </td>
  8.   </tr>
  9. </table>
复制代码

http://xiepu.363.net/wujun-5.htm

  1. <table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700" id="AutoNumber1" height="498">
  2.   <tr>
  3.     <td width="100%" height="489">
  4.       <iframe name="I1" width="100%" height="100%" src="http://xiepu.363.net/wujun-5.htm">
  5. 浏览器不支持嵌入式框架或配置为不显示嵌入式框架
  6.       </iframe>
  7.     </td>
  8.   </tr>
  9. </table>
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-2-15 13:40:00 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-3-2 21:52:27 | 显示全部楼层

[其他]:求三点组成平面的法线向量

就是任意轴算法,往下就是平面的一般方程
[PHP]
;;过 p1 p2 p3 的平面法线向量
(defun ea:3plan(p1 p2 p3 / x1 y1 z1 x2 y2 z2 x3 y3 z3 a b c )
  (setq        x1 (car p1)
        y1 (cadr p1)
        z1 (last p1)
        x2 (car p2)
        y2 (cadr p2)
        z2 (last p2)
        x3 (car p3)
        y3 (cadr p3)
        z3 (last p3)
  )
  (setq        a  (- (* (- y2 y1) (- z3 z1)) (* (- z2 z1) (- y3 y1)))
        b  (- (* (- z2 z1) (- x3 x1)) (* (- x2 x1) (- z3 z1)))
        c  (- (* (- x2 x1) (- y3 y1)) (* (- y2 y1) (- x3 x1)))
        ;d  (- (+ (* a x1) (* b y1) (* c z1)))
  )
    (list a b c);法线向量
)[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-3-3 04:43:13 | 显示全部楼层

[其他]:关于点到空间直线垂点的Lisp方法

前面几位网友用UCS的方法求得垂点,现在我来说说用向量和直线方程的求法,

已知点P(x y z)、直线上 两点P1 (x1 y1 z1) P2 (x2 y2 z2),求P到P1P2 的垂点。

解:假设垂点为P0(x0 y0 z0),则垂点满足两个条件
1)P0 满足P1P2的直线方程,
2)P0P、P1P2 向量垂直的充要条件:向量P0P*P1P2=0

第一步:
P1P2的方向向量
  1. v1 = (x2-x1,y2-y1,z2-z1)
复制代码

写出P1P2 的两点式方程并令K
  1. K=(x-x1)/(x2-x1)=(y-y2)/(y2-y1)=(z-z2)/(z2-z1)
复制代码

进而求出参数方程

  1. x=x1+k(x2-x1)
  2. y=y1+k(y2-y1)
  3. z=z1+k(z2-z1)
  4. 其中 k 为参数
复制代码

第二步:
P0P的方向向量
  1. v = (x0-x,y0-y,z0-z)
复制代码


第三步:
两向量A(a,b,c)B(l,m,n)向量垂直的充要条件 AxB=0,即al+bm+cn=0

所以

  1. (x2-x1)*(x0-x)+(y2-y1)*(y0-y)+(z2-z1)*(z0-z)=0   -----------(1)
复制代码


因为P在P1P2上满足直线方程,即

  1. x0=x1+k(x2-x1)
  2. y0=y1+k(y2-y1)
  3. z0=z1+k(z2-z1)
复制代码

将上面的x0 y0 z0 带入式 (1) 求k,然后再带入直线方程就是垂点了。
根据上面的思路的Lisp实现
[php]
;|点到空间直线的垂点|;
(defun ea:ptoln        (p p1 p2 / l1 a b c x y z x1 y1 z1 k)
  (setq        l1 (mapcar '- p2 p1)                ;直线的方向向量
        a  (car l1)
        b  (cadr l1)
        c  (last l1)
        x  (car p)
        y  (cadr p)
        z  (last p)
        x1 (car p1)
        y1 (cadr p1)
        z1 (last p1)
  )
  (if (equal l1 '(0. 0. 0.))   
   l1
    (progn(setq k (/ (+ (* a (- x x1))
                    (* b (- y y1))
                    (* c (- z z1))
                 )
                 (+ (* a a)
                    (* b b)
                    (* c c)
                 )
              )                                ;直线参数
      )
      (list (+ x1 (* a k))
            (+ y1 (* b k))
            (+ z1 (* c k))
      )
    )
))[/php]
相关知识
http://member.21maths.com/zxkt/gao1/2/2.7-1.asp
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-3-3 05:04:53 | 显示全部楼层

[其他]:点到直线的距离

以前收集的函数,不知其理论依据,刚刚搞懂
[PHP]
;;; 返回点到直线距离
;;;返回值:点到直线的距离,点在线段的左(上)侧为负值, 在右(下)侧为正值。;
;;;方向根据给定的起始点和终止点定。
;;; Request distance from a point(p0) to a line(p1 p2).
(defun ptoln (p0 p1 p2 / x1 y1 x2 y2 c1 c2 c3)
  (setq        x1 (car p1)
        y1 (cadr p1)
        x2 (car p2)
        y2 (cadr p2)
        c1 (- y2 y1)
        c2 (- x1 x2)
        c3 (- (* x2 y1) (* x1 y2))
  )
  (/ (+ (* c1 (car p0)) (* c2 (cadr p0)) c3)
     (sqrt (+ (* c1 c1) (* c2 c2)))
  )
)[/PHP]
相关知识
http://rcs.wuchang-edu.com/RESOU ... XTS1013/1837_SR.HTM
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-3-3 05:39:38 | 显示全部楼层

[推荐]: 计算几何算法概览

http://www.frontfree.net/view/article_748.html

<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="700" id="AutoNumber1" height="498">
  <tr>
    <td width="100%" height="489">
      <iframe name="I1" width="100%" height="100%" src=http://www.gameres.com/Articles/Program/Abstract/Geometry.htm>浏览器不支持嵌入式框架或配置为不显示嵌入式框架
      </iframe>
    </td>
  </tr>
</table>
[/CODE]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 07:02:08 | 显示全部楼层
按你说的题目"点到直线的距离":

  1.   (defun dispt2line (p0 lline)
  2.     (setq obj (vlax-ename->vla-object lline))
  3.     (distance p0 (vlax-curve-getclosestpointto obj (trans p0 1 0) acExtendBoth))
  4.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 07:13:10 | 显示全部楼层
VLISP方法:

  1. (defun getperpt (p0 lline)
  2.     (setq obj (vlax-ename->vla-object lline))
  3.     (vlax-curve-getclosestpointto obj (trans p0 1 0) acExtendBoth)
  4.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-3-3 16:23:15 | 显示全部楼层
最初由 lsjjm 发布
[B]VLISP方法:
(defun getperpt (p0 lline)
    (setq obj (vlax-ename->vla-object lline))
    (vlax-curve-getclosestpointto obj (trans p0 1 0) acExtendBoth)
  )
[/B]



CAD的Osnap支持实体最好了
  1. (osnap entity pt "per")
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 16:42:18 | 显示全部楼层
[QUOTE]最初由 eachy 发布

CAD的Osnap支持实体最好了
code: (osnap entity pt "per")

开始我也想贴出osnap..., 但实际应用中受限制太多。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 17:16:02 | 显示全部楼层
(osnap entity pt "per")
osnap有这种用法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-3-3 18:04:33 | 显示全部楼层
最初由 陌生人 发布
[B](osnap entity pt "per")
osnap有这种用法? [/B]

想象的用法。还有几个Lisp如点到平面的交点、直线与面的交点、矢量的一些Lisp想贴的,看对这方面感兴趣的网友太少,有需要的下面联系了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 21:05:07 | 显示全部楼层
这是很基础的东西,如果感兴趣的人少,说明很多人还未深入到这步(或者忽视),但这的确是很重要的东西(我觉得),其实你最近贴的几个这方面的帖子我都看了,虽然没回贴,但我是大力支持的。希望你继续努力,有成果贴出来。也希望其它lsp爱好者多看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 21:08:35 | 显示全部楼层
osnap有这种用法,但这个点必须离直线很近才可以吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 22:19:54 | 显示全部楼层
最初由 lsjjm 发布
[B]按你说的题目"点到直线的距离":[code]
  (defun dispt2line (p0 lline)
    (setq obj (vlax-ename->vla-object lline))
    (distance p0 (vlax-curve-getclosestpointto obj (trans p0 1 0) acExtendBoth))
  ... [/B]

别丢三落四啊
不过即便修正,也与eachy的主题不同,他其实是求点与直线的相对关系(附带距离信息)
[php]
(defun dispt2line (p0 lline)
    (setq obj (vlax-ename->vla-object lline))
    (distance (trans p0 1 0) (vlax-curve-getclosestpointto obj (trans p0 1 0) acExtendBoth))
  )
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-25 20:37 , Processed in 0.389162 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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