public RegionMoves Transform(Transform transform)
        {
            RegionMoves newRegionMoves = new RegionMoves();

            if (ForwardIn1stD.Count > 0)
            {
                newRegionMoves.Add(transform(ForwardIn1stD.GetMove()), ForwardIn1stD.Count);
            }

            if (ReverseIn1stD.Count > 0)
            {
                newRegionMoves.Add(transform(ReverseIn1stD.GetMove()), ReverseIn1stD.Count);
            }

            if (ForwardIn2ndD.Count > 0)
            {
                newRegionMoves.Add(transform(ForwardIn2ndD.GetMove()), ForwardIn2ndD.Count);
            }

            if (ReverseIn2ndD.Count > 0)
            {
                newRegionMoves.Add(transform(ReverseIn2ndD.GetMove()), ReverseIn2ndD.Count);
            }

            return(newRegionMoves);
        }
        public static RegionMoves Combine(RegionMoves first, RegionMoves second)
        {
            RegionMoves newRegionMoves = new RegionMoves();

            newRegionMoves.SetDirectionSegmentCount(first.ForwardIn1stD.Count + second.ForwardIn1stD.Count,
                                                    first.ReverseIn1stD.Count + second.ReverseIn1stD.Count,
                                                    first.ForwardIn2ndD.Count + second.ForwardIn2ndD.Count,
                                                    first.ReverseIn2ndD.Count + second.ReverseIn2ndD.Count);

            newRegionMoves.SetDistanceSegmentCount(first.JumpIn1stD.Count + second.JumpIn1stD.Count,
                                                   first.ContiguityIn1stD.Count + second.ContiguityIn1stD.Count,
                                                   first.JumpIn2ndD.Count + second.JumpIn2ndD.Count,
                                                   first.ContiguityIn2ndD.Count + second.ContiguityIn2ndD.Count);

            return(newRegionMoves);
        }
        public static RegionMoves Measure(SpaceFillingCurve sFC, int level, firstToOtherSubregionTransforms firstToOtherSubregions)
        {
            RegionMoves totalRegionMoves = new RegionMoves();

            RegionMoves regionMoves = new RegionMoves();

            if (level == 0)
            {
                regionMoves.Add(sFC);

                return(regionMoves);
            }
            else
            {
                regionMoves = Measure(sFC.CalculateSubregionBMFs(0), level - 1, firstToOtherSubregions);

                totalRegionMoves = RegionMoves.Combine(regionMoves, totalRegionMoves);

                List <Transform> transforms = firstToOtherSubregions(sFC.CalculateSubregionBMFs(0).GetMoves());

                int subRegionSize = (int)Math.Pow(sFC.BaseSize, level);

                for (int i = 0; i < sFC.NumberOfSteps - 1; i++)
                {
                    RegionMoves otherRegionMoves = regionMoves.Transform(transforms[i]);

                    totalRegionMoves = RegionMoves.Combine(otherRegionMoves, totalRegionMoves);

                    Point tempPoint01 = sFC.CalculateSubregionBMFs(i).TraverseTheBasePath(new Point(0, 0), subRegionSize - 1).Last();

                    Point tempPoint02 = sFC.MoveToNextRegion(i, new Point(0, 0), subRegionSize);

                    totalRegionMoves.Add(new Move((p, s) => new Point(p.X + tempPoint02.X - tempPoint01.X, p.Y + tempPoint02.Y - tempPoint01.Y)));
                }

                return(totalRegionMoves);
            }
        }