xgngg 发表于 2005-1-18 10:50:00

如何删除重复的线段

图形中有很多重复的线段,我想删除多余的,只留下一根就可以了,如何编这个程序,请高手帮忙

sieben 发表于 2005-1-18 13:43:00

我有两个差不多的程序,但是Lisp语言编的,要不要?

laoliu09 发表于 2005-1-18 14:31:00

vba也可以,通过遍历模型空间,对每一根直线求包围矩形,再通过选择集遍历包围矩形里的直线,如果有某根直线跟形成包围矩形的直线重合,则删除,这样一来,模型空间里的直线将会越来越少,速度应该还可以吧!


但我没编过,因为我用的是天正建筑,天正里有这个功能!

mikewolf2k 发表于 2005-1-18 19:57:00

楼上的思路不错,学了一招。


但是有这么个问题,对于14直线和23直线,当然是删除23;若是13直线和24直线,就不是简单删除某根直线的问题了,而是将其中一根直线改成14,再删除另一根直线。

laoliu09 发表于 2005-1-19 11:34:00

什么意思啊?请说明一点!谢谢!

mikewolf2k 发表于 2005-1-19 20:04:00

就是说,还要先判断在同一直线位置上的所有线段的最外边端点。

laoliu09 发表于 2005-1-19 20:22:00

呵呵!看来你有点误解我的意思啦,我的方法是删除完全重合的直线中较短的直线,而部分重合的直线是不删除的,因为对于部分重合的直线,其中任何一根的包围矩形都不能完全包含另一根直线,所以不被删除!


如果想把部分重合的多根直线变为一根直线,可以在原程序上再加修改!

mikewolf2k 发表于 2005-1-19 23:25:00

也不算误解吧。大家的出发点不同。我的意思是说对于部分重合的线段也应该删除,这样同一直线上只有一根线段,这样才最精简。欢迎常讨论。

my_computer 发表于 2005-1-20 08:21:00

acad的扩展程序Acad Express Tools中有一个命令叫“OverKill”,和你说的功能一样,好像也可以处理线段搭接的问题。

laoliu09 发表于 2005-1-20 12:08:00

本帖最后由 作者 于 2005-1-20 14:43:56 编辑

那我就改一下我的方法吧,改了之后应该可以满足你的要求,而且判断重线的速度应该比原来更快,欢迎讨论!



通过遍历模型空间,对每一根直线求包围矩形,并把这根直线的X坐标最小点和X坐标最大点存起来(对于竖直的直线是指Y坐标最小点和Y坐标最大点),以下就简称为直线最小点Pmin和最大点Pmax。再通过选择集遍历包围矩形里的直线(包含在矩形内或跟矩形相交的直线都选进来),如果有某根直线跟形成包围矩形的直线重合(通过数学方法可以简单的判断直线重合与否),就求它的最小点PTmin和最大点PTmax,if       PTmin<Pmin         then       Pmin=PTmin,if       PTmax>Pmax        then        Pmax=PTmax        ,然后把这根直线删除,最后,如果Pmin或Pmax跟初值相比发生了变化,就把形成包围矩形的直线删除,连结直线最小点Pmin和最大点Pmax, 形成新的直线,这样一来,同一直线位置上就只有一根直线了,而模型空间里的直线将会越来越少,速度还可以吧!
页: [1] 2
查看完整版本: 如何删除重复的线段