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