2015-03-13 58 views
2

我有一張地圖,其上繪製了一些死點(無法觸及的區域)。消除線條不存在的區域

在我的應用程序的流程中,我需要檢查一條線是否可以在此地圖上到達。

現在,我的線路交叉點代碼非常穩固,但我無法確定如何限制需要檢查的死區數量,因爲其中一些將位於地圖的另一側。

現在死區只是一個List<Point>其中Point是X和Y兩個double型的,我的線僅有2描述開始和該行的末尾單獨的點。

所以,在這裏我打電話這一點,並處理對所有盲區,這是我在做什麼:

DeadZones.All(dz => !FastPolygons.DoesLineIntersectPolygon(point1, point2, dz.Polygon)); 

一開始,我以爲我可以使用MAXX與美星從盲區消除那些這些距離很遠,但是如果兩個點都位於死區之外,那麼所有這些點仍然會被處理,並且要求線的每一端都有一個點實際位於死區,以便使死區被淘汰。

我寫了一個方法,我可以在我的linq語句中的Where中使用,在我意識到這不起作用之前進行嘗試。這是我嘗試

private static bool ZoneCouldNotOverlap(Point point, Zone zone) 
{ 
    return (zone.MaxX < point.X || zone.MaxY < point.Y) || (zone.MinX > point.X || zone.MinY > point.Y); 
} 

,然後LINQ的聲明成爲本:

DeadZones.Where(x=> ZoneCouldNotOverlap(point1,x) || ZoneCouldNotOverlap(point2,x)).All(dz => !FastPolygons.DoesLineIntersectPolygon(point1, point2, dz.Polygon)); 

所以我一到這個地步,我可以消除地圖的很大一部分,因此不處理在我不感興趣的地圖部分的死區,但我似乎無法意識到如何在我的Linq聲明中做到這一點。任何幫助是非常讚賞的。

編輯:我還就如何過

+0

我目前正在建立一個結構而不是2個點的線,所以我可以訪問每個軸的最小值和最大值,並且有一些想法。如果事情不能解決這個問題,我會更新我的問題 – 2015-03-13 12:24:39

+0

您是否必須確認這兩個點不在區域的兩側?因此,您可以使用區域的最小和最大x和y作爲粘合框,然後檢查以確保兩個點位於該框的右側,左側,上方或下方以排除該區域? – juharr 2015-03-13 12:34:44

+0

@juharr這就是我現在所想的解決方案。通過給線MinX和MaxX使結線變得更容易,並且Y的屬性與屬性相同 – 2015-03-13 12:40:13

回答

0

所以,這打破約30秒掉它需要通過迭代5000處理的時間,因此它似乎在這裏適用parellelization最好的建議非常歡迎一個足夠的答案。

我所做的是創建一個struct被調用的行來代替這一對點。

,看起來像這樣:

public struct Line 
{ 
    public List<Point> Points { get; private set; } 
    public double MaxX { get; private set; } 
    public double MinX { get; private set; } 
    public double MinY { get; private set; } 
    public double MaxY { get; private set; } 

    public Line(Point start, Point end) : this() 
    { 
     Points = new List<Point>(); 
     Points.AddRange(new[] {start, end}); 
     var xs = Points.Select(p => p.X); 
     var ys = Points.Select(p => p.Y); 
     MaxX = xs.Max(); 
     MinX = xs.Min(); 
     MaxY = ys.Max(); 
     MinY = ys.Min(); 
    } 
} 

然後我用,在一種新的方法叫做ZoneCouldNotOverlapLine()和看起來像這樣:

private static bool ZoneCouldNotOverlapLine(Line line, Zone zone) 
{ 
    return (line.MinX > zone.MaxX || line.MaxX < zone.MinX) && (line.MaxY < zone.MinY || line.MinY > zone.MaxY); 
} 

反過來,我在我的LINQ語句中使用哪像所以:

DeadZones.Where(z=> !ZoneCouldNotOverlapLine(line,z)) 
.All(dz => !FastPolygons.DoesLineIntersectPolygon(point1, point2, dz.Polygon)); 

這是有效的說只看死角的地方entir e線不在區域的一側。在我的代碼中還有一些其他的地方,像這樣的優化是有用的,通過這個工作將會幫助我解決這些問題。

相關問題