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);
}