除了我的Rect类:
public class Rect {
public int x;
public int y;
public int w;
public int h;
public Rect(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
...
}
我有一种方法来检查两个Rect是否相交(无双关):
public boolean intersect(Rect r) {
return (((r.x >= this.x) && (r.x < (this.x + this.w))) || ((this.x >= r.x) && (this.x < (r.x + r.w)))) &&
(((r.y >= this.y) && (r.y < (this.y + this.h))) || ((this.y >= r.y) && (this.y < (r.y + r.h))));
}
测试用例:
r1 = (x, y, w, h) = (0, 0, 15, 20) center: (x, y) = (7, 10)
r2 = (x, y, w, h) = (10, 11, 42, 15) center: (x, y) = (31, 18)
r1 Intersect r2: true
这堂课很好。
我想知道的是,是否还有另一种(也许更快)的方式来检查矩形是否相交。我可以以某种方式对其进行优化吗?
我倾向于将矩形存储为min x,min y,max x和max y。然后当发生重叠时
r1.maxX > r2.minX &&
r1.minX < r2.maxX &&
r1.maxY > r2.minY &&
r1.minY < r2.maxY
如果它们重叠,则交点定义为
r3.minX = max(r1.minX, r2.minX);
r3.minY = max(r1.minY, r2.minY);
r3.maxX = min(r1.maxX, r2.maxX);
r3.maxY = min(r1.maxY, r2.maxY);
如果它们具有相同的边界,则应根据您是否认为它们重叠来进行一些注意。我使用了严格的不等式,这意味着重叠的边界不算作重叠。假设您使用的是整数(因此边界的宽度为1),则我假设您确实希望将重叠边界视为重叠。我会做类似的事情:
public class Rect {
public int minX;
public int minY;
public int maxX;
public int maxY;
public Rect() {}
public Rect(int x, int y, int w, int h) {
this.minX = x;
this.minY = y;
this.maxX = x + w -1;
this.maxY = y + h -1;
}
public boolean Intersect(Rect r) {
return this.maxX >= r.minX &&
this.minX <= r.maxX &&
this.maxY >= r.minY &&
this.minY <= r.maxY;
}
public Rect GetIntersection(Rect r) {
Rect i = new Rect();
if (this.Intersect(r)) {
i.minX = Math.max(this.minX, r.minX);
i.minY = Math.max(this.minY, r.minY);
i.maxX = Math.min(this.maxX, r.maxX);
i.maxY = Math.min(this.maxY, r.maxY);
}
return i;
}
public int GetWidth() {
return this.maxX - this.minX + 1;
}
public int GetHeight() {
return this.maxY - this.minY + 1;
}
public void SetPosition(int x, int y) {
int w = this.GetWidth();
int h= this.GetHeight();
this.minX = x;
this.minY = y;
this.maxX = x + w -1;
this.maxY = y + h -1;
}
}
问题内容: 测试2个矩形是否相交的快速方法是什么? 在Internet上进行了搜索,找到了这种单行代码(WOOT!),但我不知道如何用Javascript编写它,它似乎是用C ++的古老形式编写的。 问题答案: 这就是将代码转换为JavaScript的方式。请注意,正如注释所建议的那样,您的代码和本文的代码中都有一个错字。该功能应该并且应该具体起作用。 测试用例:
问题内容: 我有大量的多边形(〜100000),并尝试找到一种聪明的方法来计算与常规网格单元的相交面积。 当前,我正在使用形状(基于它们的角坐标)来创建多边形和网格单元。然后,使用简单的for循环,遍历每个多边形并将其与附近的网格单元进行比较。 只是一个小例子来说明多边形/网格单元。 (顺便说一句:网格单元的尺寸为0.25x0.25,多边形的最大值为1x1) 实际上,对于单个多边形/网格单元组合来
我有大量的多边形(~100000),并尝试找到一种智能方法来计算它们与规则网格单元的相交面积。 目前,我正在使用shapely创建多边形和网格单元(基于它们的角坐标)。然后,我使用一个简单的for循环遍历每个多边形,并将其与附近的网格单元进行比较。 只是一个小例子来说明多边形/网格单元。 (顺便说一下:网格单元的尺寸为0.25x0.25,多边形最大为1x1) 实际上,对于单个多边形/网格单元组合来
我有两个矩形,每个矩形有4个值: 左侧位置< code>X、顶部位置< code>Y、宽度< code>W和高度< code>H: 矩形不旋转,如下所示: 判断两个矩形的交集是否为空的最佳解是什么?
我正在as3中编写一个冲突检测系统。它的目的很简单:我有一些移动的矩形和一些静态的矩形。当一个移动的矩形与另一个矩形碰撞时,我想将源(碰撞)矩形移动到碰撞区域之外,但仍然尽可能靠近(基于源的轨迹)。 在每一帧中,我更新移动矩形的位置,并检查所有矩形之间的接触。 下图代表以下内容: A:方框#1正以45度角向静态矩形(#2)移动。 b:经过几次“刻度”后,我们看到矩形#1移动到矩形#2(静态)的空间
我需要找到从圆和矩形的交点创建的最大弧线。我有了圆心,半径和矩形的坐标,我需要找到与圆心交点的角。 我有一个可以工作的代码,但它是通过迭代圆周上的点来计算解的,我想知道是否有更优雅的方法来使用三角学而不是“蛮力”来计算解。 这是我的代码: