Geometry 枚举两个矩形的非公共部分的整数点

Geometry 枚举两个矩形的非公共部分的整数点,geometry,intersection,rectangles,Geometry,Intersection,Rectangles,我有两个矩形,它平行于坐标轴,有整数坐标 我有四个坐标:第一个矩形的左上角和右下角,第二个矩形的左上角和右下角。左上角坐标始终位于右下角的顶部和左侧 矩形可以部分相交、完全相交或根本不相交。我需要列举第一个矩形中不在第二个矩形内的点,以及第二个矩形中不在第一个矩形内的点 另外,我需要做得比O(h1*w1+h2*w2)好得多,最好的是O(结果点数) 矩形可以部分相交、完全相交或根本不相交 让我们调查每个场景中的问题: 1。当它们不相交时: 您需要枚举两个矩形的所有点 2。当它们完全相交时: 在这

我有两个矩形,它平行于坐标轴,有整数坐标

我有四个坐标:第一个矩形的左上角和右下角,第二个矩形的左上角和右下角。左上角坐标始终位于右下角的顶部和左侧

矩形可以部分相交、完全相交或根本不相交。我需要列举第一个矩形中不在第二个矩形内的点,以及第二个矩形中不在第一个矩形内的点

另外,我需要做得比O(h1*w1+h2*w2)好得多,最好的是O(结果点数)

矩形可以部分相交、完全相交或根本不相交

让我们调查每个场景中的问题:

1。当它们不相交时: 您需要枚举两个矩形的所有点

2。当它们完全相交时: 在这个场景中,您可以简单地迭代较大矩形的所有点,并检查它们是否在交点内。但是为了改进它,只需迭代结果,您可以将其划分为8个不同的分区:

现在可以枚举每个分区的所有点

3。当它们部分相交时: 这可以看作是前一个分区的特殊情况,其中8个分区中的某些分区无效:

结论: 在以下伪代码中,每个矩形由一个4元素数组表示,如:
[左上右下]

procedure isValid(R)
    return R(1)<=R(3) & R(2)<=(R4)
end

procedure enumerateRectangle(R)
    if isValid(R)
        for i = R(1) to R(3)
            for j = R(2) to R(4)
                visit(i, j)
end

procedure enumerateNonIntersection(R, I)
    enumerateRectangle([R(1),       R(2),       I(1)-1,     I(2)-1])    // top-left
    enumerateRectangle([R(1),       I(2),       I(1)-1,     I(4)])      // left
    enumerateRectangle([R(1),       I(4)+1,     I(1)-1,     R(4)])      // bottom-left

    enumerateRectangle([RI(1),      R(2),       I(3),       I(2)-1])    // top
    enumerateRectangle([RI(1),      I(4)+1,     I(3),       R(4)])      // bottom

    enumerateRectangle([I(3)+1,     R(2),       R(3),       I(2)-1])    // top-right
    enumerateRectangle([I(3)+1,     I(2),       R(3),       I(4)])      // right
    enumerateRectangle([I(3)+1,     I(4)+1,     R(3),       R(4)])      // bottom-right
end

procedure enumerateExclusiveOr(R1, R2)
    I = intersectionOf(R1, R2)
    if isValid(I)
        enumerateNonIntersection(R1, I)
        enumerateNonIntersection(R2, I)
    else
        enumerateRectangle(R1)
        enumerateRectangle(R2)
    end
end
程序有效(R)
返回R(1)
矩形可以部分相交、完全相交或根本不相交

让我们调查每个场景中的问题:

1。当它们不相交时: 您需要枚举两个矩形的所有点

2。当它们完全相交时: 在这个场景中,您可以简单地迭代较大矩形的所有点,并检查它们是否在交点内。但是为了改进它,只需迭代结果,您可以将其划分为8个不同的分区:

现在可以枚举每个分区的所有点

3。当它们部分相交时: 这可以看作是前一个分区的特殊情况,其中8个分区中的某些分区无效:

结论: 在以下伪代码中,每个矩形由一个4元素数组表示,如:
[左上右下]

procedure isValid(R)
    return R(1)<=R(3) & R(2)<=(R4)
end

procedure enumerateRectangle(R)
    if isValid(R)
        for i = R(1) to R(3)
            for j = R(2) to R(4)
                visit(i, j)
end

procedure enumerateNonIntersection(R, I)
    enumerateRectangle([R(1),       R(2),       I(1)-1,     I(2)-1])    // top-left
    enumerateRectangle([R(1),       I(2),       I(1)-1,     I(4)])      // left
    enumerateRectangle([R(1),       I(4)+1,     I(1)-1,     R(4)])      // bottom-left

    enumerateRectangle([RI(1),      R(2),       I(3),       I(2)-1])    // top
    enumerateRectangle([RI(1),      I(4)+1,     I(3),       R(4)])      // bottom

    enumerateRectangle([I(3)+1,     R(2),       R(3),       I(2)-1])    // top-right
    enumerateRectangle([I(3)+1,     I(2),       R(3),       I(4)])      // right
    enumerateRectangle([I(3)+1,     I(4)+1,     R(3),       R(4)])      // bottom-right
end

procedure enumerateExclusiveOr(R1, R2)
    I = intersectionOf(R1, R2)
    if isValid(I)
        enumerateNonIntersection(R1, I)
        enumerateNonIntersection(R2, I)
    else
        enumerateRectangle(R1)
        enumerateRectangle(R2)
    end
end
程序有效(R)
返回R(1)