确保某值在区间内

在地形绘制的时候,把地形中每一个顶点的纹理位置在[0,64]的区间内递增,使得场景的纹理有移动的效果。

想起以前看过的一点小技巧,利用%操作符可以让值在固定区间内:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
    int a = -3,b = 7;    //  [-3,7]
    int i =1;
    srand((unsigned)time(NULL));
    while(i<=100){
        printf("%d",rand()%(b-a + 1)+a);
        i%10==0?printf("\n"):printf(",");
         i++;
    }             
    //printf("%d\n",(-2)%13);  // (-2)%13 == -2
    getchar();
    return 0;
}    

上面的rand ()随机函数就是某个值的递变,例如 i++;

              int k = _translation;
	
	              int i = 0;
	                for(int z = startZ; z >= endZ; z -= _cellSpacing)
	                {
	            	int j = 0;
	                	for(int x = startX; x <= endX; x += _cellSpacing)
                { int index = i * _numVertsPerRow + j;

		          v[index] = TerrainVertex(
			      (float)x,
			      (float)_heightmap[index],
			      (float)z,
			      (float)j * uCoordIncrementSize,
			      (float)k * vCoordIncrementSize);    ////////////not i but k
			      j++; 
		      }
		      i++; 
                    k = (k++)%64;
	          }

  

   上面的_translation是下面的rollingDecrease控制递增:

void Terrain::rollingDecr(){
	computeVertices();
	_translation = (_translation++)%64;
}

  纹理滚动:

 

 

 

 

还有一种确保某个值在固定区间的计数方法:

int i;    //不需要在i输入的时候控制i值的范围

i = max( 0, min( 100 , i ) );    //[0,100]
    

  

处理完键盘的消息后,加上下面的函数,

使得Camera的x与z值不超出 _lefttop,_rightdown两点位置的X和Z值

void Camera::postionAdjust(){
	_pos.x = max(_lefttop.x, min(_rightdown.x,_pos.x));		
	//_pos.y = max(_lefttop.y, min(_rightdown.y,_pos.y));
	_pos.z = max(_lefttop.z, min(_rightdown.z,_pos.z));
}

 然后接下来地形根据Camera的x和z值来获取高度数据,此时x,z值不会超出地形之外,

索引index  = i * numVertexsPerRow + j;的计算不会是数组下表超出范围,产生例如:"vector subscript out of range"内存错误

 

 

 

 原图:

 

posted @ 2013-03-17 19:18  KelvinDesus  阅读(209)  评论(0编辑  收藏  举报