gpt4 book ai didi

javascript - 获取2个矩形的交点

转载 作者:行者123 更新时间:2023-11-30 20:22:38 25 4
gpt4 key购买 nike

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

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;
};

这只会返回 2 个交点。但我需要像这样返回所有交点:

enter image description here

在这种情况下,它应该只返回 2 个点:

enter image description here

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

但它只返回 2 个点。

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

最佳答案

您链接的答案实际上将矩形“相交”为多边形,作为平面上的多边形点集,并返回结果矩形的左下角和右上角(作为多边形集合)。返回的两个点实际上简单地定义了结果矩形的所有四个 Angular 。所以,不,它不会“返回两点”。它实际上返回了 4 个点。

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

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

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

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_... 变量来仅输出由来自两个不同 矩形的极值形成的那些点

/* 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_... 测试将丢弃所有四个顶点。

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

关于javascript - 获取2个矩形的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51296445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com