明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2059|回复: 12

[提问] 求助!对于一个坐标点表,如何在x坐标相同时,取得y坐标最大值的坐标点

[复制链接]
发表于 2018-4-12 09:43:37 | 显示全部楼层 |阅读模式
求助!对于一个坐标点表,如何在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))
  )

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-4-12 12:07:31 | 显示全部楼层
本帖最后由 llsheng_73 于 2018-4-12 12:10 编辑

  1. (defun subtotals(lst m ns / myfun a b c);;对lst以子表第m项为关键字进行分类,ns为整数时记录第ns项、为表(2 3)记录表中指定的项、为空或者其它记录关键字以外所有项
  2.   (cond((=(type ns)'LIST)(defun myfun(x)(list(mapcar'(lambda(y)(nth y x))ns))))
  3.        ((=(type ns)'INT)(defun myfun(x)(list(nth ns x))))
  4.        (t(defun myfun(x)(List(vl-remove c x)))))
  5.   (foreach x lst
  6.     (setq a(if(setq c(nth m x)b(assoc c a))
  7.        (subst(append b(myfun x))b a)
  8.        (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))

用了一个与排序无关的函数,不知道能不能满足楼主的要求
 楼主| 发表于 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)
发表于 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 是容差
  1. (defun treList(L / s)
  2. (setq L1 (vl-sort L (function (lambda (e1 e2)(> (cadr e1)(cadr e2)))))
  3.         xy1 (car L1) L1 (cdr L1) nx (car xy1) ny (cadr xy1))
  4. (foreach x L1 (if (equal ny (cadr x) 0.01) (if (> (car x) nx)(setq nx (car x)))
  5.                 (setq s (cons (list nx ny) s) ny (cadr x)))
  6. ) s
  7. )
 楼主| 发表于 2018-4-12 09:47:10 | 显示全部楼层
在线等,请各位大神指导一下啊!或者是y坐标相同时,x坐标取最大的也可以啊!
发表于 2018-4-12 09:50:19 | 显示全部楼层
这是一个排序问题,对 x y 分别进行排序就行了,搜函数的帮助文件即可。下面是我以前做的一个排序,代码就不摘了。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

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

小弟愚笨,还是不太明白啊
发表于 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))
发表于 2018-4-12 11:36:39 | 显示全部楼层
115.022那个哪去了?
发表于 2018-4-12 11:42:41 | 显示全部楼层
本帖最后由 yxp 于 2018-4-12 11:54 编辑
llsheng_73 发表于 2018-4-12 11:36
115.022那个哪去了?

稍微改一下就行,这个问题可以描述为 取二维点表的顶峰起伏值,就像股票曲线
foreach 没有将最后一个表加进去。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-19 17:53 , Processed in 0.252993 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表