mituzhe 发表于 2022-7-27 21:56:04

如何分割一个选择集

本帖最后由 mituzhe 于 2022-7-27 23:28 编辑

写了一个管道穿墙位置标记的程序
为了找到所有穿墙位置,就只能一个管道图元遍历所有墙体,判断是否相交。
如果有10000个管道图元和10000个墙体图元,那时间复杂度得10000*10000,一晚上都遍历不完。
所以为了降低时间复杂度,希望能将选择集自动切分
每个小选择集内只有比如管道和墙体图元各两个,这样时间复杂度就只有2*2×5000,大大降低了时间复杂度。
不知道有没有大佬能提供一下思路

llsheng_73 发表于 2022-7-27 22:23:44

本帖最后由 llsheng_73 于 2022-7-27 22:26 编辑

不管怎么搞,遍历每个管道图元是必须的
个人意见,先只针对管道搞一个选择集,
对它的每个图元取出坐标进行ssget"F"对墙体进行选择,正常情况下可以直接得到管道穿越墙体的顺序及穿越位置

mituzhe 发表于 2022-7-27 23:25:35

本帖最后由 mituzhe 于 2022-7-27 23:26 编辑

llsheng_73 发表于 2022-7-27 22:23
不管怎么搞,遍历每个管道图元是必须的
个人意见,先只针对管道搞一个选择集,
对它的每个图元取出坐标进 ...
哦,对哦。用F关键字可以求相交选择集。是一个很好的思路。
遍历每个管道图元确实是必须的,但某个管道图元跟某个墙体图元隔得特别远就没有必要去判断相交了。所以希望切分成一小块一小块的选择集,这样管道和墙体都在一个较小区域内,相交可能性更高。可以减少不必要的计算。可能还是很难实现吧。
谢谢你提供的思路,也可以解决很大的问题

wzg356 发表于 2022-7-28 15:21:51

一个根管道作一次ssget f,选择集里面就有交点坐标(管道首先碰到那个墙体的坐标)

mituzhe 发表于 2022-7-28 17:23:06

wzg356 发表于 2022-7-28 15:21
一个根管道作一次ssget f,选择集里面就有交点坐标(管道首先碰到那个墙体的坐标)

对于我这个问题,F关键字确实是最优解。但还是想知道能不鞥你实现选择集分割

wzg356 发表于 2022-7-28 18:32:04

(setq ss管 (ssget filters管)));filters管,管过滤条件
(repeat (setq n(sslength ss管));管数量
        (setq e管(ssname ss管(setq n(1- n))));单根管图元
        (setq ps管。。);单根管坐标       
        (setq ss墙(ssget "f" ps管 filters墙));filters墙,墙过滤条件
       ;得与这根管子相交的墙的选择集
       (ssnamex ss墙);可以看到相交的墙的图元名及管子与之相交的坐标, 自己提出来
       ;选中的相交墙及交点 是按管子前进方向依次排列的        
)

masterlong 发表于 2022-7-29 11:13:13

选择集分组当然可以实现
无非定义坐标区域后
执行n*m次ssget
或者对选择集里的图元
进行坐标测试分组

然而
重点在于
这样做难道就不是提高“复杂度”?
更何况
实现了你想要的分组以后
接下来又要怎么做呢

73已经给了远超你的思路
还陷在自己给自己划的圈子里跳不出来

mituzhe 发表于 2022-8-1 10:15:27

masterlong 发表于 2022-7-29 11:13
选择集分组当然可以实现
无非定义坐标区域后
执行n*m次ssget


已经采用他们的思路改进了
页: [1]
查看完整版本: 如何分割一个选择集