找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1140|回复: 24

[求助] 求大神指导方法。

[复制链接]

已领礼包: 8个

财富等级: 恭喜发财

发表于 2017-8-10 11:36:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
求大神指导方法:
求修改表的算法, 已知表内Y轴坐标 按相等并从小到大排序。 需让相等的Y轴坐标之间相差40个单位,返回表

如  377.769  
    395.054  ( + 377.769 40)  417.769
        404.014  ( + 417.769 40)  457.769
    405.755  ( + 457.769 40)  497.769

((728.509 377.769 90) (413.662 377.787 270) (943.912 395.054 90) (992.241 395.054 270) (888.094 395.054 90)
(794.198 395.054 90) (728.509 395.054 90) (413.662 395.054 270) (356.701 395.054 90) (278.25 395.054 90)
(234.477 395.054 90) (839.8 404.014 117) (910.526 404.095 236) (314.96 405.755 124) (307.565 405.76 243)
(992.396 412.066 270) (877.264 412.066 90) (750.971 412.066 90) (278.25 412.066 90) (399.616 412.066 270)
(345.929 412.066 90) (234.477 412.066 90) (803.462 419.908 236) (952.208 420.855 117) (755.45 428.682 90)
(819.275 428.682 90) (900.079 428.682 90) (988.378 428.682 90) (422.38 428.683 270) (426.856 436.088 124)
(421.231 442.04 90) (465.192 442.04 270) (535.276 442.04 90) (588.909 442.04 270) (709.43 442.04 90)
(761.056 443.101 179) (864.508 449.135 51) (813.42 451.194 51) (709.43 455.399 90) (588.923 455.401 270)
(913.771 456.482 51) (715.782 474.467 90))

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-10 11:49:25 | 显示全部楼层
再组织下文字吧,不用弄那么多的内容表,说明问题就行了,表内3,4个就行。

1、改前表什么样的


2、改后什么样的 (对应修改的设置下颜色)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-8-10 12:28:00 | 显示全部楼层

第一个Y也加40:

  1. (defun c:tt ()
  2.   (setq        a '((728.509 377.769 90)
  3.             (413.662 377.787 270)
  4.             (943.912 395.054 90)
  5.             (992.241 395.054 270)
  6.            )
  7.   )
  8.   (setq prev (list (car a)))
  9.   (mapcar '(lambda (x)
  10.              (setq b (list (car x) (+ 40.0 (cadr (car prev))) (caddr x)))
  11.              (setq prev (cons b prev))
  12.              b
  13.            )
  14.           a
  15.   )
  16. )




命令: !a
((728.509 377.769 90) (413.662 377.787 270) (943.912 395.054 90) (992.241
395.054 270))

命令: tt
((728.509 417.769 90) (413.662 457.769 270) (943.912 497.769 90) (992.241
537.769 270))


第一个Y要不变,就这样:

  1. (defun c:tt ()
  2.   (setq        a '((728.509 377.769 90)
  3.             (413.662 377.787 270)
  4.             (943.912 395.054 90)
  5.             (992.241 395.054 270)
  6.            )
  7.   )
  8.   (setq prev (list (car a)))
  9.   (mapcar '(lambda (x)
  10.              (setq b (list (car x) (+ (if (cdr prev) 40.0 0.0) (cadr (car prev))) (caddr x)))
  11.              (setq prev (cons b prev))
  12.              b
  13.            )
  14.           a
  15.   )
  16. )



命令: !a
((728.509 377.769 90) (413.662 377.787 270) (943.912 395.054 90) (992.241
395.054 270))

命令: tt
((728.509 377.769 90) (413.662 417.769 270) (943.912 457.769 90) (992.241
497.769 270))

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-8-10 14:37:57 | 显示全部楼层
;感谢大神回复。可能是我表述的不清楚。  大神代码是将每个Y轴坐标加了40然后递增。
;但我希望的是 以第1个 Y值为基数 。下组相同的Y 值为 (+ 40 y)   ,下组再相同的Y 为 ( + (+ 40 y) Y) 这样递增。
;就等于将每个坐标Y距离 统一设定为40个单位。
;再次感谢大神的回复!

