LanAnY
如图
我要如何判断这两个范围有相交

lovexyn0827
AABB(不同Mapping下也能能是Box,AxisAlignedBB等名称)中有intersects方法

美味的曲奇
每个矩形由横纵两个范围组成
当两个矩形的两个范围都有交集则两矩形相交

LanAnY
美味的曲奇 发表于 2022-5-22 09:20
每个矩形由横纵两个范围组成
当两个矩形的两个范围都有交集则两矩形相交 ...

可以说具体点吗

美味的曲奇
本帖最后由 美味的曲奇 于 2022-5-22 13:35 编辑

大概是这么个逻辑,不一定是最好的实现
假设在下面的情景

逻辑就是把每个矩形都抽象为 x轴和y轴 的范围
比如一个(1,2)(5,-1)的矩形
抽象理解为 x(1,5),y(2,-1)的交集
如果两个矩形的对应范围都相交,那么两个矩形就相交

LanAnY
美味的曲奇 发表于 2022-5-22 13:31
大概是这么个逻辑,不一定是最好的实现
假设在下面的情景


我有个想法不知道可不可行。
就是,遍历一个矩形的所有坐标,然后判断它每个坐标是否在另外一个矩形的范围内

洞穴夜莺
GhostSkyV9 发表于 2022-5-22 15:33
我有个想法不知道可不可行。
就是,遍历一个矩形的所有坐标,然后判断它每个坐标是否在另外一个矩形的范 ...

你这就小题大做了吧

LanAnY
洞穴夜莺 发表于 2022-5-22 15:46
你这就小题大做了吧

请问有更好的办法嘛

美味的曲奇
GhostSkyV9 发表于 2022-5-22 15:33
我有个想法不知道可不可行。
就是,遍历一个矩形的所有坐标,然后判断它每个坐标是否在另外一个矩形的范 ...

那么取点的密度是多少呢
无论多秘笈,若矩形的一条边小于密度就有漏掉的风险

洞穴夜莺
本帖最后由 洞穴夜莺 于 2022-5-22 16:15 编辑
GhostSkyV9 发表于 2022-5-22 15:53
请问有更好的办法嘛

最简单的做法,如沙发所说(由于你未说明所使用的Mod API,本例中使用Yarn反混淆表说明,其他环境反混淆类名不同,自己去找)net.minecraft.util.math.Box中有intersects方法,用于判断是否碰撞
  1. // 假定第一个区域a对角坐标为(x1a, y1a, z1a)与(x2a,y2a,z2a)
  2. // 第二个区域b对角坐标为(x1b, y1b, z1b)与(x2b,y2b,z2b)
  3. boolean intersects = new Box(x1a, y1a, z1a, yx2a,y2a,z2a).intersects(new Box(x1b, y1b, z1b, x2b,y2b,z2b)); // 返回值即为是否有重叠
复制代码


如果你不是在Minecraft编程,那么参考上述方法实现,自己写一个类似的




