找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: e2002

[推荐]:AutoCAD, VisualLISP与分形几何学

[复制链接]

已领礼包: 23个

财富等级: 恭喜发财

 楼主| 发表于 2002-4-30 09:23:33 | 显示全部楼层
分形几何: 这是一门匪夷所思的精深科学....

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

使用道具 举报

发表于 2002-4-30 09:48:26 | 显示全部楼层

好像还是不对,出错情况差不多

程序如下,图上桔红圆圈处是第一个出错点


  1. [FONT=courier new]
  2. (defun c:cc (/ cshape pt1 pt2 ang oldvar)

  3.   (defun cshape        (p1 p2 ang)
  4.     (if        (> (distance p1 p2) 10.0)
  5.       (progn
  6.         (setq p3 (polar        p1
  7.                         (+ ang (angle p1 p2))
  8.                         (* (distance p1 p2) (abs (/ 0.5 (cos ang))))
  9.                  )
  10.         )
  11.         (command "pline" p1 p3 p2 pause "")
  12.         (cshape p1 p3 ang)
  13.         (cshape p3 p2 ang)
  14.       )
  15.     )        p3                                ;end if
  16.   )                                        ;end defun cshape

  17.   ;;main
  18.   (setq p1 (getpoint "\n first point"))
  19.   (setq
  20.     p2        (getpoint p1 "\n second point(最终收敛值为10,请注意长度):")
  21.   )
  22.   (setq ang (getangle "\n angle(not equal 60.0 degree: "))
  23.   (setq oldvar (getvar "OSMODE"))
  24.   (setvar "OSMODE" 0)
  25.   (setq p3 (cshape p1 p2 ang))
  26.   (setvar "OSMODE" oldvar)
  27.   (princ)
  28. )                                        ;end defun c:cc

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

使用道具 举报

发表于 2002-4-30 09:50:39 | 显示全部楼层

书上给出的代码

可以避免这样的错误,但是运行不到底,我再跟踪看看

名稱:  C Shape碎形
作者:  林峰田
輸入:  以滑鼠輸入二個點
主要變數:
tobe        待生成頂點之線段端點座標串列
d        最小點距,點陣解析度(結束要件)
主要原理:
1.給予二點,利用polar指令,計算以上述二點為底之直角等腰三角形之頂點.
2.以tobe串列紀錄待計算之底邊
3.subcshape為遞迴函式,以d及tobe為結束條件     |;


(defun subcshape(p1 p2)
        (setq ang (+ (/ PI 4) (angle p1 p2)))
        (setq d (/ (* (sqrt 2) (distance p1 p2)) 2))
        (princ "d = ")
        (princ d)
        (princ "\n")
        (setq p3 (polar p1 ang d))
        (command "point" p3 "")
        (if (> d 1.0)
                (progn
                        (setq tobe (cons p2 tobe))
                        (setq tobe (cons p3 tobe))
                        (setq tobe (cons p3 tobe))
                        (setq tobe (cons p1 tobe))
                )
        )
(princ "length of tobe = ")
(princ (length tobe))
;(princ "\n")

        (if (> (length tobe) 0)
                (progn
                        (setq a (car tobe))
                        (setq b (cadr tobe))
                        (setq tobe (cddr tobe))

(princ "   ;length of tobe2 = ")
(princ (length tobe))
(princ "\n")


                        (subcshape a b)

                )
        )
)




