onlooker 发表于 2018-4-12 09:43:37

求助!对于一个坐标点表,如何在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:07:31

本帖最后由 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))

用了一个与排序无关的函数,不知道能不能满足楼主的要求

onlooker 发表于 2018-4-12 10:31:33

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:19:37

本帖最后由 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
)

onlooker 发表于 2018-4-12 09:47:10

在线等,请各位大神指导一下啊!或者是y坐标相同时,x坐标取最大的也可以啊!

yxp 发表于 2018-4-12 09:50:19

这是一个排序问题,对 x y 分别进行排序就行了,搜函数的帮助文件即可。下面是我以前做的一个排序,代码就不摘了。


onlooker 发表于 2018-4-12 10:13:30

yxp 发表于 2018-4-12 09:50
这是一个排序问题,对 x y 分别进行排序就行了,搜函数的帮助文件即可。下面是我以前做的一个排序,代码就 ...

小弟愚笨,还是不太明白啊

yxp 发表于 2018-4-12 10:18:05

复制帮助文件如下:
按 Y 坐标对二维点表排序:
_$ (vl-sort '((1 3) (2 2) (3 1))
             (function (lambda (e1 e2)
                         (< (cadr e1) (cadr e2)) ) ) )
((3 1) (2 2) (1 3))

llsheng_73 发表于 2018-4-12 11:36:39

115.022那个哪去了?

yxp 发表于 2018-4-12 11:42:41

本帖最后由 yxp 于 2018-4-12 11:54 编辑

llsheng_73 发表于 2018-4-12 11:36
115.022那个哪去了?
稍微改一下就行,这个问题可以描述为 取二维点表的顶峰起伏值,就像股票曲线
foreach 没有将最后一个表加进去。
页: [1] 2
查看完整版本: 求助!对于一个坐标点表,如何在x坐标相同时,取得y坐标最大值的坐标点