public PolygonAreaMock CreateRegularStarInnerOneHalfOriginal()
 {
     return(PolygonAreaMock.RegularStar(Center, NumberOfSidesOrCorners,
                                        ParameterizedRadius, (int)(ParameterizedRadius / 2.0),
                                        DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenDefault,
                                        LineAlgorithm));
 }
 public PolygonAreaMock CreateRegularStarInnerThreeFourthsKnownSizeHash()
 {
     return(PolygonAreaMock.RegularStar(Center, NumberOfSidesOrCorners,
                                        ParameterizedRadius, (int)(ParameterizedRadius * 0.75),
                                        DrawFromCornersMethods.OriginalKnownSizeHash, InnerPointsMethods.ScanlineOddEvenKnownSizeHash,
                                        LineAlgorithm));
 }
 public PolygonAreaMock CreateRegularStarInnerThreeFourthsCacheOuterPointsOtherHasher()
 {
     return(PolygonAreaMock.RegularStar(Center, NumberOfSidesOrCorners,
                                        ParameterizedRadius, (int)(ParameterizedRadius * 0.75),
                                        DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenCacheOuterPointsOtherHasher,
                                        LineAlgorithm));
 }
 public PolygonAreaMock CreateRegularStarInnerOneFourthOmitRedundantCheck()
 {
     return(PolygonAreaMock.RegularStar(Center, NumberOfSidesOrCorners,
                                        ParameterizedRadius, (int)(ParameterizedRadius / 4.0),
                                        DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenOmitRedundantCheck,
                                        LineAlgorithm));
 }
Exemplo n.º 5
0
        // Original method implemented in GoRogue that just draws lines using default hashing algorithms
        #region Original GoRogue Method
        public static void OriginalDefault(PolygonAreaMock polygon)
        {
            for (int i = 0; i < polygon.Corners.Count - 1; i++)
            {
                polygon.OuterPoints.Add(new Area(Lines.Get(polygon.Corners[i], polygon.Corners[i + 1], polygon.LineAlgorithm)));
            }

            polygon.OuterPoints.Add(new Area(Lines.Get(polygon.Corners[^ 1], polygon.Corners[0], polygon.LineAlgorithm)));
Exemplo n.º 6
0
        // Variation of ScanlineOddEvenDefault that omits the usage of LINQ and a foreach loop
        #region ScanlinesNoLinq
        public static void ScanlineOddEvenNoLinq(PolygonAreaMock polygon)
        {
            polygon.InnerPoints = new Area();

            var bounds = polygon.OuterPoints.Bounds;

            // The top and bottom rows can never contain an inner point, so skip them.
            for (int y = bounds.MinExtentY + 1; y < bounds.MaxExtentY; y++)
            {
                var linesEncountered = new List <IReadOnlyArea>();

                // Must include MinExtentX so that it can accurately count lines encountered.
                // Doesn't need MaxExtentX since no inner point can be equal to or greater than that.
                for (int x = bounds.MinExtentX; x < bounds.MaxExtentX; x++)
                {
                    if (polygon.OuterPoints.Contains(x, y))
                    {
                        for (int sIdx = 0; sIdx < polygon.OuterPoints.SubAreas.Count; sIdx++)
                        {
                            var boundary = polygon.OuterPoints.SubAreas[sIdx];
                            if (!boundary.Contains(x, y))
                            {
                                continue;
                            }


                            if (HasLessY(boundary, y))
                            {
                                if (!linesEncountered.Contains(boundary))
                                {
                                    linesEncountered.Add(boundary);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (linesEncountered.Count % 2 == 1)
                        {
                            polygon.InnerPoints.Add(x, y);
                        }
                    }
                }
            }
        }
Exemplo n.º 7
0
        // Original scan-lines implementation, but avoids iterating over OuterPoints' SubAreas in cases where the point
        // being processed is not an outer point, at the cost of caching the entire set of outer points in a hash set.
        #region Scanlines Cache Outer Points Other Hasher
        public static void ScanlineOddEvenCacheOuterPointsOtherHasher(PolygonAreaMock polygon)
        {
            var bounds = polygon.OuterPoints.Bounds;

            polygon.InnerPoints = new Area(new KnownRangeHasher(bounds.MinExtent, bounds.MaxExtent));

            // Cache outer points in a hash set so that we cut down on iteration proportional to number of sides
            // per point when checking if a point is an outer point or not.
            var outerPointsSet = new HashSet <Point>(polygon.OuterPoints, new KnownRangeHasher(bounds.MinExtent, bounds.MaxExtent));

            // The top and bottom rows can never contain an inner point, so skip them.
            for (int y = bounds.MinExtentY + 1; y < bounds.MaxExtentY; y++)
            {
                var linesEncountered = new List <IReadOnlyArea>();

                // Must include MinExtentX so that it can accurately count lines encountered.
                // Doesn't need MaxExtentX since no inner point can be equal to or greater than that.
                for (int x = bounds.MinExtentX; x < bounds.MaxExtentX; x++)
                {
                    if (outerPointsSet.Contains(new Point(x, y)))
                    {
                        foreach (var boundary in GetBoundariesContaining(polygon, x, y))
                        {
                            if (boundary.Any(p => p.Y < y))
                            {
                                if (!linesEncountered.Contains(boundary))
                                {
                                    linesEncountered.Add(boundary);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (linesEncountered.Count % 2 == 1)
                        {
                            polygon.InnerPoints.Add(x, y);
                        }
                    }
                }
            }
        }
Exemplo n.º 8
0
        // Variation of ScanlineOddEvenDefault that changes the `Any` call to a more refined approach for checking
        // for lesser y-values in a boundary line
        #region Scanlines FasterYValueCheck
        public static void ScanlineOddEvenFasterYCheck(PolygonAreaMock polygon)
        {
            polygon.InnerPoints = new Area();

            var bounds = polygon.OuterPoints.Bounds;

            // The top and bottom rows can never contain an inner point, so skip them.
            for (int y = bounds.MinExtentY + 1; y < bounds.MaxExtentY; y++)
            {
                var linesEncountered = new List <IReadOnlyArea>();

                // Must include MinExtentX so that it can accurately count lines encountered.
                // Doesn't need MaxExtentX since no inner point can be equal to or greater than that.
                for (int x = bounds.MinExtentX; x < bounds.MaxExtentX; x++)
                {
                    if (polygon.OuterPoints.Contains(x, y))
                    {
                        foreach (var boundary in GetBoundariesContaining(polygon, x, y))
                        {
                            // Since these areas are 2D (ordered) lines, if there exists any point that is a lesser
                            // y-value than the current, it must be one of the ends
                            if (boundary[0].Y < y || boundary[^ 1].Y < y)
                            {
                                if (!linesEncountered.Contains(boundary))
                                {
                                    linesEncountered.Add(boundary);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (linesEncountered.Count % 2 == 1)
                        {
                            polygon.InnerPoints.Add(x, y);
                        }
                    }
                }
            }
        }
Exemplo n.º 9
0
        // Variation of ScanlineOddEvenDefault that uses the known-size hasher for inner points
        #region Scanlines KnownSize Hash
        public static void ScanlineOddEvenKnownSizeHash(PolygonAreaMock polygon)
        {
            var bounds = polygon.OuterPoints.Bounds;

            polygon.InnerPoints = new Area(new KnownSizeHasher(bounds.MaxExtentX));

            // The top and bottom rows can never contain an inner point, so skip them.
            for (int y = bounds.MinExtentY + 1; y < bounds.MaxExtentY; y++)
            {
                var linesEncountered = new List <IReadOnlyArea>();

                // Must include MinExtentX so that it can accurately count lines encountered.
                // Doesn't need MaxExtentX since no inner point can be equal to or greater than that.
                for (int x = bounds.MinExtentX; x < bounds.MaxExtentX; x++)
                {
                    if (polygon.OuterPoints.Contains(x, y))
                    {
                        foreach (var boundary in GetBoundariesContaining(polygon, x, y))
                        {
                            if (boundary.Any(p => p.Y < y))
                            {
                                if (!linesEncountered.Contains(boundary))
                                {
                                    linesEncountered.Add(boundary);
                                }
                            }
                        }
                    }
                    else
                    {
                        if (linesEncountered.Count % 2 == 1)
                        {
                            polygon.InnerPoints.Add(x, y);
                        }
                    }
                }
            }
        }
 public PolygonAreaMock CreateParallelogramTopCornerOmitRedundantCheck()
 {
     return(PolygonAreaMock.Parallelogram(Origin, Size, Size, DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenOmitRedundantCheck, true, LineAlgorithm));
 }
 public PolygonAreaMock CreateParallelogramTopCornerKnownSizeHash()
 {
     return(PolygonAreaMock.Parallelogram(Origin, Size, Size, DrawFromCornersMethods.OriginalKnownSizeHash, InnerPointsMethods.ScanlineOddEvenKnownSizeHash, true, LineAlgorithm));
 }
 public PolygonAreaMock CreateRectangleKnownSizeHash()
 {
     return(PolygonAreaMock.Rectangle(new Rectangle(Origin.X, Origin.Y, Size, Size), DrawFromCornersMethods.OriginalKnownSizeHash, InnerPointsMethods.ScanlineOddEvenKnownSizeHash, LineAlgorithm));
 }
 public PolygonAreaMock CreateParallelogramBottomCornerOriginal()
 {
     return(PolygonAreaMock.Parallelogram(Origin, Size, Size, DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenDefault, false, LineAlgorithm));
 }
 public PolygonAreaMock CreateRectangleOriginal()
 {
     return(PolygonAreaMock.Rectangle(new Rectangle(Origin.X, Origin.Y, Size, Size), DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenDefault, LineAlgorithm));
 }
 public PolygonAreaMock CreateParallelogramTopCornerCacheOuterPointsOtherHasher()
 {
     return(PolygonAreaMock.Parallelogram(Origin, Size, Size, DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenCacheOuterPointsOtherHasher, true, LineAlgorithm));
 }
Exemplo n.º 16
0
 private static IEnumerable <IReadOnlyArea> GetBoundariesContaining(PolygonAreaMock polygon, int x, int y)
 => polygon.OuterPoints.SubAreas.Where(sa => sa.Contains(x, y));
 public PolygonAreaMock CreateRegularPolygonCacheOuterPoints()
 {
     return(PolygonAreaMock.RegularPolygon(Center, NumberOfSidesOrCorners, ParameterizedRadius,
                                           DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenCacheOuterPoints, LineAlgorithm));
 }
 public PolygonAreaMock CreateParallelogramTopCornerHashSetEncountered()
 {
     return(PolygonAreaMock.Parallelogram(Origin, Size, Size, DrawFromCornersMethods.OriginalDefault, InnerPointsMethods.ScanlineOddEvenHashSetEncountered, true, LineAlgorithm));
 }