Example #1
0
    //creates a new boolean box from two, returns false if boxes don't intersect, uses boolean operator to decide the resulting data
    public static bool Intersection(BooleanBox a, BooleanBox b, out BooleanBox result, Operation operation)
    {
        result = null;

        //no intersection
        if (a.end.AnyLowerOrEqual(b.origo) || b.origo.AnyHigherOrEqual(a.end) || b.end.AnyLowerOrEqual(a.origo) || a.origo.AnyHigherOrEqual(b.end))
        {
            return(false);
        }

        //check if other box encapsulates other or create a cross-section
        if (a.Contains(b.origo) && a.Contains(b.end))
        {
            result = new BooleanBox(b.origo, b.size);
        }
        else if (b.Contains(a.origo) && b.Contains(a.end))
        {
            result = new BooleanBox(a.origo, a.size);
        }
        else
        {
            Vec2I start = Vec2I.SelectMax(a.origo, b.origo);
            Vec2I end   = Vec2I.SelectMin(a.end, b.end);
            result = new BooleanBox(start, end - start);
        }

        //offsets
        Vec2I ao = result.origo - a.origo;
        Vec2I bo = result.origo - b.origo;

        //boolean method
        switch (operation)
        {
        default:
        case Operation.AllFalse:
            break;

        case Operation.AllTrue:
            for (int y = 0; y < result.size.y; y++)
            {
                for (int x = 0; x < result.size.x; x++)
                {
                    result.data[x, y] = true;
                }
            }
            break;

        case Operation.And:
            for (int y = 0; y < result.size.y; y++)
            {
                for (int x = 0; x < result.size.x; x++)
                {
                    result.data[x, y] = a.data[ao.x + x, ao.y + y] && b.data[bo.x + x, bo.y + y];
                }
            }
            break;

        case Operation.Or:
            for (int y = 0; y < result.size.y; y++)
            {
                for (int x = 0; x < result.size.x; x++)
                {
                    result.data[x, y] = a.data[ao.x + x, ao.y + y] || b.data[bo.x + x, bo.y + y];
                }
            }
            break;

        case Operation.Xor:
            for (int y = 0; y < result.size.y; y++)
            {
                for (int x = 0; x < result.size.x; x++)
                {
                    result.data[x, y] = a.data[ao.x + x, ao.y + y] != b.data[bo.x + x, bo.y + y];
                }
            }
            break;

        case Operation.Nor:
            for (int y = 0; y < result.size.y; y++)
            {
                for (int x = 0; x < result.size.x; x++)
                {
                    result.data[x, y] = !a.data[ao.x + x, ao.y + y] && !b.data[bo.x + x, bo.y + y];
                }
            }
            break;

        case Operation.CloneA:
            for (int y = 0; y < result.size.y; y++)
            {
                for (int x = 0; x < result.size.x; x++)
                {
                    result.data[x, y] = a.data[ao.x + x, ao.y + y];
                }
            }
            break;

        case Operation.CloneB:
            for (int y = 0; y < result.size.y; y++)
            {
                for (int x = 0; x < result.size.x; x++)
                {
                    result.data[x, y] = b.data[bo.x + x, bo.y + y];
                }
            }
            break;
        }

        return(true);
    }