Java 在某些分支上提前停止的递归方法
我使用以下递归方法在高度贴图中创建山:Java 在某些分支上提前停止的递归方法,java,recursion,Java,Recursion,我使用以下递归方法在高度贴图中创建山: private void createMountain(final float[][] heightMapping, final float startHeight) { boolean[][] traversed = new boolean[width][depth]; boolean positive = (startHeight >= 0f); int x = random.nextInt(width); int
private void createMountain(final float[][] heightMapping, final float startHeight) {
boolean[][] traversed = new boolean[width][depth];
boolean positive = (startHeight >= 0f);
int x = random.nextInt(width);
int z = random.nextInt(depth);
recursiveUpdate(heightMapping, traversed, x, z, startHeight, positive);
}
private void recursiveUpdate(final float[][] heightMapping, final boolean[][] traversed, final int x, final int z, final float startHeight, final boolean positive) {
if (x < 0 || x >= width || z < 0 || z >= depth) {
return;
}
if (traversed[x][z]) {
return;
}
if ((positive && startHeight <= 0f) || (!positive && startHeight >= 0f)) {
heightMapping[x][z] = 0f;
return;
}
traversed[x][z] = true;
heightMapping[x][z] = startHeight;
recursiveUpdate(heightMapping, traversed, x - 1, z - 1, calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x - 1, z + 1, calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x + 1, z - 1, calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x + 1, z + 1, calculateNewStartHeight(startHeight, positive), positive);
}
private float calculateNewStartHeight(final float startHeight, final boolean positive) {
float delta = random.nextFloat() * maxHeight / maxDecayFactor;
return (positive) ? startHeight - delta : startHeight + delta;
}
在左边,中间稍上方可以看到4.4
,问题本身似乎很明显,它没有为top/down/left/right元素设置任何值,但是我认为我的递归已经抓住了这个问题
有什么线索吗?您没有计算顶部、底部、左侧和右侧的递归高度。你只是在计算转角。您只需要在递归方法中添加“非角点”,即(x,y)的顶部、底部、左侧和右侧标记
private void recursiveUpdate(final float[][] heightMapping, final boolean[][] traversed,
final int x, final int z, final float startHeight, final boolean positive) {
if (x < 0 || x >= width || z < 0 || z >= depth) {
return;
}
if (traversed[x][z]) {
return;
}
if ((positive && startHeight <= 0f) || (!positive && startHeight >= 0f)) {
heightMapping[x][z] = 0f;
return;
}
traversed[x][z] = true;
heightMapping[x][z] = startHeight;
//This will only calculate the corners of the (x,y point)
recursiveUpdate(heightMapping, traversed, x - 1, z - 1,
calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x - 1, z + 1,
calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x + 1, z - 1,
calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x + 1, z + 1,
calculateNewStartHeight(startHeight, positive), positive);
//Add top, bottom, left and right indicies for (x,y)
//bottom
recursiveUpdate(heightMapping, traversed, x, z - 1,
calculateNewStartHeight(startHeight, positive), positive);
//top
recursiveUpdate(heightMapping, traversed, x, z + 1,
calculateNewStartHeight(startHeight, positive), positive);
//right
recursiveUpdate(heightMapping, traversed, x + 1, z,
calculateNewStartHeight(startHeight, positive), positive);
//left
recursiveUpdate(heightMapping, traversed, x - 1, z,
calculateNewStartHeight(startHeight, positive), positive);
}
private void recursiveUpdate(最终浮点[][]高度映射,最终布尔[]]遍历,
最终整数x,最终整数z,最终浮点起始,最终布尔正){
如果(x<0 | | x>=宽度| | z<0 | | z>=深度){
返回;
}
if(遍历[x][z]){
返回;
}
如果((正和起始光=0f)){
高度映射[x][z]=0f;
返回;
}
遍历[x][z]=真;
高度映射[x][z]=星光;
//这将仅计算(x,y点)的角点
递归更新(高度映射,遍历,x-1,z-1,
计算八分之一(右、正、正);
递归更新(高度映射,遍历,x-1,z+1,
计算八分之一(右、正、正);
递归更新(高度映射,遍历,x+1,z-1,
计算八分之一(右、正、正);
递归更新(高度映射,遍历,x+1,z+1,
计算八分之一(右、正、正);
//为(x,y)添加顶部、底部、左侧和右侧标记
//底部
递归更新(高度映射,遍历,x,z-1,
计算八分之一(右、正、正);
//顶
递归更新(高度映射,遍历,x,z+1,
计算八分之一(右、正、正);
//对
递归更新(高度映射,遍历,x+1,z,
计算八分之一(右、正、正);
//左
递归更新(高度映射,遍历,x-1,z,
计算八分之一(右、正、正);
}
你试过调试它吗?@KubaSpatny是的,代码中没有“bug”,这是我的算法中的一些设计缺陷,我没有抓住。输出应该是什么?您在输出上面的解释看起来像是在输出它应该是什么。@mdewitt我正在用这个高度图在3D程序中投影地形。现在,山上有洞(以0.0 4.4 0.0 1.2
为例,它在0.0
两个位置都有洞,而我希望首先有一些值低于4.4
,其次是4.4
和1.2
之间的值。对,但你说你只想环绕左下、右下、左上、右上。所以你实际上想要所有环绕ing,包括左、左下、左上、上、右上、右下?谢谢,这确实解决了它。甚至通过在上/下/左/右上递归来“优化”它,这实际上是我最初的想法。
private void recursiveUpdate(final float[][] heightMapping, final boolean[][] traversed,
final int x, final int z, final float startHeight, final boolean positive) {
if (x < 0 || x >= width || z < 0 || z >= depth) {
return;
}
if (traversed[x][z]) {
return;
}
if ((positive && startHeight <= 0f) || (!positive && startHeight >= 0f)) {
heightMapping[x][z] = 0f;
return;
}
traversed[x][z] = true;
heightMapping[x][z] = startHeight;
//This will only calculate the corners of the (x,y point)
recursiveUpdate(heightMapping, traversed, x - 1, z - 1,
calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x - 1, z + 1,
calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x + 1, z - 1,
calculateNewStartHeight(startHeight, positive), positive);
recursiveUpdate(heightMapping, traversed, x + 1, z + 1,
calculateNewStartHeight(startHeight, positive), positive);
//Add top, bottom, left and right indicies for (x,y)
//bottom
recursiveUpdate(heightMapping, traversed, x, z - 1,
calculateNewStartHeight(startHeight, positive), positive);
//top
recursiveUpdate(heightMapping, traversed, x, z + 1,
calculateNewStartHeight(startHeight, positive), positive);
//right
recursiveUpdate(heightMapping, traversed, x + 1, z,
calculateNewStartHeight(startHeight, positive), positive);
//left
recursiveUpdate(heightMapping, traversed, x - 1, z,
calculateNewStartHeight(startHeight, positive), positive);
}