sathalex 发表于 2022-7-5 16:27:13

查找最高和最低ma

你好
在我的画作中有200个基本元素“点”,我如何快速找到它们中的最高点和最低点?

Tharwat 发表于 2022-7-5 16:38:09

你好
 
通过检索每个点的坐标,然后用它们的最大Y坐标对它们进行排序,很容易做到这一点,最后列表中的第一个和最后一个项目将是最高和最低的。

David Bethel 发表于 2022-7-5 16:41:25

如果已将点汇编为列表,则

(apply 'max (mapcar 'caddr pt_list))
(apply 'min (mapcar 'caddr pt_list))

 
还有其他几种方法可用-大卫

Lee Mac 发表于 2022-7-5 16:48:45

当试图确定点集的极值时,应避免排序,因为该集只需处理一次。因此,这可以以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)
)

sathalex 发表于 2022-7-5 16:51:31

 
在命令提示下出现错误:参数太少(()

BIGAL 发表于 2022-7-5 16:58:26

为我工作
 

(SETQ LST (LIST (LIST 10 20 30)(LIST 20 20 20)(LIST 10 10 100)))
(maxmin lst)

Lee Mac 发表于 2022-7-5 17:04:29

 
该函数用于其他程序,不定义AutoCAD命令。

Grrr 发表于 2022-7-5 17:10:11

令人敬畏(有效)的功能Lee,
刚想出来:
为什么不使用相同的算法编写更全局的东西,例如接受函数和列表参数(就像vl排序),即:
 

(foo (lambda (r x) (< r x)) '(3 8 9 1 5 6 2 7) )
-> 1

 
其中,lambda是一个测试函数,采用两个参数进行比较:
r-要退回的项目
x-比较项

Lee Mac 发表于 2022-7-5 17:13:03

感谢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)

Lee Mac 发表于 2022-7-5 17:20:51

或递归:
(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
查看完整版本: 查找最高和最低ma