(setq  a '((728.509 377.769 90) (413.662 377.769 270) (943.912 395.054 90) (992.241 395.054 270)(715.782 474.467 90)))

'((728.509 ( + 377.769 40) 90) (413.662 ( + 377.769 40) 270)
   (943.912 (+ ( + 377.769 40) 40) 90) (992.241 (+ ( + 377.769 40) 40)  270)
   (715.782 (+ (+ ( + 377.769 40) 40) 40) 90)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-8-10 15:06:59 | 显示全部楼层

别挤牙膏啊,我感觉你还没说完你的意思

你在列表,按我说的列。

1、开始前的表
      。。。。。。

2、重排后的表
      。。。。。。

让人一眼就看明白。

你的意思,是不是还有,

表里的Y值可能有好多组 Y值相同的, 每组Y值相同的,都按这组里面的第一个做基数,第一个不变,第二个以后开始递增N*Y1 ?

开始前:
   (( 1 2 3) (2 3 4) (2 2 4) (3 3 4) (3 2 5)(4 3 6))

递增后:
   ((1 2 3) (2 3 4) (2 42 4)(3 43 4)(3 82 5)(4 83 6)))

如果我说的不对,你修改下。


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-8-10 15:23:23 | 显示全部楼层
感谢newer,就这个意思,我再来个图表达一下。我的表达能太差了。唉。如图,从下往上,将10个单位Y轴间距变成40个单位。谢谢


1.PNG
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2017-8-10 15:46:26 | 显示全部楼层

那你这个表不一定要放到一起吧,一个组的在一个表里面就行了吧。