(defun c:Cshape()

             (gc);garbage collection
             (command "erase" "all" "");clean the screen
        (command "pdmode" "0" "");set point style

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-30 09:53:04 | 显示全部楼层

Re: 好像还是不对,出错情况差不多

最初由 liver 发布
[B]程序如下,图上桔红圆圈处是第一个出错点

[(defun c:cc (/ cshape pt1 pt2 ang oldvar)

  (defun cshape        (p1 p2 ang)
    (if        (> (distance p1 p2) 10.0)
      (progn
        (setq p... [/B]



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

使用道具 举报

发表于 2002-4-30 10:06:03 | 显示全部楼层

嗯,我改了一下

出错点还在原来的位置,后来我把下面一句也改成
(setq p3 (cshape p3 p2 ang))
还是原来的样子,现在程序如下:


(defun c:cc (/ cshape pt1 pt2 ang oldvar)

  (defun cshape        (p1 p2 ang)
    (if        (> (distance p1 p2) 10.0)
      (progn
        (setq p3 (polar        p1
                        (+ ang (angle p1 p2))
                        (* (distance p1 p2) (abs (/ 0.5 (cos ang))))
                 )
        )
        (command "pline" p1 p3 p2 pause "")
        (setq p3 (cshape p1 p3 ang))
        (setq p3 (cshape p3 p2 ang))
      )
    )        p3                                ;end if
  )                                        ;end defun cshape

  ;;main
  (setq p1 (getpoint "\n first point"))
  (setq
    p2        (getpoint p1 "\n second point(最终收敛值为10,请注意长度):")
  )
  (setq ang (getangle "\n angle(not equal 60.0 degree: "))
  (setq oldvar (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setq p3 (cshape p1 p2 ang))
  (setvar "OSMODE" oldvar)
  (princ)
)                                        ;end defun c:cc

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

使用道具 举报

发表于 2002-4-30 10:14:11 | 显示全部楼层

我看了一下林峰田的程序

他是把所有计算出来的值放在集合里面再一一取出
这样大概能够确保一层递归结束後返回正确的值

但是居然会断在中间,初始两点距离为11时还是对的,到12就错了
左边distance=11,右边distance=12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-30 10:16:37 | 显示全部楼层

今天到此结束

我要走了,byebye

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-30 10:19:23 | 显示全部楼层
下面图是我的运行结果,没有错误啊

程序代码是:

  1. [FONT=courier new]
  2. (defun c:cc (/ cshape pt1 pt2 ang oldvar)

  3.   (defun cshape (p1 p2 ang)
  4.     (if (> (distance p1 p2) 10.0)
  5.       (progn
  6.         (setq p3 (polar p1 (+ ang (angle p1 p2)) (* (distance p1 p2)
  7.                                                     (abs (/ 0.5
  8.                                                             (cos ang)
  9.                                                          )
  10.                                                     )
  11.                                                  )
  12.                  )
  13.         )
  14.         (command "pline" p1 p3 p2 "")
  15.         (setq p3 (cshape p1 p3 ang))
  16.         (cshape p3 p2 ang)
  17.         p3
  18.       )
  19.     )                                       ; end if

  20.   )                                       ; end defun cshape

  21.   ;; main
  22.   (setq p1 (getpoint "\n first point"))
  23.   (setq p2 (getpoint p1 "\n second point(最终收敛值为10,请注意长度):"))
  24.   (setq ang (getangle "\n angle(not equal 60.0 degree: "))
  25.   (setq oldvar (getvar "OSMODE"))
  26.   (setvar "OSMODE" 0)
  27.   (setq p3 (cshape p1 p2 ang))
  28.   (setvar "OSMODE" oldvar)
  29.   (princ)
  30. )
  31. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-30 10:36:11 | 显示全部楼层
LISP的“递归”肯定是没有问题的,任何一个语言的递归中的变量的变化也不能影响到外部。

因为“递归”使用的是“栈”,是个临时存储区,递归的时候,要保存现场,即把当前的变量等值入栈。

递归完成后,要恢复现场和清除递归时候的内部的变量使用的“栈”,返回后,所有递归前的变量保持不变。所以递归时候的变量P3始终是外面的值,递归不能修改它。

解决方法就是使用函数的返回值或者用个“堆”中的全局变量表储存递过内部的变化。

在其他语言中,比如C,C++,除了用函数返回值外,如果需要多个修改的变量,那么还可以使用指针,传递给函数的是变量内存的地址,这也是C灵活的,最高效的地方。
可惜的是LISP没有“指针”传递,所以一个变量变化可以用“返回值”来保存。多个,就要建立个全局表。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-4-30 23:36:14 | 显示全部楼层

xd,正确的图形应该是这样的

你现在的程序只完成了一半都不到,请看:
螺旋线旋到底还要出来呢,
我的天,在网上讨论问题太困难了
大概你并没有去abbs看我的原贴
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-30 23:39:23 | 显示全部楼层
在LISP中,递归要返回多个值,可以使用LISP的全局表来模拟入栈和出栈的操作。

在递归函数里面 把要保存的数据LIST后,CONS加入到全局表头(入栈)。在递归外面用CAR使用保存的数据,然后CDR全局表,弹出栈顶元素。

这样就可以不管递归多少层,都可以用一个很小的全局表来保存我们需要的数据了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-30 23:45:02 | 显示全部楼层

Re: xd,正确的图形应该是这样的

最初由 liver 发布
[B]你现在的程序只完成了一半都不到,请看:
螺旋线旋到底还要出来呢,
我的天,在网上讨论问题太困难了
大概你并没有去abbs看我的原贴 [/B]


ABBS我很少去,还没有仔细看全部程序的算法,我只是看你昨天讨论那个地方图有问题,讨论递归,我只是看了我画的图和你不同,就贴出来了。你说程序执行到这个地方,接着还要画什么地方?是程序的那行代码执行完能画到这个地方?

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

使用道具 举报

发表于 2002-4-30 23:55:39 | 显示全部楼层

是的,林峰田正是这么解决的

cchape是不断由两个点p1, p2推出第三点p3,但是一旦推出第三点p3就出来两组新变量(p1 p3)和(p3 p2),分别由(p1 p3)和(p3 p2)推出自己的第三点,于是形成一个很复杂的图案.你现在的程序只是在不断进行(p1 p3)的计算而(p3 p2)由于出错而终止,所以出现的只是一个旋转的图案,而且应该有出错信息,不是正常程序结束时的返回值,

我运行了一下出错信息显示的是:

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-4-30 23:59:31 | 显示全部楼层

Re: 是的,林峰田正是这么解决的

最初由 liver 发布
[B]cchape是不断由两个点p1, p2推出第三点p3,但是一旦推出第三点p3就出来两组新变量(p1 p3)和(p3 p2),分别由(p1 p3)和(p3 p2)推出自己的第三点,于是形成一个很复杂的图案.你现在的程序只是在不断进行(p1 p3)的计算而(p3... [/B]


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 12:32 , Processed in 0.377359 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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