c# - 如何从另一个矩形中减去一个矩形?

标签 c# math

即使任务栏被隐藏,我也在尝试确定桌面的工作区域。

我有两个矩形,屏幕的边界和任务栏的边界。我需要从屏幕矩形中减去任务栏的边界矩形以确定桌面的可用工作区域。基本上,除了隐藏任务栏时,我想提出 Screen.WorkingArea。

说屏幕矩形 X,Y,W,H = 0,0,1680,1050 和任务栏 X,Y,W,H 是 0,1010,1680,40 。我需要用第一个减去第二个来确定工作区域是0,0,1680,1010

任务栏可以位于屏幕的四个边中的任意一个,我知道肯定有比确定任务栏的位置然后用单独的代码行为四个边中的每一个生成一个新的 Rectangle 更好的方法可能的职位。

最佳答案

假设矩形 2 包含在矩形 1 中 (如果不是,则使用两个矩形的交集作为矩形 2):

-------------------------
|      rectangle 1      |
|                       |
|     -------------     |
|     |rectangle 2|     |
|     -------------     |
|                       |
|                       |
-------------------------

如果你从矩形 1 中减去矩形 2,你会得到一个有洞的区域:

-------------------------
|                       |
|                       |
|     -------------     |
|     |    hole   |     |
|     -------------     |
|                       |
|                       |
-------------------------

这个区域可以分解成4个矩形:

-------------------------
|          A            |
|                       |
|-----------------------|
|  B  |   hole    |  C  |
|-----------------------|
|                       |
|          D            |
-------------------------

如果矩形 1 和矩形 2 的三边重合,您将从减去的区域中得到 1 个矩形(这是您的情况)。通常,您最多会得到 4 个矩形。

在objective-c中的实现(不好意思,目前没有visual studio):

// returns the rectangles which are part of rect1 but not part of rect2
NSArray* rectSubtract(CGRect rect1, CGRect rect2)
{
    if (CGRectIsEmpty(rect1)) {
        return @[];
    }
    CGRect intersectedRect = CGRectIntersection(rect1, rect2);

    // No intersection
    if (CGRectIsEmpty(intersectedRect)) {
        return @[[NSValue valueWithCGRect:rect1]];
    }

    NSMutableArray* results = [NSMutableArray new];

    CGRect remainder;
    CGRect subtractedArea;
    subtractedArea = rectBetween(rect1, intersectedRect, &remainder, CGRectMaxYEdge);

    if (!CGRectIsEmpty(subtractedArea)) {
        [results addObject:[NSValue valueWithCGRect:subtractedArea]];
    }

    subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMinYEdge);
    if (!CGRectIsEmpty(subtractedArea)) {
        [results addObject:[NSValue valueWithCGRect:subtractedArea]];
    }

    subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMaxXEdge);
    if (!CGRectIsEmpty(subtractedArea)) {
        [results addObject:[NSValue valueWithCGRect:subtractedArea]];
    }

    subtractedArea = rectBetween(remainder, intersectedRect, &remainder, CGRectMinXEdge);
    if (!CGRectIsEmpty(subtractedArea)) {
        [results addObject:[NSValue valueWithCGRect:subtractedArea]];
    }

    return results;
}

// returns the area between rect1 and rect2 along the edge
CGRect rectBetween(CGRect rect1, CGRect rect2, CGRect* remainder, CGRectEdge edge)
{
    CGRect intersectedRect = CGRectIntersection(rect1, rect2);
    if (CGRectIsEmpty(intersectedRect)) {
        return CGRectNull;
    }

    CGRect rect3;
    float chopAmount = 0;
    switch (edge) {
        case CGRectMaxYEdge:
            chopAmount = rect1.size.height - (intersectedRect.origin.y - rect1.origin.y);
            if (chopAmount > rect1.size.height) { chopAmount = rect1.size.height; }
            break;
        case CGRectMinYEdge:
            chopAmount = rect1.size.height - (CGRectGetMaxY(rect1) - CGRectGetMaxY(intersectedRect));
            if (chopAmount > rect1.size.height) { chopAmount = rect1.size.height; }
            break;
        case CGRectMaxXEdge:
            chopAmount = rect1.size.width - (intersectedRect.origin.x - rect1.origin.x);
            if (chopAmount > rect1.size.width) { chopAmount = rect1.size.width; }
            break;
        case CGRectMinXEdge:
            chopAmount = rect1.size.width - (CGRectGetMaxX(rect1) - CGRectGetMaxX(intersectedRect));
            if (chopAmount > rect1.size.width) { chopAmount = rect1.size.width; }
            break;
        default:
            break;
    }

    CGRectDivide(rect1, remainder, &rect3, chopAmount, edge);

    return rect3;
}

关于c# - 如何从另一个矩形中减去一个矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3765283/

相关文章:

c# - Ninject - 静态类中的内核?

c# - 我可以将自定义版本字符串添加到 .net DLL 吗?

c# - 在 jquery ajax 中处理 json 响应

algorithm - 生成升序序列 2^p*3^q

Python 引发数组困惑

c# - 类名的 CompilerServices

c# - 小数和数学运算

c++ - 找到第 N 个最小的整数

javascript - 在 Javascript 数组中查找绝对最大值

Python - 生成具有特定模式的特定排列列表(添加到 itertools)