找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7748|回复: 22

分形图形(树,图案)及螺旋型星云线的绘制

[复制链接]
发表于 2006-7-23 12:42:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
最近喜欢上了分形和递归,网上也有好些分形的LISP, 如LIVER兄就写过分形与递归的好文章,
还有好些画树的LSP.
感觉LISP应该很适合来做分形的,于是看了一些书
发现递归还没有怎么学会,不过分形中除了递归算法,还有LS文法算法,迭代函数系统算法,逃逸时间算法
分形演化算法等有趣的东西. 个人觉得要实现更漂亮的实体涂色等等说不定用opengl之类会好些
于是先拣了一种比较适合用cad还画线的LS文法学习,发现还挺有趣的,于是按照
孙博文撰写的《分析算法与程序设计-Visual C++实现》 书里的文法思想撰写了如下画树的小程序
还没有考虑多参数文法以及随机文法.
仅为消遣,见笑了,有兴趣的话改改pattern,可以得到其他类型的树

[iframe h=500 w=600]http://qjchen.googlepages.com/tree1.png[/iframe]


  1. ;;; ========================================================================
  2. ;;; 功能:按照LS文法绘制分形树                                             ;
  3. ;;; 命令 :tree                                                             ;
  4. ;;; 平台: Acad14以上                                                       ;
  5. ;;; 限制:还没有考虑多参数和随机性                                         ;
  6. ;;; 说明: pattern 是树基本构形的定义,你可以自己修改                       ;
  7. ;;;       "F" 代表树在某方向生长                                           ;
  8. ;;;       "+" 代表逆时针一个角度生长                                       ;
  9. ;;;       "-" 代表顺时钟一个角度生长                                       ;
  10. ;;;       "[" 和 "]" 是对应的,表明做完[]内操作后笔回到起点 .              ;                                  ;
  11. ;;;       代替(repeat 4)中的4到更大的数值,可以获得更茂盛的树叶不过速度变慢;
  12. ;;;       比如模式F[-F]F[+F]F 代表                                         ;
  13. ;;;                                                                        ;
  14. ;;;                                                                        ;
  15. ;;;                       \   |                                            ;
  16. ;;;                        \  |                                            ;
  17. ;;;                         \ |                                            ;
  18. ;;;                          \|                                            ;
  19. ;;;                           |   /                                        ;
  20. ;;;                           |  /                                         ;
  21. ;;;                           | /                                          ;
  22. ;;;                           |/                                           ;
  23. ;;;                           |                                            ;
  24. ;;;                           |                                            ;
  25. ;;;                           |                                            ;
  26. ;;;                           |                                            ;
  27. ;;;                                                                        ;
  28. ;;; 代码思想来自孙博文撰写的《分析算法与程序设计-Visual C++实现》         ;
  29. ;;; 2006.07.23                                                             ;
  30. ;;; [url]Http://autolisper.googlepages.com[/url]                                      ;
  31. ;;; [url]Http://qjchen.googlepages.com[/url]                                          ;
  32. ;;; ========================================================================
  33. (defun c:tree (/ os ang len ori oriang pattern finalpattern)
  34.   (setq os (getvar "osmode"))
  35.   (setvar "osmode" 0)
  36.   (setq ang (dtor 25.0)
  37.         len 100
  38.         ori (getpoint "\n The start point")
  39.         oriang (dtor 90.0)
  40.         pattern (getpattern)
  41.         finalpattern "F"
  42.   )
  43.   (repeat 4
  44.     (setq finalpattern (my-subst pattern "F" finalpattern))
  45.   )
  46.   (drawfinalpattern finalpattern ori oriang)
  47.   (COMMAND "ZOOM" "E" "zoom" ".9x")
  48.   (setvar "osmode" os)
  49. )
  50. ;;degreed to radian;;
  51. (defun dtor (x)
  52.   (* (/ x 180) pi)
  53. )
  54. ;;;get tree pattern;;
  55. (defun getpattern (/ kword pattern)
  56.   (initget "1 2 3 4 5 6")
  57.   (setq kword (getkword "\n please select the tree type: 1/2/3/4/5/6:"))
  58.   (cond
  59.     ((= kword "1")
  60.       (setq pattern "F[+F]F[-F+F]")
  61.     )
  62.     ((= kword "2")
  63.       (setq pattern "F[-F]F[+F]F")
  64.     )
  65.     ((= kword "3")
  66.       (setq pattern "FF+[+F-F-F]-[-F+F+F]")
  67.     )
  68.     ((= kword "4")
  69.       (setq pattern "F[-F][+F]F")
  70.     )
  71.     ((= kword "5")
  72.       (setq pattern "F[+F]F[-F]+F")
  73.     )
  74.     ((= kword "6")
  75.       (setq pattern "F[-F][+F][--F]F[++F]F")
  76.     )
  77.   )
  78.   pattern
  79. )
  80. ;;;;draw finalpattern
  81. (defun drawfinalpattern (finalpattern ori oriang / i slen x ori1 templst)
  82.   (setq i 1
  83.         slen (strlen finalpattern)
  84.   )
  85.   (repeat slen
  86.     (setq x (substr finalpattern i 1))
  87.     (cond
  88.       ((= x "F")
  89.         (setq ori1 (polar ori oriang len))
  90.         (make_line ori ori1)
  91.         (setq ori ori1)
  92.       )
  93.       ((= x "[")
  94.         (setq templst (append
  95.                         templst
  96.                         (list (list oriang ori))
  97.                       )
  98.         )
  99.       )
  100.       ((= x "]")
  101.         (setq oriang (car (last templst)))
  102.         (setq ori (cadr (last templst)))
  103.         (setq templst (1ton_1 templst))
  104.       )
  105.       ((= x "+")
  106.         (setq oriang (+ oriang ang))
  107.       )
  108.       ((= x "-")
  109.         (setq oriang (- oriang ang))
  110.       )
  111.     )
  112.     (setq i (1+ i))
  113.   )
  114. )
  115. ;;;to substitute every one item(strlen=1) to new item
  116. (defun my-subst (new old str / slen i res)
  117.   (setq i 1
  118.         res ""
  119.   )
  120.   (if (setq slen (strlen str))
  121.     (repeat slen
  122.       (setq stri (substr str i 1)
  123.             i (1+ i)
  124.       )
  125.       (if (= old stri)
  126.         (setq res (strcat res new))
  127.         (setq res (strcat res stri))
  128.       )
  129.     )
  130.   )
  131.   res
  132. )
  133. ;;xoutside function to entmake line
  134. (defun make_Line (l10 l11)
  135.   (ENTMAKE (LIST (CONS 0 "LINE") (cons 62 80) (cons 10 l10) (cons 11 l11)))
  136. )
  137. ;; get the 1 to (n-1) element of a list
  138. (defun 1ton_1 (lst)
  139.   (reverse (cdr (reverse lst)))
  140. )
  141. (princ "\n")
  142. (prompt "\n use LS gramma to draw tree, command:tree?QJCHEN \n")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-7-23 13:46:48 | 显示全部楼层
