本帖最后由 mangiare 于 2021-7-26 11:29 编辑
如图,它是一个平面
这个平面有可能有
X Y 轴的差异
Z Y 轴的差异
但 两者只能存在其一
我想要填充这个区域的方块,一开始想到的解决办法是:
1. 获取两个 Location
2. 判断是 XY的差异还是 ZY的差异
3. 获取与点一同X的Location,然后以点一同X的Location为起点,点二为终点搞一个向量
4. 按照这个向量填充,填充完之后,向上移动一个Y轴继续步骤3,直到与点二同Y为止
有无更好的办法?

如图,它是一个平面
这个平面有可能有
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),那他就是“平面”了
这是最简单直白的算法
比如有2个坐标 X(1,1,1) Y(5,5,5)
遍历2个坐标形成的立方体空间就是3坐标的for循环,每个都从1到5。
当其中,某个for循环的区间长度为1时(步长也是1),那他就是“平面”了
这是最简单直白的算法
本帖最后由 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);
}
}
}
}
这种平面可以视为一个厚度(厚度这个词不咋贴切,见谅)为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 编辑
你觉得向量加减的效率高还是int加减的效率高,
就遍历次数相同的情况下。
没必要把简单问题搞复杂怕卡顿可以设置异步进程,或者限制执行次数的多次任务
mangiare 发表于 2021-7-26 11:02
有无更好的算法,
我的算法是:
假设我所设置的区域是 X Y 轴有差异
你觉得向量加减的效率高还是int加减的效率高,
就遍历次数相同的情况下。
没必要把简单问题搞复杂怕卡顿可以设置异步进程,或者限制执行次数的多次任务
结冰的离季 发表于 2021-7-26 11:14
你觉得向量加减的效率高还是int加减的效率高,
就遍历次数相同的情况下。
没必要把简单问题搞复杂怕卡顿可 ...
谢谢!
我知道了,还是暴力遍历好,反正也就使用那么几次