LanAnY
本帖最后由 GhostSkyV9 于 2022-5-22 18:02 编辑
洞穴夜莺 发表于 2022-5-22 16:11
最简单的做法,如沙发所说(由于你未说明所使用的Mod API,本例中使用Yarn反混淆表说明,其他环境反混淆类 ...

呃。。我的问题
我所想要的是BukkitAPI的,不是Mod。
不过,这个源码的实现,我能不能直接抄它这个方法的代码拿来用

LanAnY
美味的曲奇 发表于 2022-5-22 15:54
那么取点的密度是多少呢
无论多秘笈,若矩形的一条边小于密度就有漏掉的风险
...

那我如果拿四个角的对角坐标,来判断是否在另一个区域内

美味的曲奇
GhostSkyV9 发表于 2022-5-22 17:59
那我如果拿四个角的对角坐标,来判断是否在另一个区域内

一个矩形四角有一个脚在另一个矩形内则两矩形相交

ljyys
本帖最后由 ljyys 于 2022-5-22 18:26 编辑

小学几何,抛砖引玉

可以通过 中心点的距离 和 边长 相比较来判断是否相交。

假设有两个矩形


可能不好理解,假设要判断AB是否有重合的部分

👆如图

以下取绝对值
A的宽度: Aw = Ax1-Ax2
A的高度: Ah = Ay1-Ay2
A的中心点(Am):
x: Ax1+(Aw/2)
y: Ay1-(Ah/2)
👆B同上


只要满足
Am(x) - Bm(x) <= Aw/2 + Bw/2
&&
Am(y) - Bm(y) <= Ah/2 + Bh/2


则相交
👆三维同理

LanAnY
本帖最后由 GhostSkyV9 于 2022-5-22 18:29 编辑
ljyys 发表于 2022-5-22 18:08
小学几何,抛砖引玉

可以通过 中心点的距离 和 边长 相比较来判断是否相交。

你图上这里的,Ax1,Ay1  这些指的是对角坐标吧?
Am(x) - Bm(x) <= Aw/2 + Bw/2
&&
Am(y) - Bm(y) <= Ah/2 + Bh/2
坐标是存在负数的,如果按这样公式计算,取到的结果会准确嘛

ljyys
GhostSkyV9 发表于 2022-5-22 18:28
你图上这里的,Ax1,Ay1  这些指的是对角坐标吧?
坐标是存在负数的,如果按这样公式计算,取到的结果会准 ...

取绝对值

LanAnY

计算结果取绝对值,还是计算过程中的数取绝对值

ljyys
GhostSkyV9 发表于 2022-5-22 18:31
计算结果取绝对值,还是计算过程中的数取绝对值

不妨代入验算以下

假设 A(-100,100)(0,-100)  B(-20,50)(100,-50)

Ax1 = -100, Ay1 = 100
Ax2 = 0, Ay2 = -100
Bx1 = -20, By1 = 50
Bx2 = 100 , By2 = -50

Aw = |-100| + |0| = 100
Ah = |100| + |-100| = 200
Bw = |-20| + |100| = 120
Bh = |50| + |-50| = 100

Am(x) = Ax1 + Aw/2 : -100 + (100/2) = -50
Am(y) = Ay1 - Ah/2 : 100 - (200/2) = 0
Am(-50,0)

Bm(x) = Bx1 +Bw/2 : -20 + (120/2) = 40
Bm(y) = By1 - Bh/2 : 50 - (100/2) = 0
Bm(40,0)

AmBm(x) = Am(x) - Bm(x) : |-50 - 40| = 90
AwBw = Aw/2 + Bw/2 : (100/2) + (120/2) = 110
AmBm(y) = Am(y) - Bm(y) = 0 - 0 = 0
AhBh = Ah/2 + Bh/2 = (200/2) + (100/2) = 150

AmBm(x) <= AwBw :
90 <= 110

AmBm(y) <= AhBh :
0 <= 150

则相交

洞穴夜莺
本帖最后由 洞穴夜莺 于 2022-5-22 20:04 编辑
GhostSkyV9 发表于 2022-5-22 17:49
呃。。我的问题
我所想要的是BukkitAPI的,不是Mod。
不过,这个源码的实现,我能不能直接抄它这个方法的 ...

这是一个极简单的初一几何,所以当然可以抄,总结起来无非以下几点:
1,若要一条数轴上的线段AB(A在B左侧,即XA<XB)与CD(C在D左侧X[subC[/sub]<XD)有公共区域,那么A和C当中靠右的那个一定在B和D中靠左的那一个的左边,并且公共区域为A和C当中靠右的那个一定在B和D中靠左的那一个之间的线段。
图解:(在手机上随手画的,凑合着看)

上述结论坐标化就是
max(XA, XC) < min(XB, XD) ⇔ 线段AB、CD有公共区间
化简消去min、max得上述Minecraft中方法所使用的式子中的一个坐标部分(这里展开过程



2,在高维的情况下,当且仅当在每条坐标轴上投影线段都有公共区域,两个矩形(或长方体)才有公共区域
图解:(在手机上随手画的,凑合着看)

把三条轴上的坐标都按上述(1)的做法做一遍,然后中间用“且”连起来,即为完整的Minecarft做法

Ph-苯
GhostSkyV9 发表于 2022-5-22 17:49
呃。。我的问题
我所想要的是BukkitAPI的,不是Mod。
不过,这个源码的实现,我能不能直接抄它这个方法的 ...

这个方法是原版的,不是mod独有的。