获取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_...
测试将丢弃所有四个顶点。
像往常一样,可能需要(或不需要)额外的努力来正确处理边界情况,例如触摸矩形(内部或外部触摸)。
如何得到两个矩形的交点。到目前为止我已经得到了这个:
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_...
测试将丢弃所有四个顶点。
像往常一样,可能需要(或不需要)额外的努力来正确处理边界情况,例如触摸矩形(内部或外部触摸)。