获取2个矩形的交点

Get points of intersection of 2 Rectangles

如何得到两个矩形的交点。到目前为止我已经得到了这个:

module.exports.boxIntersection = function(box1, box2) {
    var xMin1 = box1.x - box1.width;
    var xMin2 = box2.x - box2.width;
    var xMax1 = box1.x + box1.width;
    var xMax2 = box2.x + box2.width;
    var zMin1 = box1.z - box1.length;
    var zMin2 = box2.z - box2.length;
    var zMax1 = box1.z + box1.length;
    var zMax2 = box2.z + box2.length;
    var xMin = Math.max(xMin1, xMin2);
    var xMax = Math.min(xMax1, xMax2);
    if (xMax > xMin) {
        var zMin = Math.max(zMin1, zMin2);
        var zMax = Math.min(zMax1, zMax2);
        if (zMax > zMin) return [xMin, zMin, xMax, zMax];
    } return null;
};

这只有returns 2个交点。但是我需要像这样 return 编辑所有的交点:

在这种情况下,它应该只有 return 2 分:

我在这里看到这个问题:Get the points of intersection from 2 rectangles

但它只有 return2 分。

编辑: 在矩形与另一边对齐的情况下,应该只 return 真正相交的点,如下所示:

您 link 编辑的答案实际上 "intersects" 矩形作为 多边形 ,作为平面上的多边形点集,并且 returns 结果矩形的左下角和右上角(作为多边形集)。返回的两个点实际上简单地定义了所得矩形的所有 四个 角。所以,不,它没有 "return two points"。居然returns

为了解决您的问题,您必须决定保留这四点中的哪一点以及丢弃哪一点。规则非常简单:您必须只保留那些与原始矩形的相应顶点不重合的点。您可以直接以琐碎而乏味的方式简单地检查它。八张支票(如果我没有遗漏的话)你就完成了。

或者您可以使用稍微更棘手的方法。

假设我们有两个矩形:(x11, y11)-(x12, y12)(x21, y21)-(x22, y22)。矩形被归一化(如 link 中所定义)。我们在计算重叠矩形时仍然使用相同的最小-最大技术,但同时我们也记住了哪个原始矩形提供了极值

int x1 = max(x11, x21);
unsigned flags_x1 = (x1 == x11) | ((x1 == x21) << 1);

int y1 = max(y11, y21);
unsigned flags_y1 = (y1 == y11) | ((y1 == y21) << 1);

int x2 = min(x12, x22);
unsigned flags_x2 = (x2 == x12) | ((x2 == x22) << 1);

int y2 = min(y12, y22);
unsigned flags_y2 = (y2 == y12) | ((y2 == y22) << 1);

现在我们检查这些矩形是否有适当的重叠

if (x1 >= x2 || y1 >= y2)
 /* No overlap. Done */;

但如果存在重叠,我们使用 flags_... 变量仅输出由来自两个 不同 矩形[=17= 的极值形成的那些点]

/* Lower-left */
if ((flags_x1 & flags_y1) == 0)
  /* Output (x1, y1) as intersection point */;

/* Lower-right */
if ((flags_x2 & flags_y1) == 0)
  /* Output (x2, y1) as intersection point */;

/* Upper-left */
if ((flags_x1 & flags_y2) == 0)
  /* Output (x1, y2) as intersection point */;

/* Upper-right */
if ((flags_x2 & flags_y2) == 0)
  /* Output (x2, y2) as intersection point */;

请注意,如果一个矩形完全位于另一个矩形内,则上面的无重叠测试将通过(因为矩形实际上 重叠),但 flags_... 测试将丢弃所有四个顶点。

像往常一样,可能需要(或不需要)额外的努力来正确处理边界情况,例如触摸矩形(内部或外部触摸)。