Exemple #1
0
 public Shape(int index, OneSidedShape oneSidedShape, int size)
 {
     _size         = size;
     Index         = index;
     OneSidedShape = oneSidedShape;
     Color         = GetRandomColor();
 }
Exemple #2
0
        private (bool canCut, (OneSidedShape, OneSidedShape) resultShapes) CutShape(bool[,] matrix, int n, int gapX,
                                                                                    int gapY,
                                                                                    int gapHeight)
        {
            var leftResult         = new List <Point>();
            var rightResult        = new List <Point>();
            var leftPointsToCheck  = new Queue <Point>();
            var rightPointsToCheck = new Queue <Point>();

            if (gapY > 0) // one below
            {
                if (matrix[gapX, gapY - 1])
                {
                    leftPointsToCheck.Enqueue(new Point(gapX, gapY - 1));
                }
                if (matrix[gapX + 1, gapY - 1])
                {
                    rightPointsToCheck.Enqueue(new Point(gapX + 1, gapY - 1));
                }
            }

            if (gapY + gapHeight < n) // one above
            {
                if (matrix[gapX, gapY + gapHeight])
                {
                    leftPointsToCheck.Enqueue(new Point(gapX, gapY + gapHeight));
                }
                if (matrix[gapX + 1, gapY + gapHeight])
                {
                    rightPointsToCheck.Enqueue(new Point(gapX + 1, gapY + gapHeight));
                }
            }

            for (int i = gapY; i < gapY + gapHeight; i++) // next to
            {
                if (gapX > 0 && matrix[gapX - 1, i])
                {
                    leftPointsToCheck.Enqueue(new Point(gapX - 1, i));
                }
                if (gapX < n - 2 && matrix[gapX + 2, i])
                {
                    rightPointsToCheck.Enqueue(new Point(gapX + 2, i));
                }

                leftResult.Add(new Point(gapX, i));
                rightResult.Add(new Point(gapX + 1, i));
            }

            ExpandShape(matrix, n, leftPointsToCheck, leftResult);
            ExpandShape(matrix, n, rightPointsToCheck, rightResult);

            if (leftResult.Count + rightResult.Count != n)
            {
                return(false, (null, null));
            }

            return(true,
                   (OneSidedShape.FromListOfPoints(leftResult, n), OneSidedShape.FromListOfPoints(rightResult, n)));
        }