找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1601|回复: 5

[求助] 请高手给解释剖析一下以下几个表达式的用法

[复制链接]
发表于 2013-5-27 22:40:29 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 GTJ116600 于 2013-5-28 06:13 编辑

由于对lispboy发起的“[研讨] 关于LISP表处理的测试练习,看看谁的代码高效的前提下更简洁”中几位楼主使用的apply mapcar lambda组合用法不甚明白,特求助高手对以下几条语句给予解释剖析一下。
- 本文出自晓东CAD家园-论坛,原文地址:http://bbs.xdcad.net/thread-668344-1-1.html
[pcode=lisp,true](mapcar
  '(lambda (a b)
     (list a b)
   )
  lst
  (cdr lst)
)
(apply
  'mapcar
  (cons 'list (list a (cdr a)))
)
(mapcar
  'LIST
  lst
  (cdr lst)
)
[/pcode]



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

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-27 23:05:43 | 显示全部楼层
本帖最后由 Lispboy 于 2013-5-27 23:46 编辑

刚才刚给一个朋友写了由密密麻麻的多段线生成圆弧段多段线的代码,那个代码没用一个循环语句,就拿那个跟你说吧

QQ截图20130527230330.png

1、先求出白色多段线的顶点

[pcode=lisp,true]
        (setq pts1 (mapcar 'cdr (vl-remove-if-not '(lambda(x)(= (car x) 10)) ed)))
[/pcode]

2、 把 P1 P2 P3 ...P6 组合成 '((p1 p2)(p2 p3)(p3 p4)(p5 p6) (p6 p7))

[pcode=lisp,true]
       (setq pts2 (mapcar 'list pts1 (cdr pts1)))
[/pcode]


3、求出每段直线段的中点和法线的直线段, 下图的黄色小短线(单位长度,用到了向量),仔细看。

QQ截图20130527231607.png

求每段线的中点
[pcode=lisp,true]
   (defun _midp (p1 p2)
      (mapcar '(lambda(x)(/ x 2.0))(mapcar '+ p1 p2))
   )

   (setq pts2 (mapcar '(lambda(x)(_midp (car x)(cadr x))) pts1)
[/pcode]


下面代码是得到小黄线的每段 (中点  法线),PTS1是折线的段((p1 p2)...(p6 p7))

[pcode=lisp,true]
       (setq  pts2 (mapcar
                   '(lambda (x)
                      (list (setq pmid (_midp (setq p1 (car x))
                                              (setq p2 (cadr x))
                                       )
                            )
                            (mapcar
                              '+
                              pmid
                              (Mat:ROT90 (MAT:Unitization (mapcar
                                                            '-
                                                            p2
                                                            p1
                                                          )
                                         )
                              )
                            )
                      )
                  )
                 pts1
             )
[/pcode]

3、得到每段的小黄线了,现在我们求所有小黄线的交点

a. 下面代码把每2个小黄线组成  ( (p1 p' p2 p2')....(p2 p2' p3 p3')...),为INTERS函数准备数据,用APPEND是为了去掉一层括号。
[pcode=lisp,true]
           (setq pts3 (mapcar  'append pts2 (reverse pts2) )

[/pcode]

b.  用MAPCAR ,APPLY函数,给INTERS函数传递参数,注意有个NIL加到INTERS函数里面。这步代码求完,表PTS4里面就是所有小黄段的交点
(p1 p2 p3 p4....), 就是圆心了。
[pcode=lisp,true]
        (setq pts4 (mapcar
                   '(lambda (x)
                      (apply
                        'inters
                        (reverse (cons nil x))
                      )
                    )
                   pts3
                 )

             )
         )
[/pcode]

  1. ((88118.5 31585.9) (88118.5 31585.9) (88118.5 31585.9) (88118.5 31585.9)
  2. (88118.5 31585.9) (88118.5 31585.9))



4、 从每段直线段的中点和圆心画线

QQ截图20130527233838.png

[pcode=lisp,true]
(mapcar '(lambda(x y)(command "line" (car x) y "")) pts2 pts4)
[/pcode]
上面所有代码都没有REPEAT,WHILE循环语句,就是MAPCAR实现的,给求交点函数 inters 构造参数的时候用了APPLY

上面的过程就是演示了从一个折线段求圆心的过程。



评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-27 22:57:42 | 显示全部楼层
刚有朋友发个心得的帖子:  http://bbs.xdcad.net/thread-668399-1-1.html  可以去看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-28 06:00:49 | 显示全部楼层
本帖最后由 GTJ116600 于 2013-5-28 06:02 编辑

谢谢lisboy,谢谢您这么晚了,还如此耐心的讲解,感激之情是用语言无法表达的。我想此贴对于初学者来说肯定是受益匪浅的。以前总习惯了用while ,repeat,从今后要学着多使用mapcar了。这个帖子我一定得好好研究研究,消化吸收。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-30 05:15:44 | 显示全部楼层
呵呵,又学习了一遍,思路是明白了。但是向量这块又迷糊了。嗨,要看要学的东西太多了。:loveliness:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-2 09:50:26 | 显示全部楼层
来占个位。看完以后受益匪浅。感谢lispboy的耐心讲解。收藏了慢慢吸收
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 12:29 , Processed in 0.392598 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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