小编Eva*_*ons的帖子

实现用于检测自相交多边形的强力算法

我最初实现了Hoey-Shamos算法,但它对于将来的可维护性来说太复杂了(我在这里没有说法),并且没有正确报告,因此我将使用优化的强力算法.

我的问题是:如何优化此代码才能使用?

就目前而言,我的代码包含一个嵌套的for循环,两次迭代相同的列表.

编辑:将线条转换为HashSet并使用两个foreach循环...扫描10,000个约45秒.这还不够.

foreach (Line2D g in lines)
{                   
foreach (Line2D h in lines)
{
    if (g.intersectsLine(h))
    {
        return false;
    }
}                  

 } // end 'lines' for each loop
Run Code Online (Sandbox Code Playgroud)

如果我强制我的"intersectsLine()"方法返回false(出于测试目的),扫描10,000条记录仍然需要8秒(我有700,000条记录).这太长了,所以我需要优化这段代码.

我尝试在将其与所有其他线路进行比较后从列表中删除线路,但是存在准确性问题(不明白为什么)并且速度增加几乎不可察觉.

这是我的intersectsLine方法.我在这里找到了另一种方法,但看起来所有的方法调用和诸如此类的东西都会变慢.在我看来,计算坡度似乎并不需要太多计算(如果我错了,请纠正我?)

public bool intersectsLine(Line2D comparedLine)
{

//tweakLine(comparedLine);
if (this.Equals(comparedLine) ||
    P2.Equals(comparedLine.P1) ||
    P1.Equals(comparedLine.P2))
{
    return false;
}

double firstLineSlopeX, firstLineSlopeY, secondLineSlopeX, secondLineSlopeY;

firstLineSlopeX = X2 - X1;
firstLineSlopeY = Y2 - Y1;

secondLineSlopeX = comparedLine.X2 - comparedLine.X1;
secondLineSlopeY = comparedLine.Y2 - comparedLine.Y1;

double s, …
Run Code Online (Sandbox Code Playgroud)

c# algorithm arcgis shapefile polygons

3
推荐指数
1
解决办法
2678
查看次数

嵌套循环中的循环优化c#

我正在比较从二进制文件生成的两个数据列表.我很清楚为什么它运行缓慢,当有大量记录时,它会做不需要的冗余工作.

例如,如果a1 = a1,则条件为真.既然2a!= 1a那么为什么还要费心去检查呢?我需要再次检查1a.如果我不这样做,它会在检查第400,000条记录时检查第一条记录.我考虑过将第二个for循环作为foreach,但是在迭代嵌套循环时我无法删除1a

"for循环"中可以包含的项目数量可能会有所不同.我不认为使用'i'的单个for循环将起作用,因为匹配可以在任何地方.我正在读取二进制文件

这是我目前的代码.程序已经运行了一个多小时,而且还在继续.出于可读性原因,我删除了很多迭代代码.

   for (int i = 0; i < origItemList.Count; i++)
    {
        int modFoundIndex = 0;
        Boolean foundIt = false;
        for (int g = 0; g < modItemList.Count; g++)
        {
            if ((origItemList[i].X == modItemList[g].X)
                && (origItemList[i].Y == modItemList[g].Y)
                && (origItemList[i].Z == modItemList[g].Z)
                && (origItemList[i].M == modItemList[g].M))
            {

            foundIt = true;
            modFoundIndex = g;
            break;

            }
            else
            {
                foundIt = false;
            }

        }
        if (foundIt)                         
        {
            /*
             * This is run assumming it finds an x,y,z,m …
Run Code Online (Sandbox Code Playgroud)

c# asp.net optimization for-loop

2
推荐指数
1
解决办法
1448
查看次数

标签 统计

c# ×2

algorithm ×1

arcgis ×1

asp.net ×1

for-loop ×1

optimization ×1

polygons ×1

shapefile ×1