求助!对于一个坐标点表,如何在x坐标相同时,取得y坐标最大值的坐标点
求助!对于一个坐标点表,如何在x坐标相同时,取得y坐标最大值的坐标点 例如:(setq lst (list '(100.0 100.0) '(115.0 100.0) '(115.0 115.0) '(115.022 115.0)'(100.0 120.834) '(130.0 130.0) '(140.0 130.0) '(160.0 155.0)
'(190.0 180.0) '(180.0 180.0) '(190.0 190.0) '(200.0 190.0)
'(179.559 200.0) '(200.0 200.0))
)
本帖最后由 llsheng_73 于 2018-4-12 12:10 编辑
(defun subtotals(lst m ns / myfun a b c);;对lst以子表第m项为关键字进行分类,ns为整数时记录第ns项、为表(2 3)记录表中指定的项、为空或者其它记录关键字以外所有项
(cond((=(type ns)'LIST)(defun myfun(x)(list(mapcar'(lambda(y)(nth y x))ns))))
((=(type ns)'INT)(defun myfun(x)(list(nth ns x))))
(t(defun myfun(x)(List(vl-remove c x)))))
(foreach x lst
(setq a(if(setq c(nth m x)b(assoc c a))
(subst(append b(myfun x))b a)
(append a(list(append(list c)(myfun x))))))))
$ (mapcar'(lambda(x)(list(apply'max(cdr x))(car x)))(subtotals (list'(100.0 100.0)'(115.0 100.0)'(115.0 115.0)'(115.022 115.0)'(100.0 120.834)'(130.0 130.0)'(140.0 130.0)'(160.0 155.0)'(190.0 180.0)'(180.0 180.0)'(190.0 190.0)'(200.0 190.0)'(179.559 200.0)'(200.0 200.0)) 1 0))
((115.0 100.0) (115.022 115.0) (100.0 120.834) (140.0 130.0) (160.0 155.0) (190.0 180.0) (200.0 190.0) (200.0 200.0))
用了一个与排序无关的函数,不知道能不能满足楼主的要求
yxp 发表于 2018-4-12 10:18
复制帮助文件如下:
按 Y 坐标对二维点表排序:
_$ (vl-sort '((1 3) (2 2) (3 1))
大神,小弟的意思是:在n个坐标点时,一些坐标它们的y值是相同的,例如是y1,另外一些坐标它们的y值是y2,这个时候我需要取出来的是在y1坐标下,x坐标最大的哪个点,y2坐标下,x坐标最大的那个点,比如下列坐标:(list '(100.0 100.0) '(115.0 100.0) '(115.0 115.0) '(115.022 115.0)
'(100.0 120.834) '(130.0 130.0) '(140.0 130.0) '(160.0 155.0)
'(190.0 180.0) '(180.0 180.0) '(190.0 190.0) '(200.0 190.0)
'(179.559 200.0) '(200.0 200.0))
我要获得的坐标就是:(115.0 100.0 ) (100.0 120.834)((140.0 130.0)(160.0 155.0)(190.0 180.0)((200.0 190.0)(200.0 200.0) 本帖最后由 yxp 于 2018-4-12 11:21 编辑
onlooker 发表于 2018-4-12 10:31
大神,小弟的意思是:在n个坐标点时,一些坐标它们的y值是相同的,例如是y1,另外一些坐标它们的y值是y2,这 ...
就是排序啊,你调用函数试试, (trelist Lt) ,代码里的 0.01 是容差
(defun treList(L / s)
(setq L1 (vl-sort L (function (lambda (e1 e2)(> (cadr e1)(cadr e2)))))
xy1 (car L1) L1 (cdr L1) nx (car xy1) ny (cadr xy1))
(foreach x L1 (if (equal ny (cadr x) 0.01) (if (> (car x) nx)(setq nx (car x)))
(setq s (cons (list nx ny) s) ny (cadr x)))
) s
) 在线等,请各位大神指导一下啊!或者是y坐标相同时,x坐标取最大的也可以啊! 这是一个排序问题,对 x y 分别进行排序就行了,搜函数的帮助文件即可。下面是我以前做的一个排序,代码就不摘了。
yxp 发表于 2018-4-12 09:50
这是一个排序问题,对 x y 分别进行排序就行了,搜函数的帮助文件即可。下面是我以前做的一个排序,代码就 ...
小弟愚笨,还是不太明白啊 复制帮助文件如下:
按 Y 坐标对二维点表排序:
_$ (vl-sort '((1 3) (2 2) (3 1))
(function (lambda (e1 e2)
(< (cadr e1) (cadr e2)) ) ) )
((3 1) (2 2) (1 3))
115.022那个哪去了? 本帖最后由 yxp 于 2018-4-12 11:54 编辑
llsheng_73 发表于 2018-4-12 11:36
115.022那个哪去了?
稍微改一下就行,这个问题可以描述为 取二维点表的顶峰起伏值,就像股票曲线
foreach 没有将最后一个表加进去。
页:
[1]
2