[循环套循环]请问如何优化这个算法
本帖最后由 peraperson 于 2015-1-29 09:17 编辑目的是:图上有一些线段和文字 想实现如果文字在线段中点附近(文字点与中点距离在10以内视为接近)则变红
现在建立了两个表 分别为文字和线段的 然后循环套循环判断 即(repeat 线段 (repeat 文字)) 这样的问题是太慢了
请问有什么好的办法吗 谢谢
可以对点表按X、Y、Z坐标进行排序,当两个表中对应的元素X坐标相差较多时,可排除大量元素;当X坐标在要求范围内时,再对Y坐标进行上述比较,直到找到符合条件的元素。
当然代码要写出来还是不容易的。。 首先要确定一个前提
文字点是指节点还是包围框的4角点
再视线段和直线的数量
哪个少以哪个循环作ssget'c/p
代码不会太复杂的 本帖最后由 peraperson 于 2015-1-29 09:19 编辑
vectra 发表于 2015-1-28 21:28 static/image/common/back.gif
可以对点表按X、Y、Z坐标进行排序,当两个表中对应的元素X坐标相差较多时,可排除大量元素;当X坐标在要求范 ...
谢谢 即使要排除貌似也要用到循环 masterlong 发表于 2015-1-28 22:59 static/image/common/back.gif
首先要确定一个前提
文字点是指节点还是包围框的4角点
再视线段和直线的数量
谢谢 文字是组码10的点 关键在于文字和线段都很多 2个循环嵌套起来太慢了
本帖最后由 longcashman 于 2015-1-29 11:00 编辑
按你的描述每个文字坐标都要分别与每段线中点求距离做比较,能节省的地方也就是取坐标这个阶段
建议文字图元名成一个表,然后一次所有把文字和线段中点坐标取出来各自成表
再按你的结构但改为(repeat 文字坐标表 (repeat 线段中点表)) 用vl-position 把图元表和文字坐标表联系起来 本帖最后由 peraperson 于 2015-1-29 19:14 编辑
longcashman 发表于 2015-1-29 10:57 static/image/common/back.gif
按你的描述每个文字坐标都要分别与每段线中点求距离做比较,能节省的地方也就是取坐标这个阶段
建议文字图 ...
谢谢 文字和线段跟你说的一样各成一个表的 我之前也有考虑所用vl-positon这个想法 问题在于 文字的点不一定就是在中点位置 而是附近距离10以内所以貌似用不了 还是要两个循环
peraperson 发表于 2015-1-29 09:15 static/image/common/back.gif
谢谢 即使要排除貌似也要用到循环
无序的两个循环时间复杂度是O(n^2),排序之后,两个表均循环一次即可,时间复杂度是O(n) 本帖最后由 llsheng_73 于 2015-1-30 11:17 编辑
根据楼主的描述,可以先选出文字,以其基点为中心,10为距离做一个选择框进行ssget"F"选择线段,如果选择到了改色,选择不到不管它
当然,这样其实是把问题扔给了CAD去处理
另外,其实两次repeat也没什么,至少算法清楚好理解也好写,只需要(repeat 线段 (repeat 文字将已经处理过的文字从表中去除)) 这样第二层循环会越来越小,会省下很多时间,如果一条线段中点附近的文字一般情况下会有几个或者一个文字周围会有多条线段的话,这样的效果会比较明显 llsheng_73 发表于 2015-1-30 11:16 static/image/common/back.gif
根据楼主的描述,可以先选出文字,以其基点为中心,10为距离做一个选择框进行ssget"F"选择线段,如果选择到 ...
这个法子只能判定附近有线但不一定是在中点附近的
页:
[1]
2