水波模拟的实现方法2011-06-02在一个波长范围内,任意点的位移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 = static_cast<int>(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 = force * disp / 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[j] = static_cast<int>(sqrt(dist_x*dist_x + dist_y*dist_y) + 0.5) % wave_length;}}}