明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3036|回复: 1

有点失望 居然没有经典的Delaunay三角形

[复制链接]
发表于 2008-4-16 12:09:00 | 显示全部楼层 |阅读模式

rt

发表于 2008-4-23 20:05:00 | 显示全部楼层
:)
对,其实计算几何是计算机时代的几何新应用,值得好好学习的,记得Highflybird版主号称编过一套计算几何的程序,不知道会不会共享一下呢:)
以前我在XDCAD发过一个帖子,曾经置顶,不过不知道现在哪里去了,遍找不到,找出记录,如下
Eachy版主说:
找到一个离散点生成三角网的资料,都是英文,看不懂啊,不过里面还有各种语言的实现代码
http://astronomy.swin.edu.au/%7Epbourke/modelling/triangulate/
我说:
多谢eachy版主介绍了这个站点
经过了艰苦的翻译,把Fortran翻译成Lisp语言,其中,深深的感受到数组与表的转换之苦,所以编辑起来有点罗里八索的感觉,以后得好好的来想一个好办
法。这个效果和网站上的basic和dephi范例是相同的。
感受,可能深入了解算法并从一开始就采用表的操作,会更好些,翻译代码是
件很痛苦的事情,调试起来特别麻烦。很想半途而废,坚持下来了也挺开心。
这个算法昨天在《计算几何》中看到了,应该还是通过voronoi图的增量算法
来构建delaunary三角形的,不过由于只是伪代码,算法也有些细节不同,因而没有来得及仔细思考,这也是下一步有空需要研究的问题。
autolisp代码如下,早期写的代码,比较乱,不过没有再重写了
效果如后,对程序简单修改即可变成选一堆点的三角化
  1. ;;; Purpose: To Generate the triangle by incresing point
  2. ;;; Version: 0.1
  3. ;;; Credit to Paul Bourke (pbourke@swin.edu.au) for the original C Program :))
  4. ;;; [url]http://astronomy.swin.edu.au/~pbourke/modelling/triangulate/[/url]
  5. ;;; The following codes are translate from C to AutoLisp by QJCHEN
  6. ;;; South China University of Technology
  7. ;;; Thanks : Eachy at xdcad.net introduce the source code pages
  8. ;;; and the STDLIB Function of Reini Urban at http://xarch.tu-graz.ac.at/autocad/stdlib/archive/
  9. ;;; 2006.06.30
  10. (defun c:test (/ tpoints temp howmany ij p1 p2 p3)
  11.   (setq tpoints 1
  12. vertex (givever)
  13. triangle (givetri)
  14. edges (giveedg)
  15.   )
  16.   (while (setq temp (getpoint))
  17.     (setq vertex (qj-setnmth (nth 0 temp) tpoints 1 vertex))
  18.     (setq vertex (qj-setnmth (nth 1 temp) tpoints 2 vertex))
  19.     (if (> tpoints 2)
  20.       (progn
  21. (setq howmany (Triangulate tpoints))
  22.       )
  23.     )
  24.     (setq tpoints (1+ tpoints))
  25.     (setq ij 0)
  26.     (command "redraw")
  27.     (if (>= tpoints 4)
  28.       (progn
  29. (repeat howmany
  30.    (setq ij (1+ ij))
  31.    (setq p1 (nth (1- (nth 0 (nth (1- ij) triangle))) vertex))
  32.    (setq p2 (nth (1- (nth 1 (nth (1- ij) triangle))) vertex))
  33.    (setq p3 (nth (1- (nth 2 (nth (1- ij) triangle))) vertex))
  34.    (grdraw p2 p1 1)
  35.    (grdraw p1 p3 1)
  36.    (grdraw p2 p3 1)
  37. )
  38.       )
  39.     )                           ; (grdraw p1 p3 1)
  40.                        ; (grdraw p2 p3 1)
  41.                        ; (grdraw p3 p1 1)
  42.   )
  43. )
  44. ;|The main function|;
  45. (defun Triangulate (nvert / xmin ymin xmax ymax i dx dy xmid ymid complete
  46.      ntri inc nedge i j Triangulate1
  47.      )
  48.   (setq xmin (xofv vertex 1))
  49.   (setq ymin (yofv vertex 1))
  50.   (setq xmax xmin
  51. ymax ymin
  52.   )
  53.   (setq i 2)
  54.   (while (<= i nvert)
  55.     (if (< (xofv vertex i) xmin)
  56.       (setq xmin (xofv vertex i))
  57.     )
  58.     (if (> (xofv vertex i) xmax)
  59.       (setq xmax (xofv vertex i))
  60.     )
  61.     (if (< (yofv vertex i) ymin)
  62.       (setq ymin (yofv vertex i))
  63.     )
  64.     (if (> (yofv vertex i) ymax)
  65.       (setq ymax (yofv vertex i))
  66.     )
  67.     (setq i (1+ i))
  68.   )
  69.   (setq dx (- xmax xmin))
  70.   (setq dy (- ymax ymin))
  71.   (if (> dx dy)
  72.     (setq dmax dx)
  73.     (setq dmax dy)
  74.   )
  75.   (setq xmid (/ (+ xmax xmin) 2))
  76.   (setq ymid (/ (+ ymax ymin) 2))
  77.   (setq vertex (qj-setnmth (- xmid (* dmax 2)) (1+ nvert) 1 vertex))
  78.   (setq vertex (qj-setnmth (- ymid dmax) (1+ nvert) 2 vertex))
  79.   (setq vertex (qj-setnmth xmid (+ nvert 2) 1 vertex))
  80.   (setq vertex (qj-setnmth (+ ymid (* 2 dmax)) (+ nvert 2) 2 vertex))
  81.   (setq vertex (qj-setnmth (+ xmid (* 2 dmax)) (+ nvert 3) 1 vertex))
  82.   (setq vertex (qj-setnmth (- ymid dmax) (+ nvert 3) 2 vertex))
  83.   (setq triangle (qj-setnmth (+ nvert 1) 1 1 triangle))
  84.   (setq triangle (qj-setnmth (+ nvert 2) 1 2 triangle))
  85.   (setq triangle (qj-setnmth (+ nvert 3) 1 3 triangle))
  86.   (setq complete (append
  87.      complete
  88.      (list nil)
  89.    )
  90.   )
  91.   (setq ntri 1);;;;;;;;;;;start loop i
  92.   (setq i 1)
  93.   (while (<= i nvert)
  94.     (setq nedge 0);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  95.     (setq j 0
  96.    temp (- 1)
  97.     )
  98.     (while (< temp ntri)
  99.       (setq j (1+ j)
  100.      temp j
  101.       )
  102.       (if (/= (nth (1- j) complete) T)
  103. (progn
  104.    (setq inc (InCircle1 (xofv vertex i) (yofv vertex i) (xof vertex triangle
  105.             j 1
  106.               )
  107.           (yof vertex triangle j 1) (xof vertex
  108.              triangle j 2
  109.         ) (yof vertex
  110.         triangle j 2
  111.           ) (xof vertex
  112.           triangle j
  113.           3
  114.             ) (yof vertex triangle
  115.             j 3
  116.               )
  117.       )
  118.    )
  119. )
  120.       )
  121.       (if inc
  122. (progn
  123.    (setq edges (qj-setnmth (nth 0 (nth (1- j) triangle)) 1
  124.       (+ nedge 1) edges
  125.         )
  126.    )
  127.    (setq edges (qj-setnmth (nth 1 (nth (1- j) triangle)) 2
  128.       (+ nedge 1) edges
  129.         )
  130.    )
  131.    (setq edges (qj-setnmth (nth 1 (nth (1- j) triangle)) 1
  132.       (+ nedge 2) edges
  133.         )
  134.    )
  135.    (setq edges (qj-setnmth (nth 2 (nth (1- j) triangle)) 2
  136.       (+ nedge 2) edges
  137.         )
  138.    )
  139.    (setq edges (qj-setnmth (nth 2 (nth (1- j) triangle)) 1
  140.       (+ nedge 3) edges
  141.         )
  142.    )
  143.    (setq edges (qj-setnmth (nth 0 (nth (1- j) triangle)) 2
  144.       (+ nedge 3) edges
  145.         )
  146.    )
  147.    (setq Nedge (+ Nedge 3))
  148.    (setq triangle (qj-setnmth ([n,m] triangle ntri 1) j 1 triangle))
  149.    (setq triangle (qj-setnmth ([n,m] triangle ntri 2) j 2 triangle))
  150.    (setq triangle (qj-setnmth ([n,m] triangle ntri 3) j 3 triangle))
  151.    (setq complete (std-setnth (nth (1- ntri) complete) (1- j)
  152.          complete
  153.     )
  154.    )
  155.    (setq j (1- j)
  156.   temp j
  157.    )
  158.    (setq ntri (1- ntri))
  159. )
  160.       )
  161.     );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  162. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  163.     (setq j 1)
  164.     (while (<= j (1- Nedge))
  165.       (if (and
  166.      (/= ([n,m] edges 1 j) 0)
  167.      (/= ([n,m] edges 2 j) 0)
  168.    )
  169. (progn
  170.    (setq k (1+ j))
  171.    (while (<= k Nedge)
  172.      (if (and
  173.     (/= ([n,m] edges 1 k) 0)
  174.     (/= ([n,m] edges 2 k) 0)
  175.   )
  176.        (if (= ([n,m] edges 1 j) ([n,m] edges 2 k))
  177.   (if (= ([n,m] edges 2 j) ([n,m] edges 1 k))
  178.     (progn
  179.       (setq edges (qj-setnmth 0 1 j edges))
  180.       (setq edges (qj-setnmth 0 2 j edges))
  181.       (setq edges (qj-setnmth 0 1 k edges))
  182.       (setq edges (qj-setnmth 0 1 k edges))
  183.     )
  184.   )
  185.        )
  186.      )
  187.      (setq k (1+ k))
  188.    )
  189. )
  190.       )
  191.       (setq j (1+ j))
  192.     );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  193. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  194.     (setq j 1)
  195.     (while (<= j Nedge)
  196.       (if (and
  197.      (/= ([n,m] edges 1 j) 0)
  198.      (/= ([n,m] edges 2 j) 0)
  199.    )
  200. (progn
  201.    (setq ntri (1+ ntri))
  202.    (setq triangle (qj-setnmth ([n,m] edges 1 j) ntri 1 triangle))
  203.    (setq triangle (qj-setnmth ([n,m] edges 2 j) ntri 2 triangle))
  204.    (setq triangle (qj-setnmth i ntri 3 triangle))
  205.    (setq complete (std-setnth nil (1- ntri) complete))
  206. )
  207.       )
  208.       (setq j (1+ j))
  209.     );;;;;;;;;;;;;;;;;;;;;;;;;;;
  210.     (setq i (1+ i))
  211.   );;;;;end of loop i
  212.   (setq i 0
  213. temp (- 1)
  214.   )
  215.   (while (< temp ntri)
  216.     (setq i (1+ i)
  217.    temp i
  218.     )
  219.     (if (or
  220.    (> ([n,m] triangle i 1) nvert)
  221.    (> ([n,m] triangle i 2) nvert)
  222.    (> ([n,m] triangle i 3) nvert)
  223. )
  224.       (progn
  225. (setq triangle (qj-setnmth ([n,m] triangle ntri 1) i 1 triangle))
  226. (setq triangle (qj-setnmth ([n,m] triangle ntri 2) i 2 triangle))
  227. (setq triangle (qj-setnmth ([n,m] triangle ntri 3) i 3 triangle))
  228. (setq i (1- i)
  229.        temp i
  230. )
  231. (setq ntri (1- ntri))
  232.       )
  233.     )
  234.   )
  235.   (setq Triangulate1 ntri)
  236.   Triangulate1
  237. )
  238. ;;; std&acute;ú&Igrave;&aelig;±í&Ouml;&ETH;&micro;&Uacute;n&cedil;&ouml;&Ocirc;&ordf;&Euml;&Oslash;&micro;&Auml;&ordm;&macr;&Ecirc;&yacute;
  239. (defun std-%setnth (new i lst / fst len)
  240.   (cond
  241.     ((minusp i)
  242.       lst
  243.     )
  244.     ((> i (setq len (length lst)))
  245.       lst
  246.     )
  247.     ((> i (/ len 2))
  248.       (reverse (std-%setnth new (1- (- len i)) (reverse lst)))
  249.     )
  250.     (t
  251.       (append
  252. (progn
  253.    (setq fst nil)           ; ; possible vl lsa compiler bug
  254.    (repeat (rem i 4)
  255.      (setq fst (cons (car lst) fst)
  256.     lst (cdr lst)
  257.      )
  258.    )
  259.    (repeat (/ i 4)
  260.      (setq fst (cons (cadddr lst) (cons (caddr lst) (cons
  261.          (cadr lst)
  262.          (cons
  263.                (car lst)
  264.                fst
  265.          )
  266.           )
  267.       )
  268.         )
  269.     lst (cddddr lst)
  270.      )
  271.    )
  272.    (reverse fst)
  273. )
  274. (if (listp new)
  275.    new
  276.    (list new)
  277. )                   ; v0.4001
  278. (cdr lst)
  279.       )
  280.     )
  281.   )
  282. )
  283. (defun std-setnth (new i lst)
  284.   (std-%setnth (list new) i lst)
  285. )
  286. ;;; &acute;ú&Igrave;&aelig;&para;&thorn;&Icirc;&not;±í&Ouml;&ETH;&micro;&Uacute;i&ETH;&ETH;&micro;&Uacute;j&Aacute;&ETH;&Ocirc;&ordf;&Euml;&Oslash;&micro;&Auml;&ordm;&macr;&Ecirc;&yacute;&pound;¨i&ordm;&Iacute;j&acute;&Oacute;1&iquest;&ordf;&Ecirc;&frac14;&pound;&copy;
  287. (defun qj-setnmth (new i j lst / listb lista)
  288.   (setq listb lst)
  289.   (setq i (1- i))
  290.   (setq j (1- j))
  291.   (setq lista (nth i lst))
  292.   (setq lista (std-setnth new j lista))
  293.   (setq listb (std-setnth lista i listb))
  294.   listb
  295. )
  296. ;;; &raquo;&ntilde;&Egrave;&iexcl;&Auml;&sup3;&cedil;&ouml;&Ecirc;&yacute;×é±í&micro;&Uacute;&frac14;&cedil;&Iuml;&icirc;&micro;&Uacute;&frac14;&cedil;&Iuml;&icirc;&micro;&Auml;&Ecirc;&yacute;&Ouml;&micro;
  297. (defun [n,m] (a n m / i)           ; n&Ecirc;&Ccedil;&ETH;&ETH;&pound;&not;m&Ecirc;&Ccedil;&Aacute;&ETH;
  298.   (setq i (nth (1- m) (nth (1- n) a)))
  299.   i
  300. )
  301. ;;; &raquo;&ntilde;&Egrave;&iexcl;&Auml;&sup3;&cedil;&ouml;&micro;&yen;&Aacute;&ETH;&Ecirc;&yacute;×é&micro;&Uacute;&frac14;&cedil;&Iuml;&icirc;&micro;&Auml;&Ecirc;&yacute;&Ouml;&micro;
  302. (defun [n] (a n / i)               ; n&Ecirc;&Ccedil;&ETH;&ETH;&pound;&not;m&Ecirc;&Ccedil;&Aacute;&ETH;
  303.   (setq i (nth (1- n) a))
  304.   i
  305. )
  306. ;|Vertex has the form '((x1 y1)(x2 y2)(x3 y3)(x4 y4)())
  307. The function xofv is to get the x value of the i element,i start from 1|;
  308. (defun xofv (vertex i / res)
  309.   (setq res (nth 0 (nth (- i 1) vertex)))
  310.   res
  311. )
  312. ;|Vertex has the form '((x1 y1)(x2 y2)(x3 y3)(x4 y4)())
  313. The function yofv is to get the y value of the i element,i start from 1|;
  314. (defun yofv (vertex i / res)
  315.   (setq res (nth 1 (nth (- i 1) vertex)))
  316.   res
  317. )
  318. ;|Lis has the form '(((x11 y11)(x12 y12)(x13 y13))((x21 y21)(x22 y22)(x23
  319. y23))(()()()))
  320. The function xof is to get the x value of the i,j element,i and j start from
  321. 1
  322. and j is the outer sequence, and i is the inter sequence, total 3|;
  323. (defun xof (lisa lisb j v123 / res1 res2 res)
  324.   (setq res1 (nth (1- j) lisb))
  325.   (setq res2 (nth (1- v123) res1))
  326.   (setq res3 (nth (1- res2) lisa))
  327.   (setq res (nth 0 res3))
  328.   res
  329. )
  330. ;|Lis has the form '(((x11 y11)(x12 y12)(x13 y13))((x21 y21)(x22 y22)(x23
  331. y23))(()()()))
  332. The function xof is to get the y value of the i,j element,i and j start from
  333. 1
  334. and j is the outer sequence, and i is the inter sequence, total 3|;
  335. (defun yof (lisa lisb j v123 / res1 res2 res)
  336.   (setq res1 (nth (1- j) lisb))
  337.   (setq res2 (nth (1- v123) res1))
  338.   (setq res3 (nth (1- res2) lisa))
  339.   (setq res (nth 1 res3))
  340.   res
  341. )
  342. ;(defun append1 (new n lis / res1 res2 res)
  343. ;
  344. ;  (setq res1 (nth (1- n) lis))
  345. ;  (setq res2 (append
  346. ;           res1
  347. ;           (list new)
  348. ;         )
  349. ;  )
  350. ;  (setq res (std-setnth res2 (1- n) lis))
  351. ;  res
  352. ;)
  353. ;
  354. ;|Return TRUE if the point (xp,yp) lies inside the circumcircle
  355. made up by points (x1,y1) (x2,y2) (x3,y3)
  356. The circumcircle centre is returned in (xc,yc) and the radius r
  357. NOTE: A point on the edge is inside the circumcircle|;
  358. (defun InCircle1 (xp yp x1 y1 x2 y2 x3 y3 / InCircle eps mx2 my2 xc yc m1
  359.        mx1 my1 m2 mx2 my2 dx dy rsqr r drsqr
  360.    )
  361.   (setq eps 0.000001)
  362.   (setq InCircle nil)
  363.   (if (and
  364. (< (abs (- y1 y2)) eps)
  365. (< (abs (- y2 y3)) eps)
  366.       )
  367.     (alert "INCIRCUM - F - Points are coincident !!")
  368.     (progn
  369.       (cond
  370. ((< (abs (- y2 y1)) eps)
  371.    (setq m2 (/ (- x2 x3) (- y3 y2)))
  372.    (setq mx2 (/ (+ x2 x3) 2))
  373.    (setq my2 (/ (+ y2 y3) 2))
  374.    (setq xc (/ (+ x2 x1) 2))
  375.    (setq yc (+ my2 (* m2 (- xc mx2))))
  376. )
  377. ((< (abs (- y3 y2)) eps)
  378.    (setq m1 (/ (- x1 x2) (- y2 y1)))
  379.    (setq mx1 (/ (+ x1 x2) 2))
  380.    (setq my1 (/ (+ y1 y2) 2))
  381.    (setq xc (/ (+ x3 x2) 2))
  382.    (setq yc (+ my1 (* m1 (- xc mx1))))
  383. )
  384. (T
  385.    (setq m1 (/ (- x1 x2) (- y2 y1)))
  386.    (setq m2 (/ (- x2 x3) (- y3 y2)))
  387.    (setq mx1 (/ (+ x1 x2) 2))
  388.    (setq mx2 (/ (+ x2 x3) 2))
  389.    (setq my1 (/ (+ y1 y2) 2))
  390.    (setq my2 (/ (+ y2 y3) 2))
  391.    (setq xc (/ (- (+ (* m1 mx1) my2) my1 (* m2 mx2)) (- m1 m2)))
  392.    (setq yc (+ my1 (* m1 (- xc mx1))))
  393. )
  394.       )
  395.       (setq dx (- x2 xc))
  396.       (setq dy (- y2 yc))
  397.       (setq rsqr (+ (* dx dx) (* dy dy)))
  398.       (setq r (sqrt rsqr))
  399.       (setq dx (- xp xc))
  400.       (setq dy (- yp yc))
  401.       (setq drsqr (+ (* dx dx) (* dy dy)))
  402.       (if (<= drsqr rsqr)
  403. (setq InCircle T)
  404.       )
  405.     )
  406.   )
  407.   InCircle
  408. )
  409. ;|Determines which side of a line the point (xp,yp) lies.
  410. The line goes from (x1,y1) to (x2,y2)
  411. Returns -1 for a point to the left
  412.          0 for a point on the line
  413.         +1 for a point to the right|;
  414. (defun whichside (xp yp x1 y1 x2 y2 / equation)
  415.   (setq equation (- (* (- yp y1) (- x2 x1)) (* (- y2 y1) (- xp x1))))
  416.   (cond
  417.     ((> equation 0)
  418.       (setq whichside (- 0 1))
  419.     )
  420.     ((= equation 0)
  421.       (setq whichside 0)
  422.     )
  423.     (T
  424.       (setq whichside 1)
  425.     )
  426.   )
  427.   whichside
  428. )
  429. (defun givetri (/ lis)
  430.   (repeat 200
  431.     (setq lis (append
  432.   lis
  433.   (list (list nil nil nil))
  434.        )
  435.     )
  436.   )
  437.   lis
  438. )
  439. (defun givever (/ lis)
  440.   (repeat 200
  441.     (setq lis (append
  442.   lis
  443.   (list (list nil nil))
  444.        )
  445.     )
  446.   )
  447.   lis
  448. )
  449. (defun giveedg (/ lis lis1 lis2)
  450.   (repeat 200
  451.     (setq lis1 (append
  452.    lis1
  453.    (list nil)
  454.         )
  455.     )
  456.   )
  457.   (setq lis2 lis1)
  458.   (setq lis (append
  459.        lis
  460.        (list lis1)
  461.      )
  462.   )
  463.   (setq lis (append
  464.        lis
  465.        (list lis2)
  466.      )
  467.   )
  468.   lis
  469. )

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-24 04:24 , Processed in 0.138669 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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