乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 71|回复: 16

[编程交流] 分形播放

[复制链接]

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-5 16:53:43 | 显示全部楼层 |阅读模式
第一个Lisp只是一个经典示例:
  1. (defun c:fract3( / a b c)
  2.    (defun mid(a b)
  3.      (mapcar '* (mapcar '+ a b) '(0.5 0.5 0.5))
  4.      )
  5.    (defun draw(a b c)
  6.      (entmake (list '(0 . "LINE") (cons 10 a) (cons 11 b)))
  7.      (entmake (list '(0 . "LINE") (cons 10 b) (cons 11 c)))
  8.      (entmake (list '(0 . "LINE") (cons 10 c) (cons 11 a)))
  9.      (if (< 0.1 (distance a b))
  10.        (progn
  11.              (draw a (mid a b) (mid c a))
  12.              (draw (mid a b) b (mid b c))
  13.              (draw (mid b c) (mid c a) c)
  14.              )
  15.        )
  16.      )
  17.    (setq a (polar '(0 0 0) (/ PI 2) 25)
  18.              b (polar '(0 0 0) (/ (* PI 7) 6) 25)
  19.              c (polar '(0 0 0) (/ PI -6) 25)
  20.              )
  21.    (draw a b c)
  22.    )

它使用递归绘制越来越多的线,形成越来越小的三角形。当要绘制的线变小为0.1个绘制单位时,它停止。我自己也想知道这个程序有多短——这证明了Lisp的强大。
 
第二个程序:我开始的时候脑海里有一个折线符号。这次我放弃了递归,用户可以控制递归的深度。它从一条线开始,在树上断开。第一行保留作为参考(绿色的一行),程序每次运行都会打断在上一步生成的所有行。有一个声明为全局变量的列表,用于在程序运行之间保存数据。如何使用:加载程序并首先运行。之后可能需要缩放。再运行一次程序,再运行一次…只需按空格键即可进入下一个级别。
  1. (defun subdiv(e)
  2.    (setq fx 0.4 fa 0.5)
  3.    (setq el (entget e)
  4.              a (cdr (assoc 10 el))
  5.              b (cdr (assoc 11 el))
  6.              d1 (distance a b)
  7.              a1 (angle a b)
  8.              a2 (angle b a)
  9.              )
  10.    (entmake (list '(0 . "LINE") (cons 10 a) (cons 11 (setq c (polar a (+ a1 fa) (* d1 fx))))))
  11.    (setq l1 (cons (entlast) l1))
  12.    (entmake (list '(0 . "LINE") (cons 10 c) (cons 11 (setq d (polar b (+ a2 fa) (* d1 fx))))))
  13.    (setq l1 (cons (entlast) l1))
  14.    (entmake (list '(0 . "LINE") (cons 10 d) (cons 11 b)))
  15.    (setq l1 (cons (entlast) l1))
  16.    (entdel e)
  17.    )
  18. (defun c:fract( / e l1)
  19.    (if (not l) (progn
  20.                          (entmake (list '(0 . "LINE") '(10 0 0 0) '(11 100 0 0) '(62 . 3)))
  21.                          (entmake (list '(0 . "LINE") '(10 0 0 0) '(11 100 0 0)))
  22.                          (setq l (list (entlast)))
  23.                          ))
  24.    (setq l1 nil)
  25.    (foreach e l (subdiv e))
  26.    (setq l l1)
  27.    )

 
 
 
我认为在两次运行之间保留行列表不是一个好做法,因此这里是第三个lisp。它画了一条线,但实际上是一个块。与上一个程序一样,使用它可以在图形中插入越来越多的块。也许你会问为什么我只用一个方块来画一条简单的线。嗯,在我得到第一个图像后,我简单地编辑了块,AutoCAD将我发布在这里的内容作为下一个图像返回。(我手动将第一个块更改为绿色,只是为了更好地显示我的意思)。
  1. (defun c:tree()
  2.    (defun insert (p ang dim)
  3.      (entmake (list (cons 0 "INSERT") '(2 . "X") (cons 10 p) (cons 41 dim) (cons 42 dim) (cons 43 dim) (cons 50 ang)))
  4.      )
  5.    (setq sc 0.58 ang1 0.75 ang2 0.6 pz1 0.85 pz2 0.65)
  6.   
  7.    (if (not (tblsearch "block" "x"))
  8.      (progn
  9.        (entmake (list '(0 . "BLOCK") '(100 . "AcDbEntity") '(67 . 0) '(8 . "0")
  10.                               '(100 . "AcDbBlockBegin") '(70 . 0) '(10 0 0 0) '(2 . "x") '(1 . "")))
  11.        (entmake (list '(0 . "LINE") '(10 0 0 0) '(11 1 0 0)))
  12.        (entmake '((0 . "EndBlk") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbBlockEnd")))
  13.        (entmake '((0 . "INSERT") (2 . "x") (10 0 0 0) (41 . 1) (42 . 1) (43 . 1) (50 . 0)))
  14.        )
  15.      (progn
  16.        (setq ss (ssget "X" (list '(0 . "INSERT") '(2 . "X"))) i (sslength ss))
  17.        (repeat i
  18.              (setq el (entget (ssname ss (setq i (1- i))))
  19.                    p (cdr (assoc 10 el))
  20.                    ang (cdr (assoc 50 el))
  21.                    dim (cdr (assoc 41 el))
  22.                    )
  23.              (insert (polar p ang (* dim pz1)) (+ ang ang1) (* dim sc))
  24.              (insert (polar p ang (* dim pz2)) (- ang ang2) (* dim sc))
  25.              )
  26.        )
  27.      )
  28.    )

最后一个Lisp用于在三维中移动。运行一次。如果需要,对模型进行着色(线框看起来不太好看),缩放和动态观察以捕捉良好的角度。现在一次又一次地运行程序……直到你的电脑自动挂断。
 
  1. (defun blmake( / p1 p2 p3 p4)
  2.    (setq p1 '(0 0 0) p2 '( 1 0 0)
  3.              p3 (list 0.5 (/ (sqrt 3) 2) 0)
  4.              p4 (list 0.5 (/ (sqrt 3) 6) (/ (sqrt 6) 3))
  5.              )
  6.    (entmake (list '(0 . "BLOCK") '(100 . "AcDbEntity") '(67 . 0) '(8 . "0")
  7.                           '(100 . "AcDbBlockBegin") '(70 . 0) '(10 0 0 0)
  8.                           '(2 . "Thetraedron") '(1 . "")))
  9.    (entmake (list '(0 . "3DFACE") (cons 10 p1) (cons 11 p2) (cons 12 p3) (cons 13 p4)))
  10.    (entmake (list '(0 . "3DFACE") (cons 10 p2) (cons 11 p1) (cons 12 p4) (cons 13 p3)))
  11.    (entmake '((0 . "EndBlk") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbBlockEnd")))
  12.    )
  13.   
  14.       
  15. (defun subdiv(e l / ip ins)
  16.    (setq ip (cdr (assoc 10 (entget e))))
  17.    (setq ins (list ip
  18.                            (mapcar '+ ip (list (+ l l) 0 0))
  19.                            (mapcar '+ ip (list (/ l 1.0) (/ (* l (sqrt 3.0)) 1.0) 0))
  20.                            (mapcar '+ ip (list (/ l 1.0) (/ (* l (sqrt 3.0)) 3.0) (/ (* l (sqrt 6.0)) 1.5)))
  21.                            )
  22.              )
  23.    (foreach a ins
  24.      (entmake (list '(0 . "INSERT") '(2 . "Thetraedron") (cons 10 a) (cons 41 (* 2 l)) (cons 42 (* 2 l)) (cons 43 (* 2 l))))
  25.      )
  26.    (entdel e)
  27.    )
  28. (defun c:fract3d( / i ss)
  29.    (if (not (tblsearch "block" "thetraedron"))
  30.      (progn
  31.        (blmake)
  32.        (setq l 1.0 iter -1)
  33.        (entmake '((0 . "INSERT") (2 . "Thetraedron") (10 0 0 0) (41 . 2) (42 . 2) (43 . 2)))
  34.        )
  35.      (progn
  36.        (setq l (/ l 2.0))
  37.        (setq ss (ssget "X" (list (cons 0 "INSERT"))))
  38.        (setq i (sslength ss))
  39.        (repeat i
  40.              (subdiv (ssname ss (setq i (1- i))) l)
  41.              )
  42.        )
  43.      )
  44.    (itoa (setq iter (1+ iter)))
  45.    )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:01:14 | 显示全部楼层
干得好Fuccaro!真的很有趣
 
你可能也对这个和这个感兴趣
 
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-5 17:04:32 | 显示全部楼层
谢谢你,李。我以前见过那些大师级的职位。这是我的业余尝试。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:05:15 | 显示全部楼层
 
谢谢Fuccaro,但你的帖子一点也不业余——你的3D Sierpinski三角形令人印象深刻
回复

使用道具 举报

3

主题

18

帖子

15

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 17:11:34 | 显示全部楼层
李-我查看了你在这个帖子中附加的链接,它们确实令人印象深刻。我想知道你是否浏览过保罗·尼兰德的网站。里面塞满了有趣的东西。他似乎用mathematica生成分形。http://bugman123.com/index.html
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:15:22 | 显示全部楼层
真的很好!谢谢Steven
 
忘了也包括这条线-数学的另一个有趣的领域
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-5 17:17:55 | 显示全部楼层
你好
我找到了我的旧玩具,又Lisp程序了。我使用了相同的程序,并做了一些小改动,以获得这些图像:

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

以下是程序:
  1. (defun c:cir( / O R)
  2. (setq O (list 0 0 0)
  3.    R 100.0)
  4. (draw1 O R)
  5. )
  6. (defun draw1(o r / ls i)
  7. (setq i 0 ls nil)
  8. (repeat 4
  9.    (setq ls (cons (cons 42 -0.414214) ls))
  10.    (setq ls (cons (cons 10 (polar o (* (setq i (1+ i)) PI 0.5) r)) ls))
  11.    )
  12. (setq ls (cons '(0 . "LWPOLYLINE") (cons '(100 . "AcDbEntity") (cons '(100 . "AcDbPolyline") (cons  '(90 . 4) (cons '(70 . 1) ls))))))
  13. (entmake ls)
  14. (if (> r 10) (progn
  15.         (draw1 (polar o Pi (/ r 2.0)) (/ r 2.0))
  16.         (draw1 (polar o 0 (/ r 2.0)) (/ r 2.0))
  17.         ))
  18. )

 
以及即将到来的情人节的特殊变化:

                               
登录/注册后可看大图

这是最后一个图像的程序:
  1. (defun c:cir( / O R)
  2. (setq O (list 0 0 0)
  3.    R 200.0)
  4. (draw1 O R)
  5. )
  6. (defun draw1(o r / ls i)
  7. (setq i 0 ls nil)
  8. (repeat 4
  9.    (setq ls (cons (cons 42 (fix (* -0.5 (+ 2 (* 1.5 (cos (* 0.4 i PI))))))) ls))
  10.    (setq ls (cons (cons 10 (polar o (* (setq i (1+ i)) PI 0.5) r)) ls))
  11.    )
  12. (setq ls (cons '(0 . "LWPOLYLINE") (cons '(100 . "AcDbEntity") (cons '(100 . "AcDbPolyline") (cons  '(90 . 4) (cons '(70 . 1) ls))))))
  13. (entmake ls)
  14. (if (> r 30) (progn
  15.         (draw1 (polar o Pi (/ r 2.0)) (/ r 2.0))
  16.         (draw1 (polar o 0 (/ r 2.0)) (/ r 2.0))
  17.         ))
  18. )

175357dndzco8o8o7lrqnn.png
175358r87bak8d7a8xoxej.png
175359m1sddsq8dsq1as81.png
175400u02v43u1sd3ez11v.png
回复

使用道具 举报

13

主题

64

帖子

51

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-5 17:23:02 | 显示全部楼层
很不错的。。。。。坚持下去。。。。
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-5 17:27:30 | 显示全部楼层
大家好!
我有一些时间,所以我为这个Julia集写了一个Lisp。我不能上传这里的动画gif,所以这里有一些图像在放大。

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:29:49 | 显示全部楼层
干得好fuccaro!
 
你用什么物体来显示分形?
 
(我使用点对象来形成图像,缩放比例为每像素一个点)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-3 18:05 , Processed in 0.999941 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表