⠀蛋⠀
本帖最后由 mangiare 于 2021-7-26 11:29 编辑



如图,它是一个平面
这个平面有可能有
X Y 轴的差异
Z Y 轴的差异
两者只能存在其一

我想要填充这个区域的方块,一开始想到的解决办法是:

1. 获取两个 Location
2. 判断是 XY的差异还是 ZY的差异
3. 获取与点一同X的Location,然后以点一同X的Location为起点,点二为终点搞一个向量
4. 按照这个向量填充,填充完之后,向上移动一个Y轴继续步骤3,直到与点二同Y为止

有无更好的办法?

结冰的离季
平面(厚度为1的立方体)只是立方体的特殊情况,遍历立方体总会吧
比如有2个坐标 X(1,1,1) Y(5,5,5)
遍历2个坐标形成的立方体空间就是3坐标的for循环,每个都从1到5。
当其中,某个for循环的区间长度为1时(步长也是1),那他就是“平面”了
这是最简单直白的算法

Pistol_Pangan
本帖最后由 Pistol_Pangan 于 2021-7-26 10:28 编辑

这种平面可以视为一个厚度(厚度这个词不咋贴切,见谅)为1的特殊立方体
这种特殊立方体的构造方法与寻常立方体没有区别
迭代两个点的x、y、z三个坐标即可这种解法相对暴力而低效,等个更优解
参考代码如下

public void formCube(Location a, Location b, Material m){
    int startX = a.getX()<b.getX()?(int)a.getX():(int)b.getX();
    int endX = a.getX()>b.getX()?(int)a.getX():(int)b.getX();
    int startY = a.getY()<b.getY()?(int)a.getY():(int)b.getY();
    int endY = a.getY()>b.getY()?(int)a.getY():(int)b.getY();
    int startZ = a.getZ()<b.getZ()?(int)a.getZ():(int)b.getZ();
    int endZ = a.getZ()>b.getZ()?(int)a.getZ():(int)b.getZ();
    for(int x = startX;x<=endX;x++){
        for(int y = startY;y<=endY;y++){
            for(int z = startZ;z<=endZ;z++){
                Location block = new Location(a.getWorld(),x,y,z);
                block.getBlock().setType(m);
            }
        }
    }
}


⠀蛋⠀
结冰的离季 发表于 2021-7-26 01:29
平面(厚度为1的立方体)只是立方体的特殊情况,遍历立方体总会吧
比如有2个坐标 X(1,1,1) Y(5,5,5)
遍历2 ...

有无更好的算法,
我的算法是:
假设我所设置的区域是 X Y 轴有差异
然后获取同Y不同X的Location,之后获取向量,然后遍历一遍,再向Y轴较高的Location方向移动一个单位,之后在执行这个操作。
估计效率有点低(?

结冰的离季
本帖最后由 结冰的离季 于 2021-7-26 11:16 编辑
mangiare 发表于 2021-7-26 11:02
有无更好的算法,
我的算法是:
假设我所设置的区域是 X Y 轴有差异

你觉得向量加减的效率高还是int加减的效率高,
就遍历次数相同的情况下。
没必要把简单问题搞复杂怕卡顿可以设置异步进程,或者限制执行次数的多次任务

⠀蛋⠀
结冰的离季 发表于 2021-7-26 11:14
你觉得向量加减的效率高还是int加减的效率高,
就遍历次数相同的情况下。
没必要把简单问题搞复杂怕卡顿可 ...

谢谢!
我知道了,还是暴力遍历好,反正也就使用那么几次

第一页 上一页 下一页 最后一页