明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4379|回复: 11

[飞马系列] (立体几何 线面交点 应用) 三点定面 分割 三维直线

    [复制链接]
发表于 2011-12-19 21:21:13 | 显示全部楼层 |阅读模式
本帖最后由 qjchen 于 2011-12-19 21:23 编辑

以前一段时间,很喜欢向量运算,写了不少立体几何相关的函数

近日刚好有一个项目需要进行一个面切割一堆空间直线。

改造了一下,写成如下函数。可能应用面不广吧,就当是一个小众应用吧。

里面的向量运算,一些是参照前辈们的,一些是自己根据矢量公式写的,

;;;注意:直线和面的交点,有nil和T两个参数,对于T,直线需穿过面才算有交点,nil则不同
;;;      而对于面,此三点定义的面没有大小之分,即是若线在三点外穿过三点定下平面,也
;;;      算有交点   



代码同附件



  1. ;;;通过三点的空间平面对空间三维线段进行截断
  2. ;;;编程:华南理工大学 qjchen,命令:test
  3. ;;;日期: 2011.12.19
  4. ;;;注意:直线和面的交点,有nil和T两个参数,对于T,直线需穿过面才算有交点,nil则不同
  5. ;;;      而对于面,此三点定义的面没有大小之分,即是若线在三点外穿过三点定下平面,也
  6. ;;;      算有交点                                      
  7. ;;;;;;______________qjchen的一些向量函数________________________________________;;;
  8. (defun q:geo:is-3p-plane(p1 p2 p3)
  9. (> (q:vec:Len (q:vec:Norm (q:vec:cross* (q:vec:- p2 p1) (q:vec:- p3 p1)))) 1e-6)
  10. )
  11. (defun q:geo:is-samepoint(p1 p2) (< (distance p1 p2) 1e-5) )
  12. (defun q:vec:+(v1 v2) (mapcar '+ v1 v2) )
  13. (defun q:vec:-(v1 v2) (mapcar '- v1 v2) )
  14. (defun q:vec:*c(v a) (mapcar '(lambda(x) (* x a)) v) )
  15. (defun q:vec:dot*(v1 v2) (apply '+ (mapcar '* v1 v2)) )
  16. (defun q:vec:cross*(v1 v2)
  17.   (list (q:det:2 (cadr v1) (caddr v1) (cadr v2) (caddr v2))
  18.         (q:det:2 (caddr v1) (car v1) (caddr v2) (car v2))
  19.         (q:det:2 (car v1) (cadr v1) (car v2) (cadr v2)))
  20. )
  21. ;;;;cal determinant 计算二阶行列式
  22. ;;;;|a1 a2|
  23. ;;;;|b1 b2|
  24. (defun q:det:2(a1 a2 b1 b2)  (- (* a1 b2) (* a2 b1)))
  25. ;;;;Normalize a vector
  26. (defun q:vec:Norm(v / l)
  27.   (if (not (zerop (setq l (distance '(0 0 0) v))))
  28.   (mapcar '(lambda(x) (/ x l)) v))
  29. )
  30. ;;;;Vector Length
  31. (defun q:vec:Len(v / l)  (distance '(0 0 0) v))
  32. ;;;;a normal to a plane,
  33. (defun q:geo:normal.to.3p(p1 p2 p3)
  34.   (if (q:geo:is-3p-plane p1 p2 p3)(q:vec:cross* (q:vec:- p2 p1) (q:vec:- p3 p1)))
  35. )
  36. ;;p1 p2是2点,V是截面法线,VP是其上一点,F是是否实际相交
  37. ;;参考资料 [url]http://en.wikipedia.org/wiki/Line-plane_intersection[/url]
  38. ;;;;;;;;;;;[url]http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm[/url]
  39. (defun q:geo:line-intersect-plane-1(P1 P2 V VP F / d l n)
  40. (setq n (q:vec:Norm V) l (q:vec:Norm (q:vec:- P2 P1)))
  41. (if (not (zerop (q:vec:dot* l n)))
  42.    (progn
  43.      (setq d (/ (q:vec:dot* (q:vec:- VP P1) n) (q:vec:dot* l n)))

  44.      (setq res (q:vec:+ P1 (q:vec:*c l d)))
  45.      (setq temp (q:vec:Len (q:vec:- P2 P1)))
  46.      (if (and F (or (< d 0) (> d (q:vec:Len (q:vec:- P2 P1))))) (setq res nil))
  47.    )
  48. )
  49. res
  50. )
  51. ;;;;;;______end of qjchen的一些向量函数__________________________________;;;
  52. (defun q:entmake:point(pt layer)
  53.   (entmake (list (cons 0 "POINT")(cons 8 layer)(cons 10 pt)))
  54. )
  55. (defun q:mulentmod (ent numlst contentlst / i x)
  56.   (setq i 0)
  57.   (foreach x numlst
  58.     (if (/= (assoc x ent) nil)
  59.       (setq ent (subst (cons x (nth i contentlst)) (assoc x ent) ent ) )
  60.       (setq ent (append ent (list (cons x (nth i contentlst))) ) )
  61.     )
  62.     (setq i (1+ i))
  63.   )
  64.   (entmod ent)  ;(entupd ent)
  65. )
  66. ;;;;;stdlib from Reini Urban
  67. (defun std-sslist (ss / n lst)
  68.   (if (eq 'pickset (type ss))
  69.     (repeat (setq n (fix (sslength ss))) ; fixed
  70.       (setq lst (cons (ssname ss (setq n (1- n))) lst))
  71.     )
  72.   )
  73. )
  74. ;;;以三点定下的平面切割一批线,需有实交点
  75. ;;;主程序______by qjchen____________________________;;;
  76. (defun c:test()
  77.   (setq p1 (getpoint "\n第一点:") p2 (getpoint "\n第二点:") p3 (getpoint "\n第三点:"))
  78.   (if (q:geo:is-3p-plane p1 p2 p3)
  79.     (progn
  80.       (setq c (std-sslist(ssget '((0 . "LINE")))))
  81.       (setq pn (q:geo:normal.to.3p p1 p2 p3))
  82.       (foreach x c
  83.        (setq pa (cdr (assoc 10 (entget x))) pb (cdr (assoc 11 (entget x))))
  84.        (setq int (q:geo:line-intersect-plane-1 pa pb pn p1 T))

  85.        (if (and int (not (q:geo:is-samepoint int pa))(not (q:geo:is-samepoint int pb)))
  86.           (progn
  87.             (q:mulentmod (entget (entmakex (entget x))) (list 62 11) (list 1 int))
  88.             (q:mulentmod (entget (entmakex (entget x))) (list 62 10) (list 2 int))
  89.             (entdel x)
  90.             (q:entmake:point int "0")
  91.          )
  92.          )
  93.       )
  94.     )
  95.     (princ "\n 三点没有组成一个平面.")
  96.   )
  97. )

  98. (princ)
  99. (princ "\n 通过三点的空间平面对空间三维线段进行截断,编程:华南理工大学 qjchen,命令:test")
  100. (princ)








本帖子中包含更多资源

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

x

评分

参与人数 4明经币 +8 收起 理由
yoyoho + 1 赞一个!
ZZXXQQ + 2 赞一个!
xiaxiang + 2 很给力!
Gu_xl + 3 很给力!

查看全部评分

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

本帖被以下淘专辑推荐:

发表于 2020-8-24 09:15:59 | 显示全部楼层
测量斜面积,我不会啊
发表于 2019-1-23 14:07:02 | 显示全部楼层
非常好用,谢谢共享。
发表于 2019-1-21 15:02:57 | 显示全部楼层
找了好久,谢谢了。
发表于 2011-12-20 00:46:41 | 显示全部楼层
顶了
发表于 2011-12-20 20:43:05 | 显示全部楼层
终于看到在三维中的应用了!!!必须顶!!!
发表于 2012-1-3 00:44:51 | 显示全部楼层
早看到这个帖子就好了。俺琢磨了一礼拜哦
发表于 2012-7-4 19:51:40 | 显示全部楼层
真的很厉害
发表于 2012-7-4 19:53:50 | 显示全部楼层
楼主好强,学习的楷模
发表于 2012-7-5 07:10:52 | 显示全部楼层
感谢qjchen分享程序!
发表于 2012-7-5 10:53:50 | 显示全部楼层
定个。。。下了。。。嘻嘻~~~
发表于 2013-4-10 08:16:49 | 显示全部楼层
楼主的程序很强大,我测试了一下 处于平面外的直线 也能剪断啊。T参数和nil参数 效果都一样。我想平面外的不要剪断 怎么做到?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 15:29 , Processed in 0.298093 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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