明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: sunnylhj

[讨论] 如何三维四面体拓扑重建(求二面角)-已经上传附件

[复制链接]
发表于 2014-7-1 20:13:31 | 显示全部楼层
sunnylhj 发表于 2014-7-1 19:52
我也编写了一个(其实充其量也只能算是一个批处理),但也只能一个一个量,不过可以输出Excel!

我没看清你第一个图是四面体网格还是单纯用三角形组成的曲面,提供原图可能其他人更好帮你
发表于 2014-7-1 20:19:04 | 显示全部楼层
sunnylhj 发表于 2014-7-1 19:50
我只是普通的的幕墙设计员,对lisp只懂皮毛,工作常常遇到这种情况,而且一般都是用AutoCAD和Rhinoceros, ...

建议可以先不必要强调导出到excel,先说导出到excel或文本格式均可。
同时告诉大伙,你要导出成什么样的格式吧,就给你导出一个角度,你怎么知道它代表图上那两个面的夹角呢?
发表于 2014-7-1 20:30:24 | 显示全部楼层
没看清第一个图,可能那还不是四面体网格,只是由三角形组成的实体表面
发表于 2014-7-1 22:17:47 | 显示全部楼层
二面角 应该和两个面的 法线 夹角密切相关 (相等或者互补),可以用矢量点乘得到。

而面的法线可以用两边矢量的叉乘得到,所以,若楼主把题意说清楚的话,应该思路是比较直接的
发表于 2014-7-1 23:38:17 | 显示全部楼层
关键之关键,是要得到各三角形的顶点坐标,剩下只是简单的运算。所以,楼主有必要发一个样板CAD文件,供高手探索解决。
 楼主| 发表于 2014-7-2 01:48:43 | 显示全部楼层
风树 发表于 2014-7-1 20:07
你那第一个图只是单纯的一个区面吗?

是一个网面,炸散后就是3dface!
 楼主| 发表于 2014-7-2 01:49:59 | 显示全部楼层
风树 发表于 2014-7-1 20:19
建议可以先不必要强调导出到excel,先说导出到excel或文本格式均可。
同时告诉大伙,你要导出成什么样的格 ...

导出csv就行!
 楼主| 发表于 2014-7-2 15:24:29 | 显示全部楼层
自己頂一下,別讓帖子沉了!
发表于 2014-7-2 16:34:54 | 显示全部楼层
本帖最后由 风树 于 2014-7-10 12:44 编辑

可能的解决途径:
1:未砸开前的网格曲面作为cad的一个实体类型,不知道在lisp中有没有提供相应的函数,直接或间接地处理各子单元相邻关系、提取各子单元的控制点坐标等,如果有就最好。
2:如果没有,曲面炸开后由3dface组成待处理的对象,下面的思路也许可行:
1-选择所有3dface实体,按序编号,
2-遍历实体,依次判断其周边哪些编号的实体和它邻边相接,记录下来,计算相应二面角;
关键语句是,如何根据3dface提取控制点坐标;如何通过一个3dface实体在图上提取可能和它相交的所有实体,以便相邻关系的确定;减少无用功

补充:
如果求得不是二面角,是两个三角形(面)临空面的交角,可能大于180度,该角
和外法线方向相关
涉及到由三角网构成的三维实体的内外空间如何定义的问题,
复杂实体内部空间的定义也许不能简单得用函数来表示,
常用的方法多见内部空间离散,用数据结构表示,
如果内部离散为多个四面体,则可以用四面体间的相互关系反推出求出
附一篇度娘提供的文档:http://m.doc88.com/p-7833709450305.html
这也是一个方向。
或者先求出二面角,再判断临空面方向上二面外角是否大于180度,或取值二面角获取值360-二面角






发表于 2014-7-2 22:18:53 | 显示全部楼层
本帖最后由 liu_kunlun 于 2014-7-2 22:51 编辑

赞助一段代码:
至于写入Excel已有很多文章


首先彻底炸开成3dface,然后运行下面代码....
(setq ss (ssget '((0 . "3DFACE"))))
  (setq ie1 0)
  (repeat (sslength ss)
     (setq e1 (entget (ssname ss ie1)))
     (mapcar 'set (list 'p1 'p2 'p3) (mapcar '(lambda (x) (dxf x e1)) '(10 11 12)))
     (setq vz1 (v_i (v_xm (v_sub p2 p1)(v_sub p3 p2))))
     (foreach sid (list (list p1 p2) (list p2 p3) (list p3 p1))
        (if (or (setq sid2 (assoc sid sids))
                (setq sid2 (assoc (reverse sid) sids))
            )
            (setq ie2 (nth 1 sid2) vz2 (nth 2 sid2)
                  angs (cons (list sid (angle '(0. 0. 0.) (list (v_pm vz1 vz2) (v_abs (v_xm vz1 vz2)) 0.))) angs)
                  sids (vl-remove sid2 sids)
            )
            (setq sids (cons (list sid ie1 vz1) sids))
        )
     )
     (setq ie1 (1+ ie1))
  )
  ;得到的angs为(((点 点)角度)....),其(点 点)代表边,角度单位为弧度
  
;;向量操作函数  
  (defun v_abs (v)     (sqrt (apply '+ (mapcar '* v v))))
  (defun v_i   (v / a) (setq a (v_abs v)) (mapcar '(lambda (x) (/ x a)) v))
  (defun v_add (v1 v2) (mapcar '+ v1 v2))
  (defun v_pm  (v1 v2) (apply '+ (mapcar '* v1 v2)))
  (defun v_sub (v1 v2) (mapcar '- v1 v2))
  (defun v_xm  (v1 v2) (mapcar '- (mapcar '* v1 (append (cdr v2) (list (car v2))))
                                 (mapcar '* v2 (append (cdr v1) (list (car v1))))
  )                   )               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-24 09:27 , Processed in 0.141281 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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