风树 发表于 2014-7-1 20:13:31

sunnylhj 发表于 2014-7-1 19:52 static/image/common/back.gif
我也编写了一个(其实充其量也只能算是一个批处理),但也只能一个一个量,不过可以输出Excel!

我没看清你第一个图是四面体网格还是单纯用三角形组成的曲面,提供原图可能其他人更好帮你

风树 发表于 2014-7-1 20:19:04

sunnylhj 发表于 2014-7-1 19:50 static/image/common/back.gif
我只是普通的的幕墙设计员,对lisp只懂皮毛,工作常常遇到这种情况,而且一般都是用AutoCAD和Rhinoceros, ...

建议可以先不必要强调导出到excel,先说导出到excel或文本格式均可。
同时告诉大伙,你要导出成什么样的格式吧,就给你导出一个角度,你怎么知道它代表图上那两个面的夹角呢?

风树 发表于 2014-7-1 20:30:24

没看清第一个图,可能那还不是四面体网格,只是由三角形组成的实体表面

qjchen 发表于 2014-7-1 22:17:47

二面角 应该和两个面的 法线 夹角密切相关 (相等或者互补),可以用矢量点乘得到。

而面的法线可以用两边矢量的叉乘得到,所以,若楼主把题意说清楚的话,应该思路是比较直接的

liu_kunlun 发表于 2014-7-1 23:38:17

关键之关键,是要得到各三角形的顶点坐标,剩下只是简单的运算。所以,楼主有必要发一个样板CAD文件,供高手探索解决。

sunnylhj 发表于 2014-7-2 01:48:43

风树 发表于 2014-7-1 20:07 static/image/common/back.gif
你那第一个图只是单纯的一个区面吗?

是一个网面,炸散后就是3dface!

sunnylhj 发表于 2014-7-2 01:49:59

风树 发表于 2014-7-1 20:19 static/image/common/back.gif
建议可以先不必要强调导出到excel,先说导出到excel或文本格式均可。
同时告诉大伙,你要导出成什么样的格 ...

导出csv就行!

sunnylhj 发表于 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-二面角






liu_kunlun 发表于 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))))
)                   )               
页: 1 [2] 3
查看完整版本: 如何三维四面体拓扑重建(求二面角)-已经上传附件