确保某值在区间内

在地形绘制的时候,把地形中每一个顶点的纹理位置在[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"内存错误

 

 

 

 原图:

 

转载于:https://www.cnblogs.com/Kelvinshere/archive/2013/03/17/2964808.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值