⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ripple.c

📁 在linux framebuffer上显示模拟的动态水波效果
💻 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 + -