masterlong
发表于 2022-2-26 14:33:38
cddr = cdr+cdr
cdr属于200系列的话
这个cddr其实应该也属于200的延伸吧
baitang36
发表于 2022-2-26 14:44:39
masterlong 发表于 2022-2-26 14:33
cddr = cdr+cdr
cdr属于200系列的话
用lisp来延伸
baitang36
发表于 2022-2-26 15:23:08
先睹为快,后读免费。没币的朋友在这里下载
明_明
发表于 2022-3-1 11:50:08
感谢分享好资料!以后使用的时候就知用得上.
尘缘一生
发表于 2022-3-2 01:08:16
baitang36 发表于 2022-2-26 14:44
用lisp来延伸
[*];;Graham扫描法求凸包
[*](defun graham-scan (ptlist / hullpt maxXpt sortPt P Q)
[*](if (< (length ptlist) 3) ;3点以下
[*] ptlist ;是本集合
[*] (progn
[*] (setq maxXpt (assoc (apply 'max (mapcar 'car ptlist)) ptlist));最右边的点
[*] (setq sortPt (sort-by-angle-distance ptlist maxXpt)) ;分类点集
[*] (setq hullPt (list (cadr sortPt) maxXpt)) ;开始的两点
[*] (foreach &n (cddr sortPt) ;从第3点开始
[*] (setq hullPt (cons &n HullPt)) ;把Pi加入到凸集
[*] (setq P (cadr hullPt)) ;Pi-1
[*] (setq Q (caddr hullPt)) ;Pi-2
[*] (while (and q (> (det &n P Q) -1e-6)) ;如果左转
[*] (setq hullPt (cons &n (cddr hullPt))) ;删除Pi-1点
[*] (setq P (cadr hullPt)) ;得到新的Pi-1点
[*] (setq Q (caddr hullPt)) ;得到新的Pi-2点
[*] )
[*] )
[*] (reverse hullpt);返回凸集
[*] )
[*])
[*])
把CDDR 改写快点的话,如何改写?
mokson
发表于 2022-3-2 08:22:16
高手总是有太多的方法
baitang36
发表于 2022-3-2 08:23:50
尘缘一生 发表于 2022-3-2 01:08
[*];;Graham扫描法求凸包
[*](defun graham-scan (ptlist / hullpt maxXpt sortPt P Q)
[*](if (<...
cddr的lisp源码是(defun cddr(x)(cdr (cdr x)))
cddr的fas码是 14 01 01 01 00 05 00 29 29 16
如果cddr直接写成(cdr (cdr x))应该能快一点,因为省去了14 和16指令的执行时间,参数传递的时间也节省了。
我没测试过,你可以弄个测试程序看看有多大差别。
baitang36
发表于 2022-3-2 08:35:38
masterlong 发表于 2022-2-26 14:33
cddr = cdr+cdr
cdr属于200系列的话
所有的lisp函数层层调用,最终都是调用的200系列函数,这些函数再调用windows系统的api,如果lisp直接调用api那会是最快的。
guosheyang
发表于 2022-3-2 10:18:17
看了下 repeatwhile foreach vlax-formapcar 等循环函数都是4系列的 请问有无非4系列的循环函数或者不用这几个如何实现循环呢? 谢谢!
baitang36
发表于 2022-3-2 17:03:34
guosheyang 发表于 2022-3-2 10:18
看了下 repeatwhile foreach vlax-formapcar 等循环函数都是4系列的 请问有无非4系列的循 ...
这几个都是lsp源码加载时用的,fas没有循环函数的