Ejemplo n.º 1
0
    private IEnumerable <Point> GetClosePoints(Point point, ResultState resultState)
    {
        int currentLeftIndex   = point.XGroupIndex;
        int currentRightIndex  = point.XGroupIndex + 1;
        int currentBottomIndex = point.YGroupIndex;
        int currentTopIndex    = point.YGroupIndex + 1;

        while (
            currentLeftIndex >= 0 ||
            currentRightIndex < _orderedByXPoints.Count ||
            currentBottomIndex >= 0 ||
            currentTopIndex < _orderedByYPoints.Count
            )
        {
            if (currentLeftIndex >= 0)
            {
                PointGroup group = _orderedByXPoints[currentLeftIndex];
                if (point.X - group.Key < resultState.Value)
                {
                    foreach (Point verticalPoint in group.GetVerticalPoints(point))
                    {
                        yield return(verticalPoint);
                    }
                    currentLeftIndex--;
                }
                else
                {
                    currentLeftIndex = -1;
                }
            }

            if (currentRightIndex < _orderedByXPoints.Count)
            {
                PointGroup group = _orderedByXPoints[currentRightIndex];
                if (group.Key - point.X < resultState.Value)
                {
                    foreach (Point verticalPoint in group.GetVerticalPoints(point))
                    {
                        yield return(verticalPoint);
                    }
                    currentRightIndex++;
                }
                else
                {
                    currentRightIndex = _orderedByXPoints.Count;
                }
            }

            if (currentBottomIndex >= 0)
            {
                PointGroup group = _orderedByYPoints[currentBottomIndex];
                if (point.Y - group.Key < resultState.Value)
                {
                    foreach (Point horizontalPoint in group.GetHorizontalPoints(point))
                    {
                        yield return(horizontalPoint);
                    }
                    currentBottomIndex--;
                }
                else
                {
                    currentBottomIndex = -1;
                }
            }

            if (currentTopIndex < _orderedByYPoints.Count)
            {
                PointGroup group = _orderedByYPoints[currentTopIndex];
                if (group.Key - point.Y < resultState.Value)
                {
                    foreach (Point horizontalPoint in group.GetHorizontalPoints(point))
                    {
                        yield return(horizontalPoint);
                    }
                    currentTopIndex++;
                }
                else
                {
                    currentTopIndex = _orderedByYPoints.Count;
                }
            }
        }
    }