newbuser 发表于 2013-12-25 10:35:33

两个关联表根据指定函数排序

请求mapcar,foreach级别高手帮忙啊;; lst1的点分别位于lst2表组成的多边形内,顺序不对
;; 现将lst2内的表按照函数 *判断点是否在多边形内* 对lst2重新进行排列,请问如何嵌套foreach达到目的
(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))) ;;点表
(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))));;封闭图形坐标表

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

(defun isPtinPM(xPt Points)
(equal
    PI
    (abs
      (apply
'+
(mapcar'(lambda (x y) (rem (- (angle xPt x) (angle xPt y)) PI))
    (reverse (cdr (reverse (cons (last Points) Points))))
    Points
)
      )
    )
    1e-6
)
)

q3_2006 发表于 2013-12-25 10:53:09

什么顺序不对...你想要的顺序是什么....上个图说明一下呗....

newbuser 发表于 2013-12-25 10:56:47

q3_2006 发表于 2013-12-25 10:53 static/image/common/back.gif
什么顺序不对...你想要的顺序是什么....上个图说明一下呗....

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

q3_2006 发表于 2013-12-25 10:57:38

4个点依次在4个点表内??

q3_2006 发表于 2013-12-25 11:03:21

newbuser 发表于 2013-12-25 10:56 http://bbs.mjtd.com/static/image/common/back.gif
我想按照图中的text编号按照顺序排列这些图框。除了用循环还有没有更简单的方法

图里要说明排序之前的顺序和排好后的顺序.....

newbuser 发表于 2013-12-25 11:24:01

大哥,图中元顺序是图元生成的顺序,要排列成按照text文件的3,11,12,20排列啊。

q3_2006 发表于 2013-12-25 12:39:22

本帖最后由 q3_2006 于 2013-12-25 12:59 编辑

(defun c:tt ( / i l lst1 lst2 x y)
(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))) ;;点表
(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))))
(setq l '()
l (reverse (last (mapcar
      '(lambda (x)
         (repeat (setq i (length lst2))
    (setq y (nth (setq i (1- i))
          lst2
   )
    )
    (if (isPtinPM x y)
      (setq l (cons y l))
    )
         )
       )
      lst1
    )
   )
   )
)
)

q3_2006 发表于 2013-12-25 12:43:28

本帖最后由 q3_2006 于 2013-12-25 13:13 编辑

我也新手....这是LST2按LST1的顺序排...感觉应该有更简单的写法....拜托高手来个简洁版的....

xyp1964 发表于 2013-12-25 13:29:34

(setq ptn '())
(foreach pt lst1
(if (setq ptn1 (vl-remove-if
               '(lambda (x) (not (isPtinPM pt x))) lst2)
      )
    (setq ptn (cons (car ptn1) ptn))
)
)
(setq ptn (reverse ptn))

xyp1964 发表于 2013-12-25 13:34:07

(mapcar '(lambda (x) (car (vl-remove-if '(lambda (y) (not (isPtinPM x y))) lst2))) lst1)
页: [1] 2
查看完整版本: 两个关联表根据指定函数排序