VL-REMOVE-IF帮助
我一直在尝试使用VisualLisp实现一个2D装箱解决方案。我有一个不错的工作脚本,但我缺少打包算法的一个主要组件。我需要挑选一个代表垃圾箱中可用空间的列表。这些可用空间由“自由矩形”表示,并存储在表单列表中((x\u ins y\u ins)x y)。每次迭代,该列表都会随着新项目的放置和可用空间的更改而增长。维护该列表的一部分是,每次迭代都必须检查列表中是否有冗余矩形。对于每一个有序的自由矩形对,我需要检查一个是否在另一个之内或等于另一个。如果是,则必须从列表中删除另一个内的自由矩形。为了简化我的尝试,我从VL-REMOVE-IF语句开始,但很快意识到我做得不对。这是我糟糕的第一次尝试:
(setq
fr (vl-remove-if (function (lambda (a1 a2)
(setq one_xi(car (car a1))
one_yi(nth 1 (car a1))
one_x (nth 1 a1)
one_y (nth 2 a1))
(setq ;ITEM
two_xi(car (car a2))
two_yi(nth 1 (car a2))
two_x (nth 1 a2)
two_y (nth 2 a2))
(setq
T_check(- (+ one_yi one_y ) (+ two_yi two_y ))
B_check(- two_yi one_yi)
L_check(- two_xi one_xi)
R_check(- (+ one_xi one_x) (+ two_xi two_x)))
(AND (>= T_check 0)
(>= B_check 0)
(>= L_check 0)
(>= R_check 0))
)) fr)
)
我现在知道,传递给remove if的测试函数只需要有1个参数。我不知道如何将这些与lambda中的一个论点进行比较。欢迎提供任何建议。
页:
[1]