【问题标题】:Splitting a height-map into quadrants将高度图分割成象限
【发布时间】:2014-10-09 02:42:36
【问题描述】:

我正在使用四叉树系统渲染地形。我需要使用splitHeightmap(float[] originalMap, int quadrant) 方法将高度图分成四个部分,象限是0-3 之间的数字。地图需要分成四等份,因此如果将 0 作为象限传递,则数组的左下四分之一作为新的浮点数组返回。我有一些基本代码,但我不确定如何根据所需的象限对地图进行实际采样:

protected float[] splitHeightMap(float[] heightMap, TerrainQuadrant quadrant) {
    float[] newHeightMap = new float[size >> 1];
    int newSize = size >> 1;

    for (int i = 0; i < newSize; i++)
        for (int j = 0; j < newSize; j++)
            newHeightMap[i * newSize + j] = sampleHeightAt(heightMap, i, j);


    return newHeightMap;
}

protected float sampleHeightAt(float[] heightMap, int x, int z) {
    return heightMap[z + x * size];
}

编辑:我已经写了我认为应该工作的内容,但是我得到了索引 65792 的 ArrayIndexOutOfBoundsException(原始高度图为 512x512):

    protected float[] splitHeightMap(float[] heightMap, TerrainQuadrant quadrant) {
    float[] newHeightMap = new float[(size >> 1) * (size >> 1)];
    int newSize = size >> 1;

    int xOffset = 0, zOffset = 0;
    int xCount = 0, yCount = 0;

    switch (quadrant) {
        case BottomRight:
            xOffset = newSize;
            break;
        case TopLeft:
            zOffset = newSize; 
            break;
        case TopRight:
            xOffset = newSize;
            zOffset = newSize;
            break;
        default:
            break;
    }

    for (int x = xOffset; x < xOffset + newSize; x++)
        for (int z = zOffset; z < zOffset + newSize; z++) {
            newHeightMap[xCount + yCount * newSize] = heightMap[z + x * size];  // should this be 'z + x * size' or 'x + z * size'?

            xCount++;
            yCount++;
        }

    return newHeightMap;
}

【问题讨论】:

    标签: java arrays quadtree heightmap


    【解决方案1】:

    如果我理解正确,那么您必须使用二维数组。使用这种类型的数组,很容易获取数组的任何区域。

    您的 heightMap 现在将变为 float[][] 类型,因此您必须更正您的代码,并在其中填充此数组。

    我已经为你实现了一个例子,并使用了 4x4 数组:

    | 2 2 3 3 |
    | 2 2 3 3 | 
    | 0 0 1 1 | 
    | 0 0 1 1 |
    

    据我了解,您希望获取全“0”、全“1”、全“2”和全“3”等区域。

        public static void main ( String[] args )
        {
            //setting up initial array 'heightMap' (you can name it like you want)
            float[][] f = { { 2, 2, 3, 3 }, { 2, 2, 3, 3 }, { 0, 0, 1, 1 }, { 0, 0, 1, 1 } };
    
            float[][] f2 = splitHeightMap ( f, TerrainQuadrant.BotttomRight );
            for ( float[] floats : f2 )
            {
                System.out.println ( Arrays.toString ( floats ) );
            }
        }
    
        protected static float[][] splitHeightMap ( float[][] heightMap, TerrainQuadrant quadrant )
        {
            //this gives you half of the 'heightMap' length
            int newSize = heightMap.length >> 1;
            float[][] newHeightMap = new float[ newSize ][ newSize ];
    
            //its your offsets, indicating from what place to start iteration
            int xOffset = 0;
            int yOffset = newSize;
    
            //its max values to reach while iterating
            int xRestriction = newSize;
            int yRestriction = heightMap.length;
    
            //setting up params according to 'quadrant'
            switch ( quadrant )
            {
                case BottomRight:
                    xOffset = newSize;
                    yOffset = newSize;
    
                    xRestriction = heightMap.length;
                    break;
                case TopLeft:
                    yOffset = 0;
    
                    yRestriction = newSize;
                    break;
                case TopRight:
                    yOffset = 0;
                    xOffset = newSize;
    
                    xRestriction = heightMap.length;
                    yRestriction = newSize;
                    break;
                default:
                    break;
            }
    
            //counters not to reach new array bounds
            int xCount = 0, yCount = 0;
            for ( int y = yOffset; y < yRestriction; y++ )
            {
                //taking row at 'y' position
                float[] row = heightMap[ y ];
                for ( int x = xOffset; x < xRestriction; x++ )
                {
                    //taking value from 'y' row at 'x' position.
                    float value = row[ x ];
    
                    //set fetched value to new map.
                    newHeightMap[ yCount ][ xCount ] = value;
    
                    //increase x position, but do not touch row
                    xCount++;
                }
    
                //new row - new 'x' position
                xCount = 0;
                yCount++;
            }
            return newHeightMap;
        }
    

    这个实现告诉你:

    | 1 1 |
    | 1 1 |
    

    要改变它 - 改变 main 方法。

    【讨论】:

    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多