📄 ripple.c
字号:
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <math.h>#include "fb.h"#include "bmp.h"#define SCREEN_WIDTH 320#define SCREEN_HEIGHT 240#define COLORBPP 16#define DXPI 3.14159L#define WAVE_LENGTH 64#define PRECISION 1000int disp_index; //wave center displacement index;int disp[64]; //pixel displacementint dist[240][320]; //distance to centervoid Create_Ripple(int center_x, int center_y, int force, int damp, int wave_length);void Render_Ripple(FRAMEBUFFER *fb);//ripple functioninline void Build_Disp_Matrix(){ int i; for(i = 0; i < 64; ++i) disp[i] = sin(i*30*DXPI/360.0) * PRECISION;}void Create_Ripple(int center_x, int center_y, int force, int damp, int wave_length){ int i, j; int dist_x, dist_y; for(i = 0 ; i < wave_length; ++i) { disp[i] = force * disp[i] / PRECISION; } for(i = 0; i < SCREEN_HEIGHT; ++i) { for(j = 0; j< SCREEN_WIDTH; ++j) { dist_y = i - center_y; dist_x = j - center_x; dist[i][j] = (int)(sqrt(dist_x*dist_x + dist_y*dist_y) + 0.5) % wave_length; } }}void Render_Ripple(FRAMEBUFFER *fb){ int left,right,bottom,top; int index_x,index_y; int x_off,y_off; int pos1,pos2; int i,j; if(disp_index < 0) { Create_Ripple(rand()%320, rand()%240, rand()%15, 0, rand()%10); disp_index = 64; } --disp_index; fb->snap(); for(i = 1; i < SCREEN_HEIGHT - 2; ++i) { for( 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*320 +j; pos2 = index_y * SCREEN_WIDTH + index_x; if(pos2 < 0 || pos2 > SCREEN_WIDTH*SCREEN_HEIGHT) break; fb->fbclone[pos1*2] = fb->fbmem[pos2*2]; fb->fbclone[pos1*2+1] = fb->fbmem[pos2*2+1]; } } fb->refresh(); usleep(8000);}void simulate(){ while(1){ Render_Ripple(fb); }}int drawbmp(int x, int y, char *name){ int sx, sy; unsigned char *buf, *buf2; if (0 == fh_bmp_id(name)) { fprintf(stderr, "file is not a BMP.\n"); return -1; } if (fh_bmp_getsize(name, &sx, &sy) < 0) return -1; if (!(buf = (unsigned char *) malloc(sx * sy * 3))) return -1; if (fh_bmp_load(name, buf, sx, sy) < 0) return -1; if (!(buf2 = (unsigned char *) malloc(sx * sy * 2))) return -1; buf2 = fb->convert(buf, sx * sy, fb->fbinfo.bits_per_pixel); fb->blit(buf2, 0, 0, sx, sy); free(buf); free(buf2); return 0;}int main(int argc, char **argv){ fb_init(); disp_index = 64; drawbmp(0,0, argv[1]); printf("background loaded\n"); Build_Disp_Matrix(); Create_Ripple( 60, 120, 15, 0, 20); printf("start simulation\n\n"); simulate(); fb->release(); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -