连接点
我想连接两组点。每个集合中的点数总是完全相同。诀窍是如何避免相交线。
我想我需要一个递归算法来找到解决方案,当没有线相交时,但我从来没有这样想过。
我不是要求其他人为我编写程序,我只是需要递归部分的提示,作为参数传递什么,如何开始处理,何时回滚。
这看起来可以使用与我在这个“挑战”中使用的类似的递归回溯方法,用一个函数替换谓词函数来测试两组点之间的交集(想想“inters”)。
希望这有帮助。
谢谢,当我看到你的代码时,我已经开始实现我的解决方案,基本思想是一样的,只是我的代码效率和流线型要低得多,但它似乎在工作。
这就是我想到的:
(defun connect (paired plista plista2 / i j pa pb done ul s p1 p2)
(setq done nil)
(setq pa (cdar plista))
(setq i 0)
(if (= 0 (length plista2)) (setq done paired))
(while (and (not done) (< i (length plista2)))
(setq pb (nth i plista2))
(setq ul (vl-remove (nth i plista2) plista2))
(setq j 0)
(setq s T)
(repeat (length paired)
(setq p1 (cadr (nth j paired)))
(setq p2 (last (nth j paired)))
(if (inters p1 p2 pa pb) (setq s nil))
(setq j (1+ j))
)
(if s
(setq done (connect (append paired (list (list (caar plista) (cdar plista) pb))) (cdr plista) ul ))
)
(setq i (1+ i))
)
(setq ret done)
)
列表处理中的复杂性是因为我实际上在“plista”中的点上附加了一个数字,我需要保留这些关联。
普利斯塔看起来是这样的:(((“12881”658886.0 231817.0 0.0)(“10388”658885.0 231819.0 0 0.0)(“10387”658885.0 231819.0 0 0.0))
函数的结果是plista2的点
(("12881" (658886.0 231817.0 0.0) (658889.0 231819.0 0.0)) ("10388"(658885.0 231819.0 0.0) (658889.0 231820.0 0.0)) ("10387" (658885.0231819.0 0.0) (658889.0 231821.0 0.0)))
页:
[1]