如图
我要如何判断这两个范围有相交
我要如何判断这两个范围有相交
AABB(不同Mapping下也能能是Box,AxisAlignedBB等名称)中有intersects方法
每个矩形由横纵两个范围组成
当两个矩形的两个范围都有交集则两矩形相交
当两个矩形的两个范围都有交集则两矩形相交
美味的曲奇 发表于 2022-5-22 09:20
每个矩形由横纵两个范围组成
当两个矩形的两个范围都有交集则两矩形相交 ...
可以说具体点吗
 本帖最后由 美味的曲奇 于 2022-5-22 13:35 编辑 
大概是这么个逻辑,不一定是最好的实现
假设在下面的情景
逻辑就是把每个矩形都抽象为 x轴和y轴 的范围
比如一个(1,2)(5,-1)的矩形
抽象理解为 x(1,5),y(2,-1)的交集
如果两个矩形的对应范围都相交,那么两个矩形就相交
GhostSkyV9 发表于 2022-5-22 13:02
可以说具体点吗
大概是这么个逻辑,不一定是最好的实现
假设在下面的情景
逻辑就是把每个矩形都抽象为 x轴和y轴 的范围
比如一个(1,2)(5,-1)的矩形
抽象理解为 x(1,5),y(2,-1)的交集
如果两个矩形的对应范围都相交,那么两个矩形就相交
美味的曲奇 发表于 2022-5-22 13:31
大概是这么个逻辑,不一定是最好的实现
假设在下面的情景
我有个想法不知道可不可行。
就是,遍历一个矩形的所有坐标,然后判断它每个坐标是否在另外一个矩形的范围内
GhostSkyV9 发表于 2022-5-22 15:33
我有个想法不知道可不可行。
就是,遍历一个矩形的所有坐标,然后判断它每个坐标是否在另外一个矩形的范 ...
你这就小题大做了吧
洞穴夜莺 发表于 2022-5-22 15:46
你这就小题大做了吧
请问有更好的办法嘛
GhostSkyV9 发表于 2022-5-22 15:33
我有个想法不知道可不可行。
就是,遍历一个矩形的所有坐标,然后判断它每个坐标是否在另外一个矩形的范 ...
那么取点的密度是多少呢
无论多秘笈,若矩形的一条边小于密度就有漏掉的风险
 本帖最后由 洞穴夜莺 于 2022-5-22 16:15 编辑 
最简单的做法,如沙发所说(由于你未说明所使用的Mod API,本例中使用Yarn反混淆表说明,其他环境反混淆类名不同,自己去找)net.minecraft.util.math.Box中有intersects方法,用于判断是否碰撞
例复制代码
如果你不是在Minecraft编程,那么参考上述方法实现,自己写一个类似的
GhostSkyV9 发表于 2022-5-22 15:53
请问有更好的办法嘛
最简单的做法,如沙发所说(由于你未说明所使用的Mod API,本例中使用Yarn反混淆表说明,其他环境反混淆类名不同,自己去找)net.minecraft.util.math.Box中有intersects方法,用于判断是否碰撞
例
- // 假定第一个区域a对角坐标为(x1a, y1a, z1a)与(x2a,y2a,z2a)
 
- // 第二个区域b对角坐标为(x1b, y1b, z1b)与(x2b,y2b,z2b)
 
- boolean intersects = new Box(x1a, y1a, z1a, yx2a,y2a,z2a).intersects(new Box(x1b, y1b, z1b, x2b,y2b,z2b)); // 返回值即为是否有重叠
如果你不是在Minecraft编程,那么参考上述方法实现,自己写一个类似的
 本帖最后由 GhostSkyV9 于 2022-5-22 18:02 编辑 
呃。。我的问题
我所想要的是BukkitAPI的,不是Mod。
不过,这个源码的实现,我能不能直接抄它这个方法的代码拿来用
洞穴夜莺 发表于 2022-5-22 16:11
最简单的做法,如沙发所说(由于你未说明所使用的Mod API,本例中使用Yarn反混淆表说明,其他环境反混淆类 ...
呃。。我的问题
我所想要的是BukkitAPI的,不是Mod。
不过,这个源码的实现,我能不能直接抄它这个方法的代码拿来用
美味的曲奇 发表于 2022-5-22 15:54
那么取点的密度是多少呢
无论多秘笈,若矩形的一条边小于密度就有漏掉的风险
...
那我如果拿四个角的对角坐标,来判断是否在另一个区域内
GhostSkyV9 发表于 2022-5-22 17:59
那我如果拿四个角的对角坐标,来判断是否在另一个区域内
一个矩形四角有一个脚在另一个矩形内则两矩形相交
 本帖最后由 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
则相交
👆三维同理
小学几何,抛砖引玉
可以通过 中心点的距离 和 边长 相比较来判断是否相交。
假设有两个矩形
 
可能不好理解,假设要判断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
则相交
👆三维同理
 本帖最后由 GhostSkyV9 于 2022-5-22 18:29 编辑 
你图上这里的,Ax1,Ay1 这些指的是对角坐标吧?
坐标是存在负数的,如果按这样公式计算,取到的结果会准确嘛
ljyys 发表于 2022-5-22 18:08
小学几何,抛砖引玉
可以通过 中心点的距离 和 边长 相比较来判断是否相交。
你图上这里的,Ax1,Ay1 这些指的是对角坐标吧?
Am(x) - Bm(x) <= Aw/2 + Bw/2
&&
Am(y) - Bm(y) <= Ah/2 + Bh/2
GhostSkyV9 发表于 2022-5-22 18:28
你图上这里的,Ax1,Ay1 这些指的是对角坐标吧?
坐标是存在负数的,如果按这样公式计算,取到的结果会准 ...
取绝对值
计算结果取绝对值,还是计算过程中的数取绝对值
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 编辑 
这是一个极简单的初一几何,所以当然可以抄,总结起来无非以下几点:
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做法
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做法
GhostSkyV9 发表于 2022-5-22 17:49
呃。。我的问题
我所想要的是BukkitAPI的,不是Mod。
不过,这个源码的实现,我能不能直接抄它这个方法的 ...
这个方法是原版的,不是mod独有的。
 
 
