明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3930|回复: 9

[飞马系列] Lisp利用MatLab 学习1-Delaunay三角网 感谢高山流水

    [复制链接]
发表于 2011-12-15 09:12:02 | 显示全部楼层 |阅读模式
[飞马系列] Lisp利用MatLab 学习1-Delaunay三角网 感谢高山流水

在此贴-- http://bbs.mjtd.com/forum.php?mod=viewthread&tid=62106&page=6#pid393539
中,高山流水兄 非常让人激动地引入了怎么用Lisp调用Matlab绘制图形的好函数。
我是近日才看到这个帖子的,非常受启发。

于是最近利用了高山流水兄的函数,做了一些探讨了研究,包括矩阵求逆等问题,有时间将慢慢添加。
Delaunay三角形是计算几何中一个重要的问题
以前我曾经用Lisp写过一个三角网程序,是翻译C语言的,
http://www.mjtd.com/Codes/ArticleShow.asp?ArticleID=1143
写的冗长无比,之后一直寻求更好的方法,也用C#编过,速度还可以。
Highflybird版主曾经用arx编过一个奇快无比的三角网,大概10000个点<1秒。C++的效率那是神速。
http://bbs.mjtd.com/forum.php?mod=redirect&goto=findpost&ptid=82644&pid=434713&fromuid=250774

因为Matlab是一个国际顶级的数学软件,也具备编程功能,在.Net方面可以和C#方便地连接,但在Lisp方面,目前为止
高山流水兄的函数是最具备现实意义的。

于是,在学习高山流水兄代码的基础上,利用Matlab的Delaunay函数,编写了如下一段代码。希望你也喜欢。

注意:系统内必须安装有Matlab(这是一个很大的应用程序),另,运行本程序的时候,最好先打开Matlab,可以节省时间。
本代码的效率一般般,10000个点大概得8秒左右,其实Matlab计算很快,大概在0.3秒左右,我的程序的大部分时间是在处理表和文件的写入上,应该说我用的文本操作方法还是比较落后的,希望高手们指正。看看有什么更好的交互方法。非常感谢。

后续希望能进一步地利用Matlab的优化工具箱啊,神经网络啊,遗传算法啊等等来看看能如何拓展Lisp的应用范畴。




  1. ;;;;这是一个利用Matlab程序进行Delaunay三角网绘制的程序,             ;
  2. ;;;;作者:华南理工大学qjchen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  3. ;;;;日期: 2011.12.15                                                 ;
  4. ;;;;感谢:高山流水朋友在Mjtd上给出的Lisp调用Matlab函数进行计算的代码;;
  5. ;;;;      极大地拓宽了AutoCAD可能的分析计算功能                      ;
  6. ;;;;软件思路:1)找点,输出到文本文件 2)利用Matlab计算,输出结果 ;;;;
  7. ;;;;          3)回调结果绘图                                        ;
  8. ;;;__________________________________________________________________;
  9. ;;; Purpose: draw Delaunay triangle by MatLab program                ;
  10. ;;; write by qjchen                                                  ;
  11. ;;; Great Thanks to GSLS, his program about Lisp Call Matlab function;
  12. ;;;       enable Autocad to use plenty of MatLab tools               ;
  13. ;;;__________________________________________________________________;

  14. ;;;_____________________高山流水的函数 ______________________________;
  15. ;;; 调用MATLAB.APP,                                                  ;
  16. (defun ss-create-matlab-object ()
  17.   (vl-load-com)
  18.   (if (or (null ss_mat_obj) (= ss_mat_obj :vlax-false))
  19.     (setq ss_mat_obj (vlax-get-or-create-object "matlab.application"))
  20.     )
  21.   )
  22. ;;; 卸载
  23. (defun ss-release-matlab-object()
  24.   (if (= ss_mat_obj :vlax-true)
  25.   (progn
  26.     (vlax-release-object ss_mat_obj)
  27.     (setq ss_mat_obj nil)
  28.     )
  29.     )
  30.   )
  31. ;(setq ss_mat_obj (vlax-get-or-create-object (findfile "c:\\matlab701\\toolbox\\modelsim\\win32\\matlablink.dll")))
  32. ;;;ss-matlab-execute
  33. ;;;功能:调用MATLAB EXECUTE功能
  34. ;;;str1 Malab中的参数执行语句,一般为参数式函数
  35. ;;;str2 Malab中的显示执行语句,语句含义参考Matlab,如上述例题中保存在C盘的test.jpg
  36. ;;;Uility 显示完后是否关闭,
  37. ;;;Written By GSLS(SS) 2010-07-25 4:45;;;高山流水的函数
  38. (defun ss-matlab-execute(str1 str2 uility /)     
  39.   (vlax-invoke-method ss_mat_obj 'MinimizeCommandWindow)
  40.   (vlax-invoke-method ss_mat_obj 'Execute str1)
  41.   (vlax-invoke-method ss_mat_obj 'Execute str2)  
  42. )
  43. ;;;____________end of 高山流水的函数_________________________________;

  44. ;;;____________qjchen subroutine_____________________________________;
  45. ;;;String delim by [email]qjchen@gmail.com[/email]
  46. ;;;根据delim将str分解为表
  47. (defun q:str:delim(str delim / l1 l2)
  48.   (setq str (vl-string->list str) delim (vl-string->list delim))
  49.   (while str
  50.     (if (not (member (car str) delim))
  51.              (setq l1 (cons (car str) l1))
  52.              (if l1 (setq l2 (cons (vl-list->string (reverse l1)) l2) l1 nil))
  53.     )
  54.     (setq str (cdr str))
  55.   )
  56.   (if l1 (setq l2 (cons (vl-list->string (reverse l1)) l2)))
  57.   (reverse l2)
  58. )
  59. ;;;entmake triangle by qjchen
  60. (defun q:entmake:triangle(p1 p2 p3 layer color width)
  61.     (entmakex
  62.       (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(67 . 0)
  63.             '(410 . "Model") (cons 62 color) (cons 8 layer)
  64.             '(100 . "AcDbPolyline") '(90 . 5) '(70 . 0)
  65.             (cons 43 width) '(38 . 0.0) '(39 . 0.0)
  66.             (cons 10 p1) '(42 . 0.0) (cons 10 p2) '(42 . 0.0)
  67.             (cons 10 p3) '(42 . 0.0) (cons 10 p1) '(42 . 0.0)
  68.             '(210 0.0 0.0 1.0)
  69.       )                               
  70.     )                                       
  71. )
  72. ;;;将点集的坐标写到文件里面,并输入点集表 by qjchen
  73. (defun q:WritePointCorToFile(ss fn / fh n p1xyz plst strxyz)
  74.   (setq fh (open fn "w"))
  75.   (repeat (setq n (fix (sslength ss))) ; fixed
  76.     (setq p1xyz (cdr (assoc 10 (entget (ssname ss (setq n (1- n))))))
  77.           plst (cons p1xyz plst))
  78.     (write-line (strcat (rtos (car p1xyz) 2 8) " " (rtos (cadr p1xyz) 2 8) " " (rtos (caddr p1xyz) 2 8)) fh)
  79.   )
  80.   (close fh)
  81.   (reverse plst)
  82. )
  83. ;;;根据Matlab的Delaunay文件绘制三角网 by qjchen
  84. (defun q:DrawTriangleByMatLabDelaunay(fn plst / b fh line x)
  85.    (if (setq fh (open fn "r"))
  86.     (progn
  87.       (while (setq line (read-line fh))
  88.         (setq b (q:str:delim line " \t")
  89.               x (mapcar '(lambda(x) (fix (atof x))) b))
  90.         (q:entmake:triangle (nth (1- (car x)) plst) (nth (1- (cadr x)) plst) (nth (1- (caddr x)) plst) "0" 1 0)
  91.       )
  92.       (close fh)
  93.     )
  94.   )
  95. )
  96. ;;;____________end of qjchen subroutine_________________________________;

  97. ;;;主程序,选择点,利用Matlab进行delaunay三角形的绘制, by [email]qjchen@gmail.com[/email]
  98. (defun c:test( / fn fn1 plst ss ss_mat_obj str)
  99.   (startTimer)
  100.   (setq fn "d:\\delaunayxy.txt" fn1 "d:\\delaunaym.txt")
  101.   (setq ss (ssget '((0 . "POINT"))))
  102.   (setq plst (q:WritePointCorToFile ss fn))
  103.   (setq str (strcat "M = load('" fn "'); x=M(:,1); y=M(:,2); TRI=delaunay(x,y); save '" fn1 "' TRI -ascii;"))
  104.   (ss-create-matlab-object)
  105.   (vlax-invoke-method ss_mat_obj 'MinimizeCommandWindow)
  106.   (vlax-invoke-method ss_mat_obj 'Execute str)
  107.   (q:DrawTriangleByMatLabDelaunay fn1 plst)
  108.   (endTimer)
  109. )

  110. (defun startTimer ()
  111.   (setq time (getvar "DATE"))
  112. )
  113. (defun endTimer ()
  114.   (setq time (- (getvar "DATE") time)
  115.         seconds (* 86400.0 (- time (fix time)))
  116.   )
  117.   (setq totaltime (rtos seconds 2 6))
  118.   (princ (strcat "\nTimed:" (rtos seconds 2 6)))
  119. )
  120. (princ)
  121. (princ "\n 利用Matlab进行Autocad的Delaunay三角网绘制,编程:华南理工大学 qjchen,命令:test")
  122. (princ)





本帖子中包含更多资源

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

x

评分

参与人数 4明经币 +7 金钱 +30 收起 理由
日月星 + 1 很给力!
仲文玉 + 1 赞一个!
xshrimp + 2 神马都是浮云
Gu_xl + 3 + 30 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-12-15 17:33:23 | 显示全部楼层
      qj-chen老师对MATLAB很有研究啊!
       通过文本操作可能是效率比较低的主要原因,好些可以通过COM接口给VLISP调用,不过在此之前可能得先做个转换动态链接库,我由于对WINDOWS系统知识的匮乏,中断了这些。
      喜望能有更多的同仁深化这个方面的接口研究,能做到不安装MATLAB独立建库当然最好了。
发表于 2011-12-15 23:05:05 | 显示全部楼层
  qj-chen老师
 楼主| 发表于 2011-12-16 08:40:58 | 显示全部楼层
谢谢高山流水兄和yshf

To高山兄,好些可以通过COM接口给VLISP调用,不过在此之前可能得先做个转换动态链接库。在.NET里面是已经调试通过可以将MATLAB的某个函数编译成为DLL,我希望以后能在此方面继续探索一下,争取能做到高山兄的要求。 :)

发表于 2011-12-17 13:10:38 | 显示全部楼层
qj-chen老师真是厉害
发表于 2011-12-17 14:19:10 | 显示全部楼层
谢谢楼主分享!
发表于 2012-4-3 21:04:04 | 显示全部楼层
lisp和matlab可以这样连接啊,有学了
发表于 2012-4-3 21:10:22 来自手机 | 显示全部楼层
chlh_jd 发表于 2011-12-15 17:33
qj-chen老师对MATLAB很有研究啊!
       通过文本操作可能是效率比较低的主要原因,好些可以 ...

我也是这么认为的,不需要安装,用到什么函数库就直接拷贝出来调用,如果能做到这点就好了。
发表于 2014-5-14 08:32:41 | 显示全部楼层
qj-chen老师,三角网做成后怎么样利用它?如等高线、查询任意点、挖方、填方建立坡脚等等?
发表于 2022-5-20 11:33:49 | 显示全部楼层
本帖最后由 landsat99 于 2022-5-20 11:44 编辑

生成Delaunay三角网,建议CGAL库。 通用cpp几何算法库,效率 标准化不错

接口 :CGAL::refine_Delaunay_mesh 可有不同特性。

GitHub : https://github.com/CGAL/cgal   大家的维护热度很高。如有兴趣共同维护、优化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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