M76 发表于 2022-7-6 09:00:15

连接点

我想连接两组点。每个集合中的点数总是完全相同。
 
诀窍是如何避免相交线。
 
我想我需要一个递归算法来找到解决方案,当没有线相交时,但我从来没有这样想过。
 
我不是要求其他人为我编写程序,我只是需要递归部分的提示,作为参数传递什么,如何开始处理,何时回滚。

Lee Mac 发表于 2022-7-6 09:21:29

这看起来可以使用与我在这个“挑战”中使用的类似的递归回溯方法,用一个函数替换谓词函数来测试两组点之间的交集(想想“inters”)。
 
希望这有帮助。

M76 发表于 2022-7-6 10:02:46

 
 
谢谢,当我看到你的代码时,我已经开始实现我的解决方案,基本思想是一样的,只是我的代码效率和流线型要低得多,但它似乎在工作。
 
这就是我想到的:
 
(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]
查看完整版本: 连接点