您的代码:
返回按z坐标递增排序的点列表。
但是,while循环(仅考虑第一个示例)永远不会计算测试表达式后面的表达式:
由于测试表达式将在第一次评估时返回nil:“而第一项的z坐标大于或等于第二项的z坐标”。只有当列表中的项具有相等的整数z坐标时,该语句才为真(因为列表是按z坐标值的递增顺序排序的,并且由于双精度浮点格式,double很少真正相等)。
然而,由于您正在寻找给定排序标准的极值,因此不需要排序(我们不关心剩余值的顺序),因此,代码可以变成:
示例:
(defun getminmax ( lst / maz miz rtn zco )
(setq rtn (list (list (car lst)) (list (car lst)))
miz (caddar lst)
maz miz
)
(foreach itm (cdr lst)
(setq zco (caddr itm))
(cond
( (equal miz zco 1e-
(setq rtn (cons (cons itm (car rtn)) (cdr rtn)))
)
( (equal maz zco 1e-
(setq rtn (reverse (cons (cons itm (cadr rtn)) (cdr (reverse rtn)))))
)
( (< (caddr itm) miz)
(setq rtn (cons (list itm) (cdr rtn))
miz zco
)
)
( (< maz (caddr itm))
(setq rtn (reverse (cons (list itm) (cdr (reverse rtn))))
maz zco
)
)
)
)
rtn
) 作为从集合中获取“极值”的一般示例,请考虑以下函数:
从我上面的帖子中检索列表中具有最小z坐标的点,然后变成:
(defun getextreme ( lst prd / rtn )
(setq rtn (car lst) prd (eval prd))
(foreach itm (cdr lst)
(if (prd itm rtn) (setq rtn itm))
)
rtn
)和最大值:
_$ (getextreme lst '(lambda ( a b ) (< (caddr a) (caddr b))))
(0.055268 2.26906 0.016701) 李,这是非常翔实的!我知道我需要阅读更多关于lambda函数的内容,因为我经常把它搞砸。当我在看你的minmax函数时,我试图创建两个不同的函数(或者一个函数会要求参数“min”,例如),一个叫做getmax,另一个叫做getmin,因此
14将返回
当我调用min函数时。我不知道它在函数中的什么地方找到了高点(我试着注释了maz部分,但那不是它)。 欢迎您加入野马队-如果您对代码的运行方式有任何疑问,请随时提问。
对于您描述的“多用途”功能,请考虑以下几点:
使用您的示例进行评估:
17 或者,更通用:
18
19 非常好,谢谢你的帮助!我有一个关于什么是caddar函数的快速问题?我找不到它的任何文档,只有cadar功能。
太好了-不客气!
请参阅以下资源:
http://www.theswamp.org/index.php?topic=39025.msg442238#msg442238
http://www.theswamp.org/index.php?topic=45131.msg503433#msg503433
http://www.theswamp.org/index.php?topic=31473.0
http://ronleigh.com/autolisp/ales11.htm
页:
1
[2]