慢速C#算法在处理数百个对象(不缩放)时需要增强,

问题描述 投票:0回答:1

我们有读取DXF / DWG文件(图形文件)的代码,然后读取我们自己的几何库,该库将所有内容转换为点,线,弧,圆等对象。然后我们有一个Shape对象,该对象将容纳一个或多个实体。形状也可以包含其他形状作为子元素,而这些形状可以具有子元素。

[我们有一些基本检查,可以进行典型检查,例如一个实体是否碰到另一个实体或与另一个实体相交,并且通常表现良好。在软件中,当我们加载工程图文件时,请执行以下操作,

1)读入文件,将实体消耗为对象2)向上将每个实体转换为形状对象,圆为1:1,直线和其他所有内容均标记为“不规则”形状对象3)通过检查哪些实体彼此“接触”来构建形状阵列/合并形状,以便将任何接触分组为单个形状-简单的检查就像第一/最后一点一样-交叉路口-从几何教科书和其他几何库中提取标准检查4)一旦有了形状列表,我们就可以进行父/子分析(现在只深入到一个层次),因此,我们不必说从一百个实体中打出十二个形状,我们知道其中一些是形状内的形状,因此我们可能在图形中只有一个真正的“形状”,而其他形状则作为子级嵌套在其下,或者我们在图形中可能有多个彼此不在的形状

总体上,它的表现相当不错,但是当我们将更复杂的图形添加到混合中时,我们意识到有些作者不绘制单条折线,而是可能在图形中包含数十或数百条线,然后您还可以显示数十或数百个圆上有切口/孔。然后最重要的是,该代码处理的平均图形数量可能是10-30个文件。因此,现在我们看到的是平均用例,代码无法按比例缩放以处理它,而步骤2更像是蛮力算法。我正在寻找改善算法的想法。我正在尝试编写更多针对几何的代码而不是cad代码,读取文件的cad代码是单独的,只是构建要使用的几何,然后我们进入几何并进行了通用的几何工作,这些工作不是基于cad而是像壳一样通用分析,总距离,还希望与其他开放源代码库集成,并在工程图数据上利用更强大的分析技术,并最终甚至进行图像识别,将图像解耦,从而将其转换为几何图形,然后转换为cad。

[它遍历所有实体,检查是否有实体碰触,如果是,则将其添加到形状中并继续进行,然后重新开始重新创建新形状或添加到现有形状,直到将其传递给所有实体和所有形状为止制作。当创建形状并查看新实体时,它会在形状中循环遍历所有实体,以检查它们是否再次接触,这就是为什么它不能很好地缩放并且不是最佳代码的原因。

忽略'touching'检查和所有Invalidate所做的就是更新内部信息,例如长度计算等,问题在下面。

关于处理数百个实体时如何提高该算法的速度和效率的任何建议?

        //we can end up with disjointed shapes, this scan keeps passing until we have no
        //more merges to try and perform every time we find a match we restart
        int idx = 0;
        uint kickout = 0;
        bool no_more = false; bool restart = false;

        //nothing at all?
        if (shapes.Count() <= 0)
            return shapes;

        do
        {
            int i = -1;
            Shape s1 = shapes[idx];
            if (s1.Entities.Count() > 0)
            {
                for (i = idx + 1; i < shapes.Count(); i++)
                {
                    Shape s2 = shapes[i];
                    if (s2.Entities.Count() > 0)
                    {
                        foreach (Entity e in s2.Entities)
                        {
                            if (s1.Touches(e))
                            {
                                //as a group, they all touch each other so they must
                                //all connect. Invalidate later (for speed)
                                s1.Add(s2);

                                s2.Clear(); //empty
                                shapes.Remove(s2); //empty from collection

                                restart = true;
                                break;
                            }
                        }
                    }
                }
            }

            //check next shape
            if (i == shapes.Count() || i == -1)
            {
                idx++;
                //idx %= shapes.Count(); //b/c we are manipulating contents
            }

            if (idx == shapes.Count() && !restart)
            {
                no_more = true;
            }
            if (idx == shapes.Count() && restart)
            {
                //re-pass, we have to keep going in case we missed a
                //joining segment/point
                idx = 0; restart = false;
            }

            //something went wrong here, don't freeze but we need to capture this
            kickout++;
            if (kickout + 1 == uint.MaxValue) //pretty high limit for checking
            {
                Debug.WriteLine("CRITICAL ERROR, OVERFLOW DETECTED IN SHAPE ANALYSIS!");
                throw new OverflowException("CRITICAL ERROR, OVERFLOW DETECTED IN SHAPE ANALYSIS!");
            }

        } while (!no_more);

我们有读取DXF / DWG文件(图形文件)的代码,然后读取我们自己的几何库,该库将所有内容转换为点,线,弧,圆等对象。然后我们有一个Shape对象,它...

c# cad
1个回答
0
投票

我的第一个建议是处理折线实体。您可以做的是将折线实体组合在一起,而无需计算交点。正确地说,折线是封闭的实体,因此无需计算交叉点以确保将其组合在一起。

© www.soinside.com 2019 - 2024. All rights reserved.