Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 消除线不在附近的区域_C#_.net_Linq_Geometry - Fatal编程技术网

C# 消除线不在附近的区域

C# 消除线不在附近的区域,c#,.net,linq,geometry,C#,.net,Linq,Geometry,我有一张地图,上面画着一些死区(无法到达的区域) 在我的应用程序流程中有一个点,我需要检查在这个地图上是否可以到达一条线 现在,我的直线交叉点代码非常可靠,但我很难确定如何限制需要检查的死区数量,因为其中一些死区将位于地图的另一边 现在死区只是一个列表,其中一个点是一个x和y,都是double类型,我的行只是描述行的开始和结束的两个独立点 因此,我调用此函数并针对所有死区进行处理,这就是我所做的: DeadZones.All(dz => !FastPolygons.DoesLineInte

我有一张地图,上面画着一些死区(无法到达的区域)

在我的应用程序流程中有一个点,我需要检查在这个地图上是否可以到达一条线

现在,我的直线交叉点代码非常可靠,但我很难确定如何限制需要检查的死区数量,因为其中一些死区将位于地图的另一边

现在死区只是一个
列表
,其中一个
是一个x和y,都是
double
类型,我的行只是描述行的开始和结束的两个独立点

因此,我调用此函数并针对所有死区进行处理,这就是我所做的:

DeadZones.All(dz => !FastPolygons.DoesLineIntersectPolygon(point1, point2, dz.Polygon));
首先,我想我可以使用来自死区的MaxX和MaxY来消除那些很远的点,但是如果这两个点都位于死区之外,那么所有的点都会被处理,并且需要线两端的一个点实际位于死区,以便消除死区

我写了一个方法,我可以在我的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语句中实现这一点。非常感谢您的帮助


编辑:我也非常欢迎您就如何在这里应用并行化提供最佳建议

因此,这使5000次迭代的处理时间减少了约30秒,因此这似乎是一个足够的答案

我所做的是创建一个名为line的
结构来代替这对点

看起来是这样的:

 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();
     }
 }
 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));

这实际上是在说,只看死区,因为整条线路不在死区的一侧。在我的代码中,还有一些地方像这样的优化是有用的,通过这样的工作,我也将帮助我解决这些问题。

我目前正在将一行作为一个结构,而不仅仅是2点,因此,我可以访问每个轴的最小值和最大值,并有一些想法可以尝试。如果这个想法不奏效,我会更新我的问题。你不需要验证两个点都不在区域的对侧吗?所以你可以用区域的最小值和最大值x和y作为粘合框,然后检查以确保两个点都在框的右侧、左侧、上方或下方以排除该区域?@juharr这就是我现在尝试的解决方案的想法。将直线设为结构,通过将MinX和MaxX以及Y设为属性,使这一点变得更容易。我不确定您是否需要知道线段的最小值和最大值,只是这两个点位于分区的同一侧。直线结构或类在任何情况下都是一个好主意。@juharr你是对的,但是有了直线的最小值和最大值,我可以很容易地说,这条直线在多边形的任何一边之外。只是让一切看起来更干净。我现在正在测试,看看是否有改进
DeadZones.Where(z=> !ZoneCouldNotOverlapLine(line,z))
.All(dz => !FastPolygons.DoesLineIntersectPolygon(point1, point2, dz.Polygon));