You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java岛屿边界高亮方法中负数坐标取模运算异常求助

解决负坐标下岛屿边界高亮的问题

看起来你的问题根源有两个:负坐标的区块起始计算错误,以及错误的跳过负坐标区域处理的判断。让我一步步给你拆解和修正:

问题分析

  1. 坐标计算逻辑错误
    Java的取模运算%结果符号和被除数一致,比如-5 % 10 = -5。你原来的代码sx -= sx % islandSize在处理负坐标时,会把本该是负的区块起始点变成0:

    • 举个例子:如果loc.getBlockX() = -3,islandSize = 10
    • sx % islandSize = -3 % 10 = -3
    • sx = -3 - (-3) = 0
      但实际上这个坐标属于-10到-1的岛屿区块,正确的起始点应该是-10,而不是0。
  2. 不必要的负坐标拦截
    你代码里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:38:07