晓东通用函数库有现成的分组函数,  xd::list:groupbyindex , 开源函数库有源码,也可以加载晓东通用函数库就带了。

  1. (defun c:tt ()
  2.   (setq a '((1 2 3) (2 3 4) (2 2 4) (3 3 4) (3 2 5) (4 3 6)))
  3.   (setq        lst (mapcar '(lambda (x) (list (cadr x) x)) a)
  4.         lst (xd::list:groupbyindex lst 0.1)
  5.         lst (mapcar 'cdr lst)
  6.   )
  7. )



上面是分组的表,执行TT得到
命令: tt
(((1 2 3) (2 2 4) (3 2 5)) ((2 3 4) (3 3 4) (4 3 6)))


在上面分组的基础上,每个组里面Y循环加上40,接着一个MAPCAR就行了

  1. (defun c:tt ()
  2.   (setq base 40.0)
  3.   (setq a '((1 2 3) (2 3 4) (2 2 4) (3 3 4) (3 2 5) (4 3 6)))
  4.   (setq        lst (mapcar '(lambda (x) (list (cadr x) x)) a)
  5.         lst (xd::list:groupbyindex lst 0.1)
  6.         lst (mapcar 'cdr lst)
  7.         lst (mapcar '(lambda (x)
  8.                        (setq base1 (cadar x)
  9.                              i          -1
  10.                        )
  11.                        (mapcar '(lambda        (y)
  12.                                   (list        (car y)
  13.                                         (+ base1 (* (setq i (1+ i)) base))
  14.                                         (caddr y)
  15.                                   )
  16.                                 )
  17.                                x
  18.                        )
  19.                      )
  20.                     lst
  21.             )
  22.   )
  23. )



命令: tt
(((1 2.0 3) (2 42.0 4) (3 82.0 5)) ((2 3.0 4) (3 43.0 4) (4 83.0 6)))


开始前的表 '((1 2 3) (2 3 4) (2 2 4) (3 3 4) (3 2 5) (4 3 6))


mapcar 函数用好了,表操作就过关了。这个函数是LISP语言的精华,LISP语言是表处理语言,这个是基石。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-8-10 16:05:28 | 显示全部楼层
谢谢Lispboy  我的确还没弄懂mapcar 函数。
请问  xd::list:groupbyindex 函数内容是什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-10 16:18:43 | 显示全部楼层

用  xd::list:groupbyindex  搜索论坛
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-8-10 16:56:46 | 显示全部楼层
本帖最后由 sinawell 于 2017-8-10 17:00 编辑

各位老大,小弟表达能力太差。现在又重新表达一下。希望各位老大别介意。

开始前:
   (( 1 2 1) (2 2 2) (2 3 3) (3 3 4) (3 4 5)(4 4 6) (5 9 0))

递增后:
   (( 1 42 1) (2 42 2) (2 82 3) (3 82 4) (3 122 5)(4 122 6) (5 162 0))



实际上就是从下往上,将同一Y轴上的图元与上一组相同Y轴的图元  之间的距离修改为40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-10 17:21:10 | 显示全部楼层
本帖最后由 marting 于 2017-8-10 17:22 编辑

每组相同的 都加 40, 下一组相同的加80, 再下一组相同的 加 120 ?

上面Lispboy都帮你分好组了,那就每组都加一样的呗

修改下上面的代码,就是把递增的 i 放那层循环而已

  1. (defun c:tt ()
  2.   (setq base 40.0)
  3.   (setq        a '((1 2 3)
  4.             (2 3 4)
  5.             (3 5 7)
  6.             (2 2 4)
  7.             (3 3 4)
  8.             (5 5 6)
  9.             (3 2 5)
  10.             (8 5 3)
  11.             (4 3 6)
  12.            )
  13.   )
  14.   (setq        lst (mapcar '(lambda (x) (list (cadr x) x)) a)
  15.         lst (xd::list:groupbyindex lst 0.1)
  16.         lst (mapcar 'cdr lst)
  17.         i   0
  18.         lst (mapcar
  19.               '(lambda (x)
  20.                  (setq i (1+ i))
  21.                  (mapcar '(lambda (y)
  22.                             (list (car y) (+ (cadr y) (* i base)) (caddr y))
  23.                           )
  24.                          x
  25.                  )
  26.                )
  27.               lst
  28.             )
  29.   )
  30. )


执行前:
命令: !a
((1 2 3) (2 3 4) (3 5 7) (2 2 4) (3 3 4) (5 5 6) (3 2 5) (8 5 3) (4 3 6))


执行后:
命令: tt
(((1 42.0 3) (2 42.0 4) (3 42.0 5)) ((2 83.0 4) (3 83.0 4) (4 83.0 6)) ((3
125.0 7) (5 125.0 6) (8 125.0 3)))

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 24个

财富等级: 恭喜发财

发表于 2017-8-10 21:45:40 | 显示全部楼层

  1. (SETQ test '((728.509 377.769 90) (413.662 377.769 270) (943.912 395.054 90) (992.241 395.054 270) (715.782 474.467 90)))

  2. (DEFUN yadd (lst / BASE I ITEM LST OUTLST Y)
  3.   (SETQ i 0) ;_计数器
  4.   (setq base (cadar lst)) ;_第一点的Y值
  5.   (SETQ y (CADR lst)) ;_储存上一个点的Y值用于比较
  6.   (SETQ outlst (LIST (MAPCAR '+ '(0 40 0) (CAR lst))))
  7.   (setq lst (cdr lst))
  8.   (WHILE lst
  9.     (SETQ item (CAR lst))
  10.     (SETQ lst (CDR lst))
  11.     (IF        (NOT (EQUAL (CADR item) y 1e-6)) ;_误差值
  12.       (SETQ y (CADR item)
  13.             i (1+ i)
  14.       )
  15.     )
  16.     (SETQ outlst (CONS (LIST (CAR item) (+ base (* i 40)) (LAST item)) outlst))
  17.   )
  18.   (REVERSE outlst)
  19. )



看楼主的留言,应该是会用VL-SORT给Y值排序,但是使用MAPCAR函数还不熟练,换一种更简单易懂的方式
(yadd test) --->((728.509 417.769 90) (413.662 417.769 270) (943.912 457.769 90) (992.241 457.769 270) (715.782 497.769 90))

评分

参与人数 1D豆 +5 收起 理由
Lispboy + 5 热心帮忙奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2017-8-11 00:08:44 | 显示全部楼层
高手扎堆!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 403个

财富等级: 日进斗金

发表于 2017-8-11 05:55:21 | 显示全部楼层
受教了,有时间好好看看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

 楼主| 发表于 2017-8-11 14:40:47 | 显示全部楼层
感谢各位大神的帮助,小弟表达能力有限,浪费了大神不小时间,让小弟受宜匪浅。
fools大神的正是小弟要的结果,但表里如果有5个元素,最后两个元素会丢失。请问如何修改,谢谢!

((421.237 446.104 0 "D9" "270") (900.072 426.36 1 "D8" "90") (816.134 454.528 0 "D16" "231")
(709.435 446.344 0 "D24" "270") (916.396 459.707 0 "D6" "231"))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 00:32 , Processed in 0.677896 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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