/// <summary>
        /// Given a <paramref name="center"/> point and a
        /// <paramref name="jumpVector"/>, returns the point reached by moving
        /// from the <paramref name="center"/> along
        /// <paramref name="jumpStep"/> multiples of the
        /// <paramref name="jumpVector"/>.
        /// </summary>
        /// <param name="center"></param>
        /// <param name="jumpVector"></param>
        /// <param name="jumpNumber"></param>
        /// <returns></returns>
        public static SolarGridPoint GetJumpPoint(
            SolarGridPoint center,
            Tuple <int, int> jumpVector,
            int jumpStep)
        {
            var displacement = MultiplyVector(jumpVector, jumpStep);
            var resultPoint  = SolarGridPoint.GetPointAtRayVector(
                center, displacement);

            return(resultPoint);
        }
Example #2
0
        public IList <SolarObject> GetObjectsVisibleFromPoint(
            SolarGridPoint point,
            HashSet <SolarGridPoint> pointsToCheck)
        {
            // Define a "jump vector" as a displacement from the given
            // central point to another point.
            // 1) For each integer n starting with 1, find all jump vectors where
            //    |x| + |y| = n.
            // 2a) For each jump vector for a given n, move outwards from the
            //     central point in multiples of the given jump vector.
            // 2b) If a point is encountered containing an object that hasn't
            //     been seen before, then mark that object as seen. Afterwards,
            //     mark any subsequent objects encountered as blocked.
            IList <SolarObject> objectsSeen = new List <SolarObject>();
            var pointsChecked = new HashSet <SolarGridPoint>();
            var displacementVectorsChecked = new HashSet <Tuple <int, int> >();
            var numberToCheck = pointsToCheck.Count;
            int jumpNumber    = 1;

            while (pointsChecked.Count < numberToCheck)
            {
                // Get all jump vectors for this n
                var jumpVectors = VectorHelper.GetJumpVectors(jumpNumber);

                foreach (var jumpVector in jumpVectors)
                {
                    int jumpStep           = 1;
                    var displacementVector = VectorHelper.MultiplyVector(jumpVector, jumpStep);
                    if (displacementVectorsChecked.Contains(displacementVector))
                    {
                        continue;
                    }
                    displacementVectorsChecked.Add(displacementVector);
                    var  currentPoint = SolarGridPoint.GetPointAtRayVector(point, displacementVector);
                    bool encounteredObjectAlongRay = false;
                    while (GetIsCoordinateInGrid(currentPoint))
                    {
                        if (pointsChecked.Contains(currentPoint))
                        {
                            continue;
                        }

                        // Check if the point contains an object
                        if (pointsToCheck.Contains(currentPoint))
                        {
                            if (!encounteredObjectAlongRay)
                            {
                                objectsSeen.Add(_solarObjectDictionary[currentPoint]);
                                encounteredObjectAlongRay = true;
                            }
                            pointsChecked.Add(currentPoint);
                        }

                        jumpStep++;
                        displacementVector = VectorHelper.MultiplyVector(jumpVector, jumpStep);
                        displacementVectorsChecked.Add(displacementVector);
                        currentPoint = SolarGridPoint.GetPointAtRayVector(point, displacementVector);
                    }
                }

                jumpNumber++;
            }
            return(objectsSeen);
        }