明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6390|回复: 13

多边形Vonoroi 等分

[复制链接]
发表于 2012-11-9 00:03:10 | 显示全部楼层 |阅读模式
本帖最后由 chlh_jd 于 2012-11-9 00:03 编辑

大家好!
有个几何问题,一直困恼了我很长时间,直到现在都没有解决;

求多边形内的N个点,这N个点构成的Vonoroi形面积为多边形面积的N等分。
如附件所传,求多边形的Vonoroi形7等分的7个点。

这个问题可能有很多答案,只要能求解出一种,其他的方法应该是可以递推的。





本帖子中包含更多资源

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

x

本帖被以下淘专辑推荐:

  • · excel|主题: 80, 订阅: 2
 楼主| 发表于 2012-11-12 02:36:27 | 显示全部楼层
本帖最后由 chlh_jd 于 2012-11-12 03:14 编辑

写了个近似之一的,希望能有更多几何算法高手参与这个讨论

  1. ;;;--------------------------------------------------------------------------------;;;
  2. ;;; main function
  3. (defun foo  (l n / a cen a1 a2 a3 l1 l2 l3 is p0 ang an1 an d p)
  4.   ;; middle one ,  rest distributed in the surrounding method .
  5.   ;; by GSLS(SS) 2011-11-12
  6.   (setq a   (f1 l)
  7. cen (car a)
  8. a   (cadr a)
  9. a1  (/ a (1- n)))
  10.   (setq l1 (list (car l))
  11. l2 (append (cdr l) l1))
  12.   ;; though Centroid , Aliquot polygon by (1- n) .
  13.   ;; first point is the startpoint of polygon .
  14.   (repeat (- n 2)
  15.     (setq l3 nil
  16.    is nil
  17.    l3 (list (car l1) cen)
  18.    a2 (f2 (cons (car l2) l3))
  19.    )
  20.     (cond ((equal a1 a2 1e-4)
  21.     (setq is nil
  22.    l1 (cons (car l2) l1)
  23.    l2 (cdr l2)))
  24.    ((> a2 a1)
  25.     (setq is T)
  26.     )
  27.    ((< a2 a1)
  28.     (while (< a2 a1)
  29.       (setq l3 (cons (car l2) l3)
  30.      l2 (cdr l2)
  31.      a2 (f2 (cons (car l2) l3))))
  32.     (if (equal a1 a2 1e-4)
  33.       (setq is nil
  34.      l1 (cons (car l2) l1)
  35.      l2 (cdr l2))
  36.       (setq is T))
  37.     ))
  38.     (if is
  39.       (progn
  40. (setq p0  (car l2)
  41.        ang (angle p0 (car l3))
  42.        a3  (- a2 a1)
  43.        an1 (angle p0 cen)
  44.        an  (abs (- ang an1))
  45.        )
  46. (if (> an pi)
  47.    (setq an (- (+ pi pi) an)))
  48. (setq d  (/ (* a3 2.) (sin an) (distance p0 cen))
  49.        p  (polar p0 ang d)
  50.        l1 (cons p l1))))
  51.     )
  52.   ;; cal middle-polygon
  53.   ;;
  54.   (setq l2 (reverse (cons (last l1) l1))
  55. l1 (reverse l1)
  56. a3 (- a1 (/ a n))
  57. l2 (mapcar (function
  58.        (lambda (p0 p1 / an)
  59.          (setq an (abs (- (angle cen p0) (angle cen p1))))
  60.          (if (> an pi)
  61.     (setq an (- (+ pi pi) an)))
  62.          (/ a3 0.5 (sin an))
  63.          )
  64.        )
  65.      l2
  66.      (cdr l2)))
  67.   ;; solve XY=Z
  68.   (setq l2 (solve-xy=z l2 1e-3))
  69.   ;; list one
  70.   (setq l2 (mapcar (function (lambda (p a)
  71.           (polar cen (angle cen p) a)))
  72.      l1
  73.      l2))
  74.   (list l1 l2)
  75.   )
  76. ;;----------
  77. (defun f1  (lst / a c x y a1 c1)
  78.   ;; get polygon centroid and area
  79.   (setq a   0.
  80. c   (list 0. 0.)
  81. lst (cons (last lst) lst)
  82. )
  83.   (while (cadr lst)
  84.     (setq x   (car lst)
  85.    y   (cadr lst)
  86.    lst (cdr lst)
  87.    a1  (/ (- (* (car x) (cadr y)) (* (car y) (cadr x))) 2.)
  88.    a   (+ a a1)
  89.    c1  (list (/ (* (+ (car x) (car y)) a1) 3.)
  90.       (/ (* (+ (cadr x) (cadr y)) a1) 3.))
  91.    c   (mapcar (function +) c c1)
  92.    )
  93.     )
  94.   (if (= a 0.)
  95.     nil
  96.     (list (list (/ (car c) a) (/ (cadr c) a)) (abs a))
  97.     )
  98.   )
  99. ;;;-----------
  100. (defun f2  (l)
  101.   ;;get polygon area
  102.   (abs
  103.     (/
  104.       (apply
  105. (function +)
  106. (mapcar
  107.    (function (lambda (x y)
  108.         (- (* (car x) (cadr y)) (* (car y) (cadr x)))
  109.         ))
  110.    (cons (last l) l)
  111.    l
  112.    )
  113. )
  114.       2.))
  115.   )
  116. ;;;
  117. ;; (solve-xy=z (list 5 6 7 8) 1e-7)
  118. ;; (solve-xy=z '(8.89948e+007  7.06109e+007 7.46468e+007 9.56032e+007 6.8584e+007 7.87004e+007) 1e-7)
  119. (defun solve-xy=z  (l eps / f  a0 a res)
  120.   ;; solve Cycle Equations XY=Z , like
  121.   ;;  a*b = A ; b*c = B ; c*d = C ; d*e = D ; e*f = E ; f*a = F .
  122.   ;; Only for polygon Vonoroi-devide
  123.   ;; by GSLS(SS) 2012-11-12
  124.   (defun f  (a0 l)
  125.     (foreach b l
  126.       (setq a0 (/ b a0))
  127.       )
  128.     )
  129.   (setq a0 (sqrt (car l))
  130. a  (f a0 l))
  131.   (while (not (equal a0 a eps))
  132.     (setq a0 (sqrt (* a0 a))
  133.    a  (f a0 l))
  134.     (if (or (> a0 (* (sqrt (car l)) 3.16227766))
  135.      (< a0 (/ (sqrt (car l)) 3.16227766)))
  136.       (setq a0 (sqrt (car l))
  137.      a (f a0 l)
  138.      eps (* 10. eps))))
  139.   (setq res (list (sqrt (* a a0))))
  140.   (foreach b  l
  141.     (setq a   (/ b (car res))
  142.    res (cons a res)))
  143. (reverse (cdr res))   
  144.   )
  145. ;;-------------
  146. (defun ss-assoc (a lst / b res)
  147.   (while (setq b (assoc a lst))
  148.     (setq lst  (cdr (member b lst))
  149.    res (cons (cdr b) res)
  150.     ))(reverse res))
  151. ;;
  152. ;;--------------------------------
  153. ;; for test
  154. (defun c:test  (/ pl ent l n res)
  155.   (if (and
  156. (setq pl (car (entsel "\nSelect a LWPolyLine :")))
  157. (setq ent (entget pl)
  158.        l   (ss-assoc 10 ent))
  159. (setq n (getint "\n Vonoroi devide Number : ")))
  160.     (if (setq res (foo l n))
  161.       (progn
  162. (setq l1 (car res)
  163.        l2 (cadr res))
  164. (mapcar (function (lambda (p1 p2)
  165.        (entmake (list (cons 0 "LINE")
  166.         (cons 10 p1)
  167.         (cons 11 p2)
  168.         (cons 62 1)
  169.         (cons 8 "Temp")))))
  170.   (append l1 l2)
  171.   (append l2 (cdr l2) (list (car l2))))
  172. )
  173.       )
  174.     )
  175.   (princ)
  176.   )

本帖子中包含更多资源

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

x

点评

这太牛了!!!  发表于 2015-9-3 17:57

评分

参与人数 1明经币 +1 金钱 +15 收起 理由
qjchen + 1 + 15 赞一个! 觉得是挺难的题目的,没有想到什么.

查看全部评分

发表于 2012-11-15 23:04:06 | 显示全部楼层
前些日子看了,不过不大懂

也没有查到太类似的网页

唯一的一个是 rhino的grasshopper的一个插件,似乎是提供了源码,但似乎只是一个描述语言,看不懂

http://crtl-i.com/blog/2010/06/same-area-voronoi-using-galapagos/

另外,查到的类似文章,人家经常做的是,已有一些点,然后,需要做一些图形划分,每个图形中包含一个点,且面积相等

比但高山流水朋友的是要voronoi,点是不确定的,说不定更难,一时也想不到什么好方法
 楼主| 发表于 2012-11-18 00:13:21 | 显示全部楼层
本帖最后由 chlh_jd 于 2012-11-18 00:27 编辑

非常感谢QJChen老师!
每次总能得到您的帮助

曲面有限元分析程序经常会用到自适应网格划分,如果是自适应Delaunay三角网划分,实际上就得到了Vonoroi 图,但是麻烦的是这个自适应划分和面积相等可能对于任何一个可行方案都得计算很长时间。

国外一些先进的复杂结构模型建模辅助工具(如“犀牛”之类的参数化建模)可能有些帮助,但我一直没能得到这些软件试用
发表于 2013-4-27 19:52:00 | 显示全部楼层
厉害,很强大,收藏了
发表于 2013-6-28 10:02:51 | 显示全部楼层
chlh_jd 发表于 2012-11-12 02:36
写了个近似之一的,希望能有更多几何算法高手参与这个讨论

defun foo   ?
输入 foo  为什么不行啊
发表于 2014-12-30 11:40:53 | 显示全部楼层
高级活,长见识了!谢谢分享!
发表于 2015-6-3 19:59:37 | 显示全部楼层
freehand8008 发表于 2013-6-28 10:02
defun foo   ?
输入 foo  为什么不行啊

你没看清楚前面没有带 C:啊   

只能外部调用它
发表于 2015-6-3 20:02:11 | 显示全部楼层
freehand8008 发表于 2013-6-28 10:02
defun foo   ?
输入 foo  为什么不行啊

输入test,那个是主函数
发表于 2015-6-4 09:34:37 | 显示全部楼层
看天的小树 发表于 2015-6-3 20:02
输入test,那个是主函数

成功

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-11-24 00:32 , Processed in 0.188825 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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