非常不错,画了一个
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-23 18:21:42 | 显示全部楼层
经过一个下午的修改,改成了多参数类型的LS文法,不过这个似乎不大好理解,只能先照着写了
这种多参数的相对更象树了,这个叫多参数1,等晚上再进一步改成多参数2

[iframe h=500 w=600]http://autolisper.googlepages.com/tree2.png[/iframe]


  1. ;;; ========================================================================
  2. ;;; 功能:按照LS文法绘制分形树之多参数制作                                 ;
  3. ;;; 命令 :tree                                                             ;
  4. ;;; 平台: Acad14以上                                                       ;
  5. ;;; 限制:还没有考虑多参数和随机性                                         ;
  6. ;;; 说明: 多参数的含义一时无法说明,其中ang是基本角度,而omega是基本构形   ;
  7. ;;;       P1a和P1等五对参数轮番对换迭代,P1a->P1, P2a->P2,...              ;
  8. ;;; 代码思想来自孙博文撰写的《分析算法与程序设计-Visual C++实现》         ;
  9. ;;; 2006.07.23                                                             ;
  10. ;;; Scut QJCHEN                                                            ;
  11. ;;; [url]Http://autolisper.googlepages.com[/url]                                      ;
  12. ;;; [url]Http://qjchen.googlepages.com[/url]                                          ;
  13. ;;; ========================================================================
  14. (defun c:tree (/ os plst ang omega P1a P1 P2a P2 P3a P3 P4a P4 P5a P5 color
  15.                  len ori oriang
  16.               )
  17.   (setq os (getvar "osmode"))
  18.   (setvar "osmode" 0)
  19.   (setq plst (getpattern)
  20.         ang (dtor (nth 0 plst))
  21.         omega (nth 1 plst)
  22.         P1a (nth 2 plst)
  23.         P1 (nth 3 plst)
  24.         P2a (nth 4 plst)
  25.         P2 (nth 5 plst)
  26.         P3a (nth 6 plst)
  27.         P3 (nth 7 plst)
  28.         P4a (nth 8 plst)
  29.         P4 (nth 9 plst)
  30.         P5a (nth 10 plst)
  31.         P5 (nth 11 plst)
  32.         len 100
  33.         ori (getpoint "\n The start point")
  34.         oriang (dtor 90.0)
  35.         color 84
  36.   )
  37.   (repeat (nth 12 plst)
  38.     (if P1a
  39.       (setq omega (my-subst P1 P1A omega))
  40.     )
  41.     (if P2a
  42.       (setq omega (my-subst P2 P2A omega))
  43.     )
  44.     (if P3a
  45.       (setq omega (my-subst P3 P3A omega))
  46.     )
  47.     (if P4a
  48.       (setq omega (my-subst P4 P4A omega))
  49.     )
  50.     (if P5a
  51.       (setq omega (my-subst P5 P5A omega))
  52.     )
  53.   )
  54.   (drawomega omega ori oriang)
  55.   (COMMAND "ZOOM" "E" "zoom" ".9x")
  56.   (setvar "osmode" os)
  57. )
  58. ;;degreed to radian;;
  59. (defun dtor (x)
  60.   (* (/ x 180) pi)
  61. )
  62. ;;;get tree pattern;;
  63. (defun getpattern (/ kword pattern pattern1)
  64.   (initget "1 2 3 4 5 6 7")
  65.   (setq kword (getkword "\n please select the tree type: 1/2/3/4/5/6/7:"))
  66.   (cond
  67.     ((= kword "1")
  68.       (setq res (list 20.0 "X" "F" "FF" "X" "F[+X]F[-X]+X" nil nil nil nil
  69.                       nil nil 6
  70.                 )
  71.       )
  72.     )
  73.     ((= kword "2")
  74.       (setq res (list 30.0 "Z" "X" "X[-FFF][+FFF]FX" "Z" "ZFX[+Z][-Z]" nil
  75.                       nil nil nil nil nil 6
  76.                 )
  77.       )
  78.     )
  79.     ((= kword "3")
  80.       (setq res (list 22.5 "F" "F" "FF-[XY]+[XY]" "X" "+FY" "Y" "-FX" nil
  81.                       nil nil nil 4
  82.                 )
  83.       )
  84.     )
  85.     ((= kword "4")
  86.       (setq res (list 5.0 "G" "G" "GFX[+++++GFG][-----GFG]" "X" "F-XF" nil
  87.                       nil nil nil nil nil 4
  88.                 )
  89.       )
  90.     )
  91.     ((= kword "5")
  92.       (setq res (list 25.7 "X" "F" "FF" "X" "F[+X][-X]FX" nil nil nil nil
  93.                       nil nil 7
  94.                 )
  95.       )
  96.     )
  97.     ((= kword "6")
  98.       (setq res (list 45.0 "FX" "F" "" "X" "-FX++FX-" nil nil nil nil nil
  99.                       nil 10
  100.                 )
  101.       )
  102.     )
  103.     ((= kword "7")
  104.       (setq res (list 30.0 "G" "G" "[+FGF][-FGF]XG" "X" "XFX" nil nil nil
  105.                       nil nil nil 6
  106.                 )
  107.       )
  108.     )
  109.   )
  110.   res
  111. )
  112. ;;;;draw finalomega
  113. (defun drawomega (omega ori oriang / i slen x ori1 templst)
  114.   (setq i 1
  115.         slen (strlen omega)
  116.   )
  117.   (repeat slen
  118.     (setq x (substr omega i 1))
  119.     (cond
  120.       ((= x "F")
  121.         (setq ori1 (polar ori oriang len))
  122.         (make_line ori ori1 color)
  123.         (setq ori ori1)
  124.       )
  125.       ((= x "[")
  126.         (setq templst (append
  127.                         templst
  128.                         (list (list oriang ori))
  129.                       )
  130.               color 80
  131.         )
  132.       )
  133.       ((= x "]")
  134.         (setq oriang (car (last templst))
  135.               ori (cadr (last templst))
  136.               templst (1ton_1 templst)
  137.               color 84
  138.         )
  139.       )
  140.       ((= x "+")
  141.         (setq oriang (+ oriang ang))
  142.       )
  143.       ((= x "-")
  144.         (setq oriang (- oriang ang))
  145.       )
  146.     )
  147.     (setq i (1+ i))
  148.   )
  149. )
  150. ;;;to substitute every one item(strlen=1) to new item
  151. (defun my-subst (new old str / slen i res)
  152.   (setq i 1
  153.         res ""
  154.   )
  155.   (if (setq slen (strlen str))
  156.     (repeat slen
  157.       (setq stri (substr str i 1)
  158.             i (1+ i)
  159.       )
  160.       (if (= old stri)
  161.         (setq res (strcat res new))
  162.         (setq res (strcat res stri))
  163.       )
  164.     )
  165.   )
  166.   res
  167. )
  168. ;;xoutside function to entmake line
  169. (defun make_Line (l10 l11 color)
  170.   (ENTMAKE (LIST (CONS 0 "LINE") (cons 62 color) (cons 10 l10)
  171.                  (cons 11 l11)
  172.            )
  173.   )
  174. )
  175. ;; get the 1 to (n-1) element of a list
  176. (defun 1ton_1 (lst)
  177.   (reverse (cdr (reverse lst)))
  178. )
  179. (princ "\n")
  180. (prompt "\n use LS gramma to draw tree, command:tree?QJCHEN \n")

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-7-23 19:45:15 | 显示全部楼层
http://www.cgn.net.cn/wsdj/z5.htm
[iframe h=600 w=100%]http://www.cgn.net.cn/wsdj/z5.htm[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-23 22:04:11 | 显示全部楼层
eachy版主的是专业理论:)
这个LS文法就是5.6的L系统
IFS好像也很有趣,就是不知道用acad的点系统看起来会不会漂亮,实现起来倒是挺简单的,那个复平面的JULIA集的IFS算法应该也挺有趣,分形确实是比较有趣的东西。正在下emule的分形电影。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-24 00:19:33 | 显示全部楼层
[iframe h=600 w=100%]http://www.sogoll.com/Article/xuekebolan/shuxue/Article_3137.html[/iframe]

