private void GetNeighborBlocks(LineSegment line, IEnumerable <Block> blocks, out Block blockX, out Block blockY, out Orientation orientation) { blockX = null; blockY = null; orientation = Orientation.Other; foreach (var block in blocks) { var found = false; var blockLines = Polygon.GetBlockLines(block, Layer).Where(item => item.IsSlope); foreach (var lineObstacle in blockLines) { if (line.Start == lineObstacle.Start && line.End == lineObstacle.End) { found = true; } else if (line.End == lineObstacle.Start && line.Start == lineObstacle.End) { found = true; } if (found) { break; } } if (!found) { continue; } if (blockX == null) { blockX = block; } else { blockY = block; //ok, we have both blocks var isVertical = line.Direction == Direction.Down || line.Direction == Direction.Up; var isHorizontal = line.Direction == Direction.Left || line.Direction == Direction.Right; if (isVertical) { orientation = Orientation.Vertical; if (blockX.Position.X < blockY.Position.X) { return; } } if (isHorizontal) { orientation = Orientation.Horizontal; if (blockX.Position.Y < blockY.Position.Y) { return; } } var blockTemp = blockX; blockX = blockY; blockY = blockTemp; return; } } }