查找最高和最低ma
你好在我的画作中有200个基本元素“点”,我如何快速找到它们中的最高点和最低点? 你好
通过检索每个点的坐标,然后用它们的最大Y坐标对它们进行排序,很容易做到这一点,最后列表中的第一个和最后一个项目将是最高和最低的。 如果已将点汇编为列表,则
(apply 'max (mapcar 'caddr pt_list))
(apply 'min (mapcar 'caddr pt_list))
还有其他几种方法可用-大卫 当试图确定点集的极值时,应避免排序,因为该集只需处理一次。因此,这可以以O(n)效率执行,而排序通常按O(n log n)的顺序进行。
因此,我建议如下:
(defun maxmin ( lst / mni mxa zco zmi zmx )
(setq mni (car lst) zmi (caddr mni) mxa mni zmx zmi)
(foreachitm (cdr lst)
(setq zco (caddr itm))
(cond
( (< zmx zco)
(setq mxa itm zmx zco)
)
( (< zco zmi)
(setq mni itm zmi zco)
)
)
)
(list mni mxa)
)
在命令提示下出现错误:参数太少(() 为我工作
(SETQ LST (LIST (LIST 10 20 30)(LIST 20 20 20)(LIST 10 10 100)))
(maxmin lst)
该函数用于其他程序,不定义AutoCAD命令。 令人敬畏(有效)的功能Lee,
刚想出来:
为什么不使用相同的算法编写更全局的东西,例如接受函数和列表参数(就像vl排序),即:
(foo (lambda (r x) (< r x)) '(3 8 9 1 5 6 2 7) )
-> 1
其中,lambda是一个测试函数,采用两个参数进行比较:
r-要退回的项目
x-比较项 感谢Grrr-对于泛型函数,请考虑以下内容:
(defun extremum ( cmp lst / rtn )
(setq rtn (car lst))
(foreach itm (cdr lst)
(if (apply cmp (list itm rtn)) (setq rtn itm))
)
rtn
)
_$ (extremum '< '(3 8 9 1 5 6 2 7))
1
_$ (extremum '(lambda ( a b ) (< (caddr a) (caddr b))) '((1.2 5.7 8.3) (9.4 2.6 0.3) (5.7 6.6 7.2)))
(9.4 2.6 0.3) 或递归:
(defun extremum ( cmp lst )
( (lambda ( foo ) (if (cdr lst) (foo (car lst) (extremum cmp (cdr lst))) (car lst)))
(lambda ( a b ) (if (apply cmp (list a b)) a b))
)
)
页:
[1]
2