[iframe h=600 w=100%]http://www.whsss.com/Article/Print.asp?ArticleID=3092[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-24 09:54:30 | 显示全部楼层
前段时间也喜欢了一阵分形艺术
没搞出来什么名堂
后来兴趣转移了

一个分形艺术的网站
http://www.fractal.net.cn/


下面这个是别人写的一个画树的



  1. ;;--------------------------------------------------------------------------;
  2. ;;                             FRACTAL                                      ;
  3. ;;--------------------------------------------------------------------------;
  4. ;; Function Fractal by others, wish I could remember who did it to give
  5. ;;      them the credit.

  6.   (defun Fractal (P1 P2 / P3 A DISTS)
  7.     (setq DISTS (distance P1 P2)
  8.           A     (angle P1 P2))
  9.     (command "._ucsicon" "OFF"
  10.              "._zoom" "W" "-1.03,-1.1875" "1.03,2.15")
  11.     (if (< DISTS EPSILON)
  12.       (command "._line" P1 P2 nil)
  13.       (progn
  14.         (setq P3 (polar P1 (angle P1 P2) (* DISTS 0.5)))
  15.         (command "._line" P1 P3 nil)
  16.         (Fractal P3 (polar P3 (+ (angle P1 P2) AFRACT) (* DISTS 0.5 )))
  17.         (Fractal P3 (polar P3 (- (angle P1 P2) AFRACT) (* DISTS 0.5 )))
  18.         (Fractal P1 P3)
  19.       )
  20.     )
  21.   )

  22.   (setvar "Cmdecho" 0)
  23.   (setvar "Blipmode" 0)


  24. ;;--------------------------------------------------------------------------;
  25. ;;                             DrawTree                                     ;
  26. ;;--------------------------------------------------------------------------;
  27.   (defun DrawTree ()
  28.     (command "._color" "3")
  29.     (Fractal '(0 2) '(0 0))
  30.     (command "._line" '(0 0) '(0 1) nil
  31.              "._color" "bylayer")
  32.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-24 17:38:31 | 显示全部楼层
谢谢两位
刀兄提到的布朗运动可用在分形演化算法中,刚刚还不知道这个布朗运动怎么来模拟,就学到一招了。

它山之石兄的这个画树程序是用递归的,我老是学不会递归,有空多跟大家学习:)网站中的分形颜色很漂亮。

下面的代码是用IFS算法绘制分形图形的。
发现cad中的点在这种分形图形中,却不如位图的象素好看,觉得很是郁闷,不知道在cad中怎么来模拟象素点,用point好像太离散,用solid又好像太耗时。

代码中用了entmake的方法来画点,其实假如想有效果的话,可以改用注释中的command,可以看到一种显影的效果。

