明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2965|回复: 16

[提问] 两个关联表根据指定函数排序

[复制链接]
发表于 2013-12-25 10:35:33 | 显示全部楼层 |阅读模式
请求mapcar,foreach级别高手帮忙啊
  1. ;; lst1的点分别位于lst2表组成的多边形内,顺序不对
  2. ;; 现将lst2内的表按照函数 *判断点是否在多边形内* 对lst2重新进行排列,请问如何嵌套foreach达到目的
  3. (setq lst1 '((1266.34 -793.366 0.0) (1109.44 -350.086 0.0) (1670.87 -371.66 0.0) (1543.04 -773.619 0.0))) ;;点表
  4. (setq lst2 '(((1522.25 -655.235 0) (1522.25 -952.235 0) (1942.25 -952.235 0) (1942.25 -655.235 0)) ((930.677 -655.235 0) (930.677 -952.235 0) (1350.68 -952.235 0) (1350.68 -655.235 0)) ((1522.25 -174.764 0) (1522.25 -471.764 0) (1942.25 -471.764 0) (1942.25 -174.764 0)) ((930.677 -174.764 0) (930.677 -471.764 0) (1350.68 -471.764 0) (1350.68 -174.764 0))))  ;;封闭图形坐标表

  5. ;; No.51  判断点是否在多边形内(狂刀程序)

  6. (defun isPtinPM  (xPt Points)
  7.   (equal
  8.     PI
  9.     (abs
  10.       (apply
  11.   '+
  12.   (mapcar  '(lambda (x y) (rem (- (angle xPt x) (angle xPt y)) PI))
  13.     (reverse (cdr (reverse (cons (last Points) Points))))
  14.     Points
  15.   )
  16.       )
  17.     )
  18.     1e-6
  19.   )
  20. )
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-12-25 10:53:09 | 显示全部楼层
什么顺序不对...你想要的顺序是什么....上个图说明一下呗....
 楼主| 发表于 2013-12-25 10:56:47 | 显示全部楼层
q3_2006 发表于 2013-12-25 10:53
什么顺序不对...你想要的顺序是什么....上个图说明一下呗....

我想按照图中的text编号按照顺序排列这些图框。除了用循环还有没有更简单的方法

本帖子中包含更多资源

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

x
发表于 2013-12-25 10:57:38 | 显示全部楼层
4个点依次在4个点表内??
发表于 2013-12-25 11:03:21 | 显示全部楼层
newbuser 发表于 2013-12-25 10:56
我想按照图中的text编号按照顺序排列这些图框。除了用循环还有没有更简单的方法


图里要说明排序之前的顺序和排好后的顺序.....
 楼主| 发表于 2013-12-25 11:24:01 | 显示全部楼层
大哥,图中元顺序是图元生成的顺序,要排列成按照text文件的3,11,12,20排列啊。
发表于 2013-12-25 12:39:22 | 显示全部楼层
本帖最后由 q3_2006 于 2013-12-25 12:59 编辑
  1. (defun c:tt ( / i l lst1 lst2 x y)
  2. (setq lst1 '((1266.34 -793.366 0.0) (1109.44 -350.086 0.0) (1670.87 -371.66 0.0) (1543.04 -773.619 0.0))) ;;点表
  3. (setq lst2 '(((1522.25 -655.235 0) (1522.25 -952.235 0) (1942.25 -952.235 0) (1942.25 -655.235 0))
  4. ((930.677 -655.235 0) (930.677 -952.235 0) (1350.68 -952.235 0) (1350.68 -655.235 0))
  5. ((1522.25 -174.764 0) (1522.25 -471.764 0) (1942.25 -471.764 0) (1942.25 -174.764 0))
  6. ((930.677 -174.764 0) (930.677 -471.764 0) (1350.68 -471.764 0) (1350.68 -174.764 0))))
  7.   (setq l '()
  8. l (reverse (last (mapcar
  9.       '(lambda (x)
  10.          (repeat (setq i (length lst2))
  11.     (setq y (nth (setq i (1- i))
  12.           lst2
  13.      )
  14.     )
  15.     (if (isPtinPM x y)
  16.       (setq l (cons y l))
  17.     )
  18.          )
  19.        )
  20.       lst1
  21.     )
  22.      )
  23.    )
  24.   )
  25. )
发表于 2013-12-25 12:43:28 | 显示全部楼层
本帖最后由 q3_2006 于 2013-12-25 13:13 编辑

我也新手....这是LST2按LST1的顺序排...感觉应该有更简单的写法....拜托高手来个简洁版的....
发表于 2013-12-25 13:29:34 | 显示全部楼层
  1. (setq ptn '())
  2. (foreach pt lst1
  3.   (if (setq ptn1 (vl-remove-if
  4.                  '(lambda (x) (not (isPtinPM pt x))) lst2)
  5.       )
  6.     (setq ptn (cons (car ptn1) ptn))
  7.   )
  8. )
  9. (setq ptn (reverse ptn))
发表于 2013-12-25 13:34:07 | 显示全部楼层
  1. (mapcar '(lambda (x) (car (vl-remove-if '(lambda (y) (not (isPtinPM x y))) lst2))) lst1)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-18 08:07 , Processed in 0.209881 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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