我们有读取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对象,它...
我的第一个建议是处理折线实体。您可以做的是将折线实体组合在一起,而无需计算交点。正确地说,折线是封闭的实体,因此无需计算交叉点以确保将其组合在一起。