效果


  1. ;;; ======================================================================
  2. ;;; 功能:采用IFS迭代函数系统算法进行分形图形的绘制                        ;
  3. ;;; 命令: tree(由于和前面的LS算法中采用了同样的子程序名,若出错请新建文件  ;
  4. ;;; 平台:acad14及以上版本                                                 ;
  5. ;;; 说明:采用了IFS算法,其中,基本样式定义里面,以第一个为例              ;
  6. ;;;         (list (list 0.5 0.0 0.0 0.5 0.0 0.0 0.333)                     ;
  7. ;;;               (list 0.5 0.0 0.0 0.5 0.5 0.0 0.333)                     ;
  8. ;;;                  (list 0.5 0.0 0.0 0.5 0.25 0.5 0.334))                   ;
  9. ;;;        有三个元素(可以是更多或更少)                                  ;
  10. ;;;        每个最后的0.333 0.333 0.334是概率,rndlst是其叠加(0.333 0.666 1) ;
  11. ;;;        而其余6个是参数a b c d e f                                      ;
  12. ;;;        它们参与放射变换 :                                              ;
  13. ;;;         x'=ax+by+e                                                     ;
  14. ;;;         y'=cx+dy+f                                                     ;
  15. ;;;        先建立随机数(用的是Smadsen的函数),判断其在rndlst的哪个区域    ;
  16. ;;;        决定用哪个abcdef,按照计算的x‘和y’画点,然后循环                ;
  17. ;;; 2006.07.24                                                             ;
  18. ;;; 代码思想来自孙博文撰写的《分析算法与程序设计-Visual C++实现》         ;
  19. ;;; 2006.07.23                                                             ;
  20. ;;; 华南理工大学建筑学院 QJCHEN                                            ;
  21. ;;; [url]Http://autolisper.googlepages.com[/url]                                      ;
  22. ;;; [url]Http://qjchen.googlepages.com[/url]                                          ;
  23. ;;; ========================================================================
  24. (defun c:tree (/ os plst iteration ori orix oriy color rndlst position
  25.                  neworix neworiy
  26.               )
  27.   (setq os (getvar "osmode"))
  28.   (setq cmd (getvar "cmdecho"))
  29.   (setvar "osmode" 0)
  30.   (setvar "cmdecho" 0)
  31.   (setq plst (getpattern)
  32.         iteration 20000
  33.         ori (getpoint "\n The start point")
  34.         x (car ori)
  35.         y (cadr ori)
  36.         orix 0.0
  37.         oriy 0.0
  38.         color 80
  39.        
  40.   )
  41.   ;(if (= k nil) (setq k 10) (setq k (+ k 10)) )
  42.   (setq rndlst (getrndlst plst))
  43.   (repeat iteration
  44.     (setq a (rng))
  45.     (setq position (my-position a rndlst))
  46.     (setq newx (+ (* orix (nth 0 (nth position plst)))
  47.                   (* oriy (nth 1 (nth position plst)))
  48.                   (nth 4 (nth position plst))
  49.                )
  50.     )
  51.     (setq newy (+ (* orix (nth 2 (nth position plst)))
  52.                (* oriy (nth 3 (nth position plst)))
  53.                (nth 5 (nth position plst))
  54.                )
  55.     )
  56.     (setq orix newx
  57.           oriy newy
  58.     )   
  59.     ;(setq color (+ (* (fix (* (+ 1.4 oriy) 3)) 10)) 20)
  60.     ;(setq color (+ (* position 2) 100))
  61.     (make_point (list (+ orix x) (+ oriy y) 0.0) color)
  62.     ;(command "color" k)
  63.     ;(command "point" (list (+ orix x) (+ oriy y) 0.0))
  64.   )
  65.   (COMMAND "ZOOM" "E" "zoom" ".9x")
  66.   (setvar "osmode" os)
  67.   (setvar "cmdecho" cmd)
  68. )
  69. ;;;get tree pattern;;
  70. (defun getpattern (/ kword pattern pattern1)
  71.   (initget "1 2 3 4 5 6 7 8 9 10")
  72.   (setq kword (getkword "\n please select the tree type: 1/2/3/4/5/6/7/8/9/10:"))
  73.   (cond
  74.     ((= kword "1")
  75.       (setq res (list (list 0.5 0.0 0.0 0.5 0.0 0.0 0.333)
  76.                       (list 0.5 0.0 0.0 0.5 0.5 0.0 0.333)
  77.                       (list 0.5 0.0 0.0 0.5 0.25 0.5 0.334)
  78.                 )
  79.       )
  80.     )
  81.     ((= kword "2")
  82.       (setq res (list (list 0.5 -0.5 0.5 0.5 0.0 0.0 0.5)
  83.                             (list 0.5 0.5 -0.5 0.5 0.5 0.5 0.5)
  84.                 )
  85.       )
  86.     )
  87.     ((= kword "3")
  88.       (setq res (list (list -0.04 0 -0.19 -0.47 -0.12 0.3 0.25)
  89.                       (list 0.65 0.0 0.0 0.56 0.06 1.56 0.25)
  90.                       (list 0.41 0.46 -0.39 0.61 0.46 0.4 0.25)
  91.                       (list 0.52 -0.35 0.25 0.74 -0.48 0.38 0.25)
  92.                 )
  93.       )
  94.     )
  95.     ((= kword "4")
  96.       (setq res (list (list 0.6 0 0 0.6 0.18 0.36 0.25)
  97.                             (list 0.6 0 0 0.6 0.18 0.120 0.25)
  98.                       (list 0.4 0.3 -0.3 0.4 0.27 0.36 0.25)
  99.                       (list 0.4 -0.3 0.3 0.4 0.27 0.09 0.25)
  100.                 )
  101.       )
  102.     )
  103.     ((= kword "5")
  104.       (setq res (list
  105.       (list 0.787879 -0.424242 0.242424 0.859848 1.758647 1.408065 0.9)
  106.       (list -0.121212 0.257576 0.05303 0.05303 -6.721654 1.377236 0.05)
  107.       (list 0.181818 -0.136364 0.090909 0.181818 6.086107 1.568035 0.05)

  108.                 )
  109.       )
  110.     )
  111.     ((= kword "6")
  112.       (setq res (list
  113.       (list 0.745455 -0.45901 0.406061 0.887121 1.460279 0.691072 0.912675)
  114.       (list -0.424242 -0.065152 -0.175758 -0.218182 3.809567 6.741476 0.087325)
  115.                 )
  116.       )
  117.     )
  118.     ((= kword "7")
  119.       (setq res (list (list 0 0 0 0.25 0 -0.14 0.02)
  120.                       (list 0.85 0.02 -0.02 0.83 0 1 0.84)
  121.                       (list 0.09 -0.28 0.3 0.11 0 0.6 0.07)
  122.                       (list -0.09 0.25 0.3 0.09 0 0.7 0.07)
  123.                 )
  124.       )
  125.     )
  126.     ((= kword "8")
  127.       (setq res (list (list 0.05 0 0 0.6 0 0 0.1)
  128.                       (list 0.05 0 0 -0.5 0 1.0 0.1)
  129.                       (list 0.46 0.32 -0.386 0.383 0 0.6 0.2)
  130.                       (list 0.47 -0.154 0.171 0.423 0 1.0 0.2)
  131.                       (list 0.43 0.275 -0.26 0.476 0 1.0 0.2)
  132.                       (list 0.421 -0.357 0.354 0.307 0 0.7 0.2)
  133.                 )
  134.       )
  135.     )
  136.     ((= kword "9")
  137.       (setq res (list (list 0 0 0 0.16 0 0 0.01)
  138.                       (list 0.85 0.04 -0.04 0.85 0 1.6 0.85)
  139.                       (list 0.2 -0.26 0.23 0.22 0 1.6 0.07)
  140.                       (list -0.15 0.28 0.26 0.24 0 0.44 0.07)
  141.                  )
  142.       )
  143.     )
  144.     ((= kword "10")
  145.       (setq res (list (list 0.8 0.0 0.0 -0.8 0.0 0.0 0.5)
  146.                       (list 0.4 -0.2 0.2 0.4 1.1 0.0 0.5)
  147.                 )
  148.       )
  149.     )
  150.   )
  151.   res
  152. )
  153. ;;xoutside function to entmake line
  154. (defun make_point (l10 color)
  155.   (ENTMAKE (LIST (CONS 0 "POINT") (cons 62 color) (cons 10 l10)))
  156. )
  157. ;; random number
  158. (defun rng (/ modulus multiplier increment random)
  159.   (if (not seed)
  160.     (setq seed (getvar "DATE"))
  161.   )
  162.   (setq modulus 4294967296.0
  163.         multiplier 1664525
  164.         increment 1
  165.         seed (rem (+ (* multiplier seed) increment) modulus)
  166.         random (/ seed modulus)
  167.   )
  168. )
  169. ;; judge the position
  170. (defun my-position (x lst / i lenlst x res k)
  171.   (setq i 0
  172.         k 0
  173.         lenlst (length lst)
  174.   )
  175.   (repeat lenlst
  176.     (if (and
  177.           (= k 0)
  178.           (<= x (nth i lst))
  179.         )
  180.       (setq res i
  181.             k 1
  182.       )
  183.     )
  184.     (setq i (1+ i))
  185.   )
  186.   res
  187. )
  188. ;; get the accumulate list
  189. (defun getrndlst (lst / rndlst a x rndlst1)
  190.   (foreach x plst
  191.     (setq rndlst (append
  192.                    rndlst
  193.                    (list (last x))
  194.                  )
  195.     )
  196.   )
  197.   (setq a 0)
  198.   (foreach x rndlst
  199.     (setq a (+ a x))
  200.     (setq rndlst1 (append
  201.                     rndlst1
  202.                     (list a)
  203.                   )
  204.     )
  205.   )
  206.   rndlst1
  207. )
  208. (princ "\n")
  209. (prompt "\n use LS gramma to draw tree, command:tree?QJCHEN \n")



[iframe h=500 w=600]http://autolisper.googlepages.com/tree3.png[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-26 12:08:01 | 显示全部楼层
看了在http://www.theswamp.org/index.php?topic=11255.new#new  上的图片
真的是非常漂亮

可惜现在晓东看不到贴图,
转贴网站 居然也看不到
大家没有眼福了呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-26 17:27:48 | 显示全部楼层
谢谢石兄,您的那个fractal好像有一个AFRACT没有定义,运行不了啊,theswamp的贴图功能挺好的
乱七八糟的完成了下面这个Julia集的绘制,没有想到绘制一个400*400的图形,cad会这么的辛苦,可能Lisp的计算效率确实不高,也可能我用的solid比较怪异,但无论如何,实现了在cad中绘制Julia集的一个目标。
请注意,计算时间很久。


  1. ;;; 注意: 本程序非常耗时和耗CPU,在我的P4 2.8C机器上完成一次需要150秒左右   ;
  2. ;;;       请小心使用,反正画出来的图形也不是很精致,请自己选择决定使用与否   ;
  3. ;;; ========================================================================
  4. ;;; 功能:采用Julia复数集的逃逸时间算法进行分形图形的绘制                  ;
  5. ;;; 命令: tree(由于和前面的LS算法中采用了同样的子程序名,若出错请新建文件  ;
  6. ;;; 平台:acad2004及以上版本                                               ;
  7. ;;; 说明:采用了JULIA集的复数算法                                          ;
  8. ;;;       变化pattern中的第五第六个数,可以得到不同的图形                   ;
  9. ;;;       建议第一个颜色用浅色,比如(151,148,244), 而第二个用深色(45,27,34) ;
  10. ;;; 参数:  k:判断逃逸与否的迭代次数                                        ;
  11. ;;;        m:逃逸半径                                                      ;
  12. ;;;        mx,my: 图形的宽和高                                             ;
  13. ;;;        xs,xl,ys,yl: 复数C的最大最小值                                  ;
  14. ;;;        p,q:复数的初值                                                  ;
  15. ;;; 代码思想来自孙博文撰写的《分析算法与程序设计-Visual C++实现》         ;
  16. ;;; 华南理工大学建筑学院 QJCHEN                                            ;
  17. ;;; [url]Http://autolisper.googlepages.com[/url]                                      ;
  18. ;;; [url]Http://qjchen.googlepages.com[/url]                                          ;
  19. ;;; ========================================================================
  20. (defun c:tree (/ hsllst hsl1 hsl2 os cmd plst k m mx my p q xs xl ys yl
  21.                  color xb yb i j x0 y0 l index xk yk r tempa
  22.               )
  23.   (startTimer)
  24.   (setq hsllst (gethsl))
  25.   (setq hsl1 (car hsllst))
  26.   (setq hsl2 (cadr hsllst))
  27.   (setq os (getvar "osmode"))
  28.   (setq cmd (getvar "cmdecho"))
  29.   (setvar "osmode" 0)
  30.   (setvar "cmdecho" 0)
  31.   (vload)
  32.   (setq plst (getpattern)
  33.         k 20
  34.         m 200
  35.         mx 400
  36.         my 400
  37.         xs (nth 0 plst)
  38.         xl (nth 1 plst)
  39.         ys (nth 2 plst)
  40.         yl (nth 3 plst)       
  41.         p (nth 4 plst)
  42.         q (nth 5 plst)
  43.         order (nth 6 plst)
  44.         color 16
  45.         xb (/ (- xl xs) mx)
  46.         yb (/ (- yl ys) my)
  47.         i 0
  48.   )
  49.   
  50.   (repeat mx
  51.     (setq j 0)
  52.     (repeat my
  53.       (setq x0 (+ xs (* i xb))
  54.             y0 (+ ys (* j yb))
  55.             l 0
  56.             index 0
  57.       )
  58.       (while (and
  59.                (= index 0)
  60.                (<= l k)
  61.              )
  62.        
  63.         (setq xk (- (+ (* x0 x0) p) (* y0 y0)))
  64.         (setq yk (+ q (* 2 x0 y0)))
  65.         (setq r (+ (* xk xk) (* yk yk)))
  66.         (setq x0 xk
  67.               y0 yk
  68.         )
  69.         (cond
  70.           ((> r m)
  71.             (setq index 1)
  72.             (make_solid (list i j 0.0) 0.5 color)
  73.             ;(make_point (list i j 0.0) 5)
  74.             (setq interhsl (list (interpolate (nth 0 hsl1) (nth 0 hsl2) l k)
  75.                                   (interpolate (nth 1 hsl1) (nth 1 hsl2) l k)
  76.                                   (interpolate (nth 2 hsl1) (nth 2 hsl2) l k)
  77.                             )
  78.             )
  79.             
  80.             (myputcolor interhsl)
  81.           )
  82.           ((= l k)
  83.             (setq index 1)
  84.             (make_solid (list i j 0.0) 0.5 color)

  85.             ;(make_point (list i j 0.0) 5)
  86.             (setq tempa (* (/ r m) 100))
  87. ;            (setq interhsl (list (* tempa 128)
  88. ;                                  (+ (* tempb 10) 90)
  89. ;                                  57
  90. ;                            )
  91. ;            )
  92.             (setq interhsl (list (* tempa 360)
  93.                                   90
  94.                                   57
  95.                             )
  96.             )
  97.             (myputcolor interhsl)
  98.           )
  99.         )
  100.         (setq l (1+ l))
  101.       )
  102.       (setq j (1+ j))
  103.     )
  104.     (setq i (1+ i))
  105.   )
  106.   (COMMAND "ZOOM" "E" "zoom" ".9x")
  107.   (setvar "osmode" os)
  108.   (setvar "cmdecho" cmd)
  109.   (endTimer (vl-symbol-name 'c:tree))
  110. )
  111. ;;; ========================================================================
  112. ;;; Belong to this program, to get the pattern                             ;
  113. ;;; ========================================================================
  114. (defun getpattern (/ kword pattern pattern1)
  115.   (initget "1 2 3 4")
  116.   (setq kword (getkword "\n please select the tree type: 1/2/3/4:"))
  117.   (cond
  118.     ((= kword "1")
  119.       (setq res (list -1.5 1.5 -1.5 1.5 -0.46 0.57 2))
  120.     )
  121.     ((= kword "2")
  122.       (setq res (list -1.5 1.5 -1.5 1.5 -0.199 -0.66 2))
  123.     )
  124.     ((= kword "3")
  125.       (setq res (list -1.5 1.5 -1.5 1.5 -0.615 -0.43 2))
  126.     )
  127.     ((= kword "4")
  128.       (setq res (list -1.5 1.5 -1.5 1.5 -0.77 0.08 2))
  129.     )
  130.   )
  131.   res
  132. )
  133. ;;; ========================================================================
  134. ;;; Belong to this program, to get hsl color                               ;
  135. ;;; ========================================================================
  136. (defun gethsl(/ color1 rcolor1 rgb1 hsl1 color2 rcolor2 rgb2 hsl2)
  137.   (setq color1 (acad_truecolordlg (cons 420 2594)))
  138.   (setq rcolor1 (cdr (assoc 420 (cdr color1))))
  139.   (setq rgb1 (megetrgb rcolor1))
  140.   (setq hsl1 (MeCalcHslModel rgb1))
  141.   (setq color2 (acad_truecolordlg (cons 420 12594)))
  142.   (setq rcolor2 (cdr (assoc 420 (cdr color2))))
  143.   (setq rgb2 (megetrgb rcolor2))
  144.   (setq hsl2 (MeCalcHslModel rgb2))
  145.   (list hsl1 hsl2)
  146. )
  147. ;;; ========================================================================
  148. ;;; Belong to this program, to get accmcolor                               ;
  149. ;;; ========================================================================
  150. (defun vload ()
  151.   (VL-LOAD-COM)
  152.   (setq acCmColor (vla-GetInterfaceObject (vlax-get-acad-object)
  153.                                           "AutoCAD.AcCmColor.16"
  154.                   )
  155.   )
  156.   (vla-put-colorMethod acCmColor acColorMethodByRGB)
  157.   (vla-put-colorIndex acCmColor 7)
  158.   (vla-put-entityColor acCmColor -1073741824)
  159. )
  160. ;;; ========================================================================
  161. ;;; Function MeGetRGB                                                      ;
  162. ;;; Get the RGB value of Acad                                              ;
  163. ;;; Copyright:2000 MENZI ENGINEERING GmbH, Switzerland                     ;
  164. ;;; ========================================================================
  165. (defun MeGetRGB (Val)
  166.   (list (lsh Val -16) (lsh (lsh Val 16) -24) (lsh (lsh Val 24) -24))
  167. )
  168. (defun MeCalcHslModel (Rgb / ColDta ColHue ColLum ColSat MaxVal MinVal
  169.                            TmpRgb
  170.                       )
  171.   (setq TmpRgb (mapcar
  172.                  '/
  173.                  Rgb
  174.                  '(255.0 255.0 255.0)
  175.                )
  176.         MaxVal (apply
  177.                  'max
  178.                  TmpRgb
  179.                )
  180.         MinVal (apply
  181.                  'min
  182.                  TmpRgb
  183.                )
  184.         ColDta (- MaxVal MinVal)
  185.         ColLum (/ (+ MaxVal MinVal) 2.0)
  186.         ColSat 0.0
  187.         ColHue 0.0
  188.   )
  189.   (if (/= MaxVal MinVal)
  190.     (setq ColSat (if (<= ColLum 0.5)
  191.                    (/ ColDta (+ MaxVal MinVal))
  192.                    (/ ColDta (- 2.0 MaxVal MinVal))
  193.                  )
  194.           ColHue (cond
  195.                    ((= (car TmpRgb) MaxVal)
  196.                      (/ (- (cadr TmpRgb) (caddr TmpRgb)) ColDta)
  197.                    )
  198.                    ((= (cadr TmpRgb) MaxVal)
  199.                      (+ 2.0 (/ (- (caddr TmpRgb) (car TmpRgb)) ColDta))
  200.                    )
  201.                    ((= (caddr TmpRgb) MaxVal)
  202.                      (+ 4.0 (/ (- (car TmpRgb) (cadr TmpRgb)) ColDta))
  203.                    )
  204.                  )
  205.           ColHue (* ColHue 60.0)
  206.           ColHue (if (minusp ColHue)
  207.                    (+ ColHue 360.0)
  208.                    ColHue
  209.                  )
  210.     )
  211.   )
  212.   (list (if (> ColSat 0.0)
  213.           (fix ColHue)
  214.           nil
  215.         ) (fix (* ColSat 100.0)) (fix (* ColLum 100.0))
  216.   )
  217. )
  218. ;;; ========================================================================
  219. ;;; the following code are writen by CHEN QING JUN                         ;
  220. ;;; Civil engineering Department, South China University of Technology     ;
  221. ;;; Purpose: To convert ACADs' hsl value to rgb value                      ;
  222. ;;; Note : in acad ,h max=360, s max=100 , l max=100, RGB max=255          ;
  223. ;;;        This transform function is calculated by the website easyrgb    ;
  224. ;;; Function name: hsl2rgb                                                 ;
  225. ;;; use: (hsl2rgb '(170 60 60))=> (91 214 193)                             ;
  226. ;;; 2006.03.01                                                             ;
  227. ;;; ========================================================================
  228. (defun hsl2rgb (hsllist / h s l r g b var2 var1)
  229.   (setq h (/ (nth 0 hsllist) 360.0)
  230.         s (/ (nth 1 hsllist) 100.0)
  231.         l (/ (nth 2 hsllist) 100.0)
  232.   )
  233.   (cond
  234.     ((= s 0)
  235.       (setq r (* l 255)
  236.             g (* l 255)
  237.             b (* l 255)
  238.       )
  239.     )
  240.     ((/= s 0)
  241.       (cond
  242.         ((< l 0.5)
  243.           (setq var2 (* l (1+ s)))
  244.         )
  245.         (t
  246.           (setq var2 (- (+ l s) (* s l)))
  247.         )
  248.       )
  249.       (setq var1 (- (* 2 l) var2))
  250.       (setq r (* 255 (func var1 var2 (+ h 0.33333))))
  251.       (setq g (* 255 (func var1 var2 h)))
  252.       (setq b (* 255 (func var1 var2 (- h 0.33333))))
  253.     )
  254.   )
  255.   (list (fix r) (fix g) (fix b))
  256. )
  257. (defun func (v1 v2 vh / result)
  258.   (if (< vh 0)
  259.     (setq vh (1+ vh))
  260.   )
  261.   (if (> vh 1)
  262.     (setq vh (- vh 1))
  263.   )
  264.   (cond
  265.     ((< (* 6 vh) 1)
  266.       (setq result (+ v1 (* 6 vh (- v2 v1))))
  267.     )
  268.     ((< (* 2 vh) 1)
  269.       (setq result v2)
  270.     )
  271.     ((< vh 0.66667)
  272.       (setq result (+ v1 (* 6 (- v2 v1) (- 0.666667 vh))))
  273.     )
  274.     (t
  275.       (setq result v1)
  276.     )
  277.   )
  278.   result
  279. )
  280. ;;; ========================================================================
  281. ;;; to put hsl truecolor to the last object                                ;
  282. ;;; ========================================================================
  283. (defun myputcolor (lst / a)
  284.   (setq a (vlax-ename->vla-object (entlast)))
  285.   (setq interrgb (hsl2rgb lst))
  286.   (vla-SetRGB acCmColor (nth 0 interrgb) (nth 1 interrgb) (nth 2 interrgb))
  287.   (vla-put-trueColor a acCmColor)
  288. )

  289. ;;; ========================================================================
  290. ;;; Function make_point                                                    ;
  291. ;;; Entmake a point                                                        ;
  292. ;;; ========================================================================

  293. (defun make_point (l10 color)
  294.   (ENTMAKE (LIST (CONS 0 "POINT") (cons 62 color) (cons 10 l10)))
  295. )
  296. ;;; ========================================================================
  297. ;;; Function make_solid                                                    ;
  298. ;;; Entmake a solid according the center point and 0.5 width  and color    ;
  299. ;;; ========================================================================
  300. (defun make_solid (p r color)
  301.   (entmake (list (cons 0 "SOLID") ;***
  302.                  (cons 6 "BYLAYER") ;***
  303.                  (cons 8 "0") ;***
  304.                  (cons 10 (polar (polar p 0 r) (* pi 0.5) r)) ;***
  305.                  (cons 11 (polar (polar p pi r) (* pi 0.5) r)) ;***
  306.                  (cons 12 (polar (polar p 0 r) (* pi 1.5) r)) ;***
  307.                  (cons 13 (polar (polar p pi r) (* pi 1.5) r)) ;***
  308.                  (cons 39 0.0) (cons 62 color) (cons 210 (list 0.0 0.0 1.0))
  309.            )
  310.   )
  311. )
  312. ;;; ========================================================================
  313. ;;; Function interpolate                                                   ;
  314. ;;; linear interpolation, a b is the two end number,                       ;
  315. ;;;        c is mean distance to a, d is distance mean from a to b         ;
  316. ;;;        so the result should be a+[b-a]*c/d                             ;
  317. ;;; ========================================================================
  318. (defun interpolate (a b c d / e)
  319.   (setq a (itor a)
  320.         b (itor b)
  321.         c (itor c)
  322.         d (itor d)
  323.   )
  324.   (setq e (- a (* c (/ (- a b) d))))
  325.   (setq e (fix e))
  326.   e
  327. )
  328. ;;; ========================================================================
  329. ;;; Function itor                                                          ;
  330. ;;; integer to real                                                        ;
  331. ;;; ========================================================================
  332. (defun itor (a)
  333.   (atof (itoa a))
  334. )
  335. ;;; ========================================================================
  336. ;;; Function [n,m]                                                         ;
  337. ;;; To Get a element of a two dimension list n for row ,m for column       ;
  338. ;;; n,m start from 0                                                       ;
  339. ;;; ========================================================================
  340. (defun [n,m] (a n m / i)               
  341.   (setq i (nth m (nth n a)))
  342.   i
  343. )
  344. ;;; ========================================================================
  345. ;;;   The following code taken from [url]www.theswamp.org[/url]                       ;
  346. ;;;   To calculate the time that the program run                           ;
  347. ;;; ========================================================================
  348. (defun startTimer ()
  349.   (setq time (getvar "DATE"))
  350. )
  351. (defun endTimer (func)
  352.   (setq time (- (getvar "DATE") time)
  353.         seconds (* 86400.0 (- time (fix time)))
  354.   )
  355.   (gc)
  356.   (outPut seconds func)
  357. )
  358. (defun outPut (secs def)
  359.   (princ "\nPurging...")
  360.   (command "PURGE" "Layers" "*" "N")
  361.   (gc)
  362.   (princ (strcat "\nTimed " def ": " (rtos secs 2 6)))
  363.   (princ)
  364. )
  365. (princ "\n")
  366. (prompt "\n use Julia Fractal Algorithm to draw pattern, command:tree?QJCHEN \n")



两个图片:

[iframe h=500 w=600]http://autolisper.googlepages.com/tree4.png[/iframe]
[iframe h=500 w=600]http://autolisper.googlepages.com/tree5.png[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-27 00:32:34 | 显示全部楼层
; 错误: no function definition: ACAD_TRUECOLORDLG
请将这个补上
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-26 17:01:11 | 显示全部楼层
还记得小时候玩过的一种玩具么?一个塑料板上有带内齿轮大圆形,一系列上面带有孔的小齿轮,把铅笔套在小齿轮的孔上,让小齿轮沿着大内齿轮滚动,于是,笔画出了一道漂亮的曲线。不大记得这种玩具叫什么名字了,好像叫“万花筒”?,今天才知道这种玩具的英文名叫“spirograph”,于是找了一下资料,发现外国的品种要多一些。如图所示。
[iframe h=300 w=400]http://qjchen.googlepages.com/spirograph.JPG[/iframe]

由于小时候挺喜欢这种玩具也很喜欢几何,而在学习Lisp之初,就用Lisp编了如下一段简单的小程序,最近整理东西的时候才发现,贴贴让大家娱乐一下:)

这种曲线应该和机械的有点关系,假如一个圆沿着一条直线走的话,那么圆内(不一定是圆周)某一点形成的轨迹应该叫滚轮线,似乎和悬链线及最速降线有点关系,而圆沿着一个圆周走,照查询的资料应该叫spirograph-螺旋型星云线,而若其沿着一个封闭的曲线走,应该更复杂一下,反正是按照一种等距离量测的方法在走动。

本程序简单利用参数方程的方法构建,纯属娱乐,毫无作用,见笑了:)

原理
[iframe h=500 w=600]http://qjchen.googlepages.com/HELISCOPE1.png[/iframe]



  1. ;;; ========================================================================
  2. ;;; The following code are writen by qjchen                                ;
  3. ;;; 华南理工大学 建筑学院                                                  ;
  4. ;;; [url]Http://qjchen.googlepages.com[/url]                                          ;
  5. ;;; ========================================================================
  6. (defun c:test (/ lst r1 r2 r3 r4 color alpha beta orign orignx orignyp1 p2)                        
  7.   (setq lst (getpattern)
  8.         r1 (nth 0 lst)
  9.         r2 (nth 1 lst)
  10.         r3 (nth 2 lst)
  11.         r4 (- r1 r2)
  12.         color (nth 3 lst)
  13.         alpha 0
  14.         beta 0
  15.         orign (getpoint "\n the original point:")
  16.         orignx (car orign)
  17.         origny (cadr orign)
  18.   )
  19.   (command "color" color "")
  20.   (while (< beta 314)
  21.     (setq alpha (* -1 (* beta (/ r2 (+ r4 r2)))))
  22.     (setq p1 (list (+ orignx (* r4 (cos alpha)) (* r3 (cos beta)))
  23.                        (+ origny (* r4 (sin alpha)) (* r3 (sin beta)))
  24.                        0
  25.                 )
  26.     )
  27.     (setq beta (+ beta 0.05))
  28.     (setq alpha (* -1 (* beta (/ r2 (+ r4 r2)))))
  29.     (setq p2 (list (+ orignx (* r4 (cos alpha)) (* r3 (cos beta)))
  30.                        (+ origny (* r4 (sin alpha)) (* r3 (sin beta)))
  31.                        0
  32.                 )
  33.     )
  34.     (command "line" p1 p2 "")
  35.   )
  36. )
  37. (defun getpattern (/ kword pattern pattern1)
  38.   (initget "1 2 3 4 5 6 7 8 9 10")
  39.   (setq kword (getkword "\n please select the type: 1/2/3/4/5/6/7/8/9/10:"))
  40.   (cond
  41.     ((= kword "1")
  42.       (setq res (list 20.0 14.3 7 1))
  43.     )
  44.     ((= kword "2")
  45.       (setq res (list 20.0 14.3 15 2))
  46.     )
  47.     ((= kword "3")
  48.       (setq res (list 20.0 10.3 5 3))
  49.     )
  50.     ((= kword "4")
  51.       (setq res (list 20.0 12 8 4))
  52.     )
  53.     ((= kword "5")
  54.       (setq res (list 20.0 9 1 5))
  55.     )
  56.     ((= kword "6")
  57.       (setq res (list 20.0 9 5 131))
  58.     )
  59.     ((= kword "7")
  60.       (setq res (list 20.0 9 7 30))
  61.     )
  62.     ((= kword "8")
  63.       (setq res (list 20.0 8 5 220))
  64.     )
  65.     ((= kword "9")
  66.       (setq res (list 20.0 5.2 4.2 170))
  67.     )
  68.     ((= kword "10")
  69.       (setq res (list 20.0 5.2 2.2 140))
  70.     )
  71.   )
  72.   res
  73. )



效果
[iframe h=500 w=600]http://qjchen.googlepages.com/HELISCOPE.png[/iframe]

修改一下,改成变颜色和画圆,得到如下的结果和图形

  1. ;;; ========================================================================
  2. ;;; The following code are writen by qjchen                                ;
  3. ;;; 华南理工大学 建筑学院                                                  ;
  4. ;;; [url]Http://qjchen.googlepages.com[/url]                                          ;
  5. ;;; ========================================================================

  6. (defun c:test1 (/ lst r1 r2 r3 rad color alpha beta orign orignx orignyp1
  7.              p2 rep add)
  8.   (setq lst    (getpattern1)
  9.         r1     (nth 0 lst)
  10.         r2     (nth 1 lst)
  11.         r3     (nth 2 lst)
  12.         rad    (nth 3 lst)
  13.         rep    (nth 4 lst)
  14.         add    (nth 5 lst)
  15.         alpha  0
  16.         beta   0
  17.         orign  (getpoint "\n the original point:")
  18.         orignx (car orign)
  19.         origny (cadr orign)
  20.   )
  21.   (entmake (list (cons 0 "CIRCLE")      
  22.                  (cons 6 "BYLAYER")
  23.                  (cons 8 "0")
  24.                  (cons 10 orign)        
  25.                  (cons 40 r1)           
  26.                  (cons 62 8)
  27.            )
  28.   )
  29.   (setq i 1)
  30.   (setq color 10)
  31.   (command "color" color "")
  32.   (while (< beta rep)
  33.     (if (> beta (* add i))
  34.       (progn
  35.         (setq i (+ i 1))
  36.         (setq color (+ color 10))
  37.         (command "color" color "")
  38.       )
  39.     )
  40.     (setq alpha (* -1 (* beta (/ r2 (+ r1 r2)))))
  41.     (setq x1 (+ orignx (* r1 (cos alpha)) (* r3 (cos beta))))
  42.     (setq y1 (+ origny (* r1 (sin alpha)) (* r3 (sin beta))))
  43.     (setq p1 (list x1 y1 0.0))
  44.     (setq beta (+ beta 0.05))
  45.     (entmake (list (cons 0 "CIRCLE")   
  46.                    (cons 6 "BYLAYER")
  47.                    (cons 8 "0")
  48.                    (cons 10 p1)         
  49.                    (cons 40 rad)        
  50.                    (cons 62 color)
  51.              )
  52.     )
  53.                                        
  54.   )
  55. )
  56. (defun getpattern1 (/ kword pattern pattern1)
  57.   (initget "1 2")
  58.   (setq kword (getkword "\n please select the type: 1/2:"))
  59.   (cond
  60.     ((= kword "1")
  61.      (setq res (list 20.0 14.3 7 0.2 75.2 3.14))
  62.     )
  63.     ((= kword "2")
  64.      (setq res (list 20.0 15 15 1 44 2.14))
  65.     )
  66.   )
  67.   res
  68. )



效果:

[iframe h=500 w=600]http://qjchen.googlepages.com/HELISCOPE3.png[/iframe]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2006-10-26 20:32:40 | 显示全部楼层
我想在哪里看过
http://140.137.123.37/classes/ca ... Lisp/FractalLsp.htm

还有一个也是lisp,但不是autocad的lisp
http://coding.derkeiler.com/Arch ... p/2004-08/1920.html
样子图例
http://www.biologie.uni-hamburg.de/b-online/e28_3/lsys.html
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-11-29 22:08:08 | 显示全部楼层
snoopychen 真是超级的厉害啊!这么神奇的东东也做的出来~
刚不久看了一个分形的书,感觉到了分形的魅力实在是太强了!
我好想好想学习啊!实中对逃逸时间算法不很了解
帮忙请你详尽解释一下:逃逸时间算法,是什么原理呢?
非常感谢!
依样画葫芦搞了个mandelbrot集的生成
:由于没有用真TRUECOLOR可能效果不太好~请多指教
不过看看样子也罢了!~

  1. (defun z* (a b)
  2.   (list        (- (* (car a) (car b)) (* (cadr a) (cadr b)))
  3.         (+ (* (car a) (cadr b)) (* (cadr a) (car b)))
  4.   )
  5. )
  6. (defun z+ (a b) (mapcar '+ a b))
  7. (defun c:tt ()
  8.   (setq        minx -2.5
  9.         miny -1.5
  10.         maxx 1.5
  11.         maxy 1.5
  12.         nx   400
  13.         ny   300
  14.   )
  15.   (setq        dax (/ (- maxx minx) nx)
  16.         day (/ (- maxy miny) ny)
  17.   )
  18.   (setq xi 0)
  19.   (repeat nx
  20.     (setq x (+ minx (* xi dax)))
  21.     (setq xi (1+ xi))
  22.     (setq yi 0)
  23.     (repeat ny
  24.       (setq y (+ miny (* yi day)))
  25.       (setq yi (1+ yi))
  26.       (setq z '(0.0 0.0))
  27.       (setq col 0)
  28.       (while (and (< col 255)
  29.                   (< (distance z '(0 0)) 1000)
  30.              )
  31.         (setq col (1+ col))
  32.         (setq z (z+ (z* z z) (list x y)))
  33.       )
  34.       (entmake (list '(0 . "point")
  35.                      (cons 62 col)
  36.                      (list 10 x y)
  37.                )
  38.       )
  39.     )
  40.   )
  41. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-5 08:30:04 | 显示全部楼层
谢谢fsxm分享,从你一直以来的程序我也学到了很多:)

其实对于逃逸时间算法,我也没有太懂,应该就是某些复数,经过一些迭代的算法之后,有些可以收敛,有些不能收敛。根据是否收敛,判断其是否属于分形中的点与否。

感觉AUTOCAD对于线,点来做分形还挺好,希望有空也再学点OPENGL等来使效果更好一些。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-1 18:34 , Processed in 0.553737 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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