shiyan001 发表于 2013-7-12 11:23:04

如何根据X坐标在表中找出前后点

如点表((2000 210)(2100 180) (2120 189)(2160 192)(2230 187)) ,点表中x坐标由小到大,很有规律,如果已知某点p的x坐标2130,如何在点表中找出该点的前一个点(2120 189)和后一个点(2160 192),并插值计算出点p的y坐标。插值我会,如何找到前后两个点是关键。请高手帮忙。

vectra 发表于 2013-7-12 11:34:33

(defun search (x alist / lb)
(while (and (> (length alist) 0) (< (caar alist) x))
    (setq lb      (car alist)
          alist      (cdr alist)
    )
)
(list lb (car alist))
)


_$ (search 2130 '((2000 210)(2100 180) (2120 189)(2160 192)(2230 187)))
((2120 189) (2160 192))

wowan1314 发表于 2013-7-12 11:36:29

本帖最后由 wowan1314 于 2013-7-12 12:37 编辑

我动作还是太慢了!!
一个是遍历,一个不是遍历的;;(SETQ LST '( (1 12) (2 22) (3 33) (4 44)))
;;(T11 2.5 LST) = ((2 22) (3 33))
(defun T11 (A LST / AB A0)
(vl-member-if
'(lambda(X)
    (if (<= (car A0) A (car X))
      (setq AB (list A0 X))
      (setq A0 X AB NIL)
    )
)
LST
)
AB
);;(SETQ LST '( (1 12) (2 22) (3 33) (4 44)))
;;(T11 2.5 LST) = ((2 22) (3 33))
(defun T11 (A LST)
(mapcar
      '(lambda(X Y)
          (if (<= (car X) A (car Y))
            (setq AB (list X Y))
          )
      )
      LST (cdr LST)
)
AB
)

阿然 发表于 2013-7-12 11:37:46

(last (vl-remove (member pt pts) pts))这是前一个(cadr (member pt pts))是后一个,求更好的方法

shiyan001 发表于 2013-7-12 14:28:08

谢谢各位了,追问:如果在点表中已经有与该点x坐标相等的点,则不再查找。程序应该怎样改。

vectra 发表于 2013-7-12 14:37:23

确保点是整数时

(assoc 2120 '((2000 210)(2100 180) (2120 189)(2160 192)(2230 187)))

返回

(2120 189)

可以通用测试是否有返回值来判断。浮点数存在误差 必须对表进行遍历。

shiyan001 发表于 2013-7-12 14:45:52

我明白了,谢谢各位了。
页: [1]
查看完整版本: 如何根据X坐标在表中找出前后点