Java岛屿边界高亮方法中负数坐标取模运算异常求助
解决负坐标下岛屿边界高亮的问题
看起来你的问题根源有两个:负坐标的区块起始计算错误,以及错误的跳过负坐标区域处理的判断。让我一步步给你拆解和修正:
问题分析
坐标计算逻辑错误
Java的取模运算%结果符号和被除数一致,比如-5 % 10 = -5。你原来的代码sx -= sx % islandSize在处理负坐标时,会把本该是负的区块起始点变成0:- 举个例子:如果
loc.getBlockX() = -3,islandSize = 10 sx % islandSize = -3 % 10 = -3sx = -3 - (-3) = 0
但实际上这个坐标属于-10到-1的岛屿区块,正确的起始点应该是-10,而不是0。
- 举个例子:如果
不必要的负坐标拦截
你代码里的if ((sx < 0) || (sz < 0)) { return; }会直接跳过负坐标区域的岛屿处理,但这正是你需要解决的场景,这个判断完全是多余的(甚至是错误的)。
修正后的代码
用Math.floorDiv()来处理坐标取整,它会向负无穷方向取整,完美适配正负坐标的区块计算,同时移除错误的拦截判断:
private static void highlightIslandBorders(Location loc) { World world = loc.getWorld(); // 用floorDiv正确计算正负坐标的区块起始点 int sx = Math.floorDiv(loc.getBlockX(), islandSize) * islandSize; int sz = Math.floorDiv(loc.getBlockZ(), islandSize) * islandSize; int ex = sx + islandSize - 1; int ez = sz + islandSize - 1; int y = loc.getBlockY() - 1; Material cornerMat = Material.GLOWSTONE; world.getBlockAt(sx, y, sz).setType(cornerMat); world.getBlockAt(ex, y, sz).setType(cornerMat); world.getBlockAt(sx, y, ez).setType(cornerMat); world.getBlockAt(ex, y, ez).setType(cornerMat); }
为什么这样有效?
Math.floorDiv(a, b)会返回小于等于a/b的最大整数:- 正数场景:
floorDiv(3,10)=0→0*10=0(和原来的正确结果一致) - 负数场景:
floorDiv(-3,10)=-1→-1*10=-10(得到正确的负区块起始点)
- 正数场景:
- 移除了负坐标拦截后,代码可以正常处理所有区域的岛屿,不管坐标是正还是负。
内容的提问来源于stack exchange,提问作者ColorMyChicken
相关产品推荐
相关产品推荐

