ITPub博客

首页 > 数据库 > 数据库开发技术 > 特效实现用查表法实现对水波的模拟(转)

特效实现用查表法实现对水波的模拟(转)

原创 数据库开发技术 作者:post0 时间:2007-08-12 20:42:31 0 删除 编辑
特效实现用查表法实现对水波的模拟(转)[@more@]

  最近在网上看到一个水波摸拟的贴子。觉得算法可以更快一点,因此自己想出这个查表法模拟的程序,大家看看有没有价值。

  

  原理

  在一个波长范围内,任意点的位移disp = sin(dist)*force +disp_center;

  这里设水波为正弦波,振幅为force,disp_center为振中的位移。

  推广到任何点,disp = sin(dist % wave_length)*force + disp_center;

  这里wave_length 为波长。可以看出,在离散的数据中,任何点的位移是有限的集合。我们先构造出这个集合,在运算过程中,从集合中选取一个位移值就行了,而不用实时计算每个点的位移。

  

  程序设计如下:取波长为12,任何点的位移由一个12个元素的数组。

  int disp[12];

  

  建立一个数组成存贮各点来振中的距离

  int dist[600][800];

  

  下面生成一个水波

  inline void Build_Disp_Matrix()

  {

  for(int i = 0; i < 12; ++i)

  disp[i] = static_cast(sin((double)i*30*DXPI/360)*PRECISION);

  }

  

  void Create_Ripple(int center_x, int center_y, int force, int damp, int wave_length)

  {

  

  for(int i = 0 ; i < wave_length; ++i)

  {

  disp[i] = force * disp[i] / PRECISION;

  }

  

  int dist_x, dist_y;

  for(i = 0; i < SCREEN_HEIGHT; ++i)

  {

  for(int j = 0; j< SCREEN_WIDTH; ++j)

  {

  dist_y = i - center_y;

  dist_x = j - center_x;

  dist[i][j] = static_cast(sqrt(dist_x*dist_x + dist_y*dist_y) + 0.5) % wave_length;

  }

  }

  

  }

  

  渲染水波的代码与原来的代码一样。

  void Render_Ripple(LPDIRECTDRAWSURFACE7 lpdds)

  {

  DDSURFACEDESC2 ddsd = { sizeof(ddsd) };

  

  if(disp_index < 0) disp_index = 12;

  

  --disp_index;

  

  lpdds->Lock(NULL,&ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL);

  short* lpSrcBuffer = static_cast(pBmpBack->GetBitmapBuffer());

  

  int pitch = (ddsd.lPitch) >> 1;

  

  short* lpBuffer = static_cast(ddsd.lpSurface);

  

  int left,right,bottom,top;

  int k = 0,l = 0;

  int index_x,index_y;

  int x_off,y_off;

  int pos1,pos2;

  for(int i = 1; i < SCREEN_HEIGHT - 2; ++i)

  for( int j = 1; j < SCREEN_WIDTH - 2; ++j)

  {

  left = right = bottom = top = disp_index;

  

  left += dist[i][j -1];

  if(left > 12) left -= 12;

  right += dist[i][j+1];

  if(right >12) right -= 12;

  bottom += dist[i+1][j];

  if(bottom > 12) bottom -= 12;

  top += dist[i-1][j];

  if(top >12 ) top -= 12;

  

  x_off = disp[left] - disp[right];

  y_off = disp[top] - disp[bottom];

  

  index_x = j + x_off;

  index_y = i + y_off;

  

  pos1 = i*pitch +j;

  pos2 = index_y * 800 + index_x;

  if(pos2 < 0 || pos2 > 479999) break;

  

  lpBuffer[pos1] = lpSrcBuffer[pos2];

  }

  

  pBmpBack->ReleaseBuffer();

  lpdds->Unlock(NULL);

  

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8225414/viewspace-951970/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    2018
  • 访问